From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10969 invoked by alias); 21 Jan 2008 11:04:20 -0000 Received: (qmail 10958 invoked by uid 22791); 21 Jan 2008 11:04:20 -0000 X-Spam-Check-By: sourceware.org Received: from mail-out5.netspace.net.au (HELO mail.netspace.net.au) (203.10.110.92) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 21 Jan 2008 11:04:00 +0000 Received: from [192.168.0.10] (220-253-35-22.VIC.netspace.net.au [220.253.35.22]) by mail.netspace.net.au (Postfix) with ESMTP id D9740171938 for ; Mon, 21 Jan 2008 22:03:56 +1100 (EST) Message-ID: <47947C1E.3000502@netspace.net.au> Date: Tue, 22 Jan 2008 12:48:00 -0000 From: Russell Shaw User-Agent: Thunderbird 1.5.0.2 (X11/20060501) MIME-Version: 1.0 CC: gcc-help@gcc.gnu.org Subject: Re: warning: comparison with string literal results in unspecified behaviour References: <47934A5D.2080608@netspace.net.au> <47937327.6010105@redhat.com> <4793ED01.50108@netspace.net.au> <4794757E.3020108@redhat.com> In-Reply-To: <4794757E.3020108@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact gcc-help-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-help-owner@gcc.gnu.org X-SW-Source: 2008-01/txt/msg00200.txt.bz2 Andrew Haley wrote: > Russell Shaw wrote: >> Andrew Haley wrote: >>> Russell Shaw wrote: >>>> How do i disable that? My code explicitly compares string pointers. >>> >>> The best way is to intern all your strings. String interning is a >>> fairly common efficient technique and you can look it up in Google. >> >> I've seen that in Xlib code. There's no reason to do it if you're >> not storing strings on a remote host. > > Not necessarily. > >> I store pointers to const strings in various objects and use them >> much like magic numbers, so direct pointer comparisons are the ideal >> thing to do. >> >> This warning never happened on older gcc versions. >> >> Infact, the warning is incorrect for this valid use. >> >> It's just unnecessary nannying. >> >> I've been using it in thousands of lines of code for 5 years. > > OK, this might be a bug in gcc. I just looked at the gcc source > (appended below) and as far as I can see that message is only > generated when there is a real error such as > > if (str == "Hello") > > Do you have a case where conforming code triggers this warning? > > Andrew. > > > /* Warn about comparisons against string literals, with the exception > of testing for equality or inequality of a string literal with > NULL. */ > if (code == EQ_EXPR || code == NE_EXPR) > { > if ((code1 == STRING_CST && !integer_zerop (arg2.value)) > || (code2 == STRING_CST && !integer_zerop (arg1.value))) > warning (OPT_Waddress, "comparison with string literal results in > unspecified behavior"); > } > else if (TREE_CODE_CLASS (code) == tcc_comparison > && (code1 == STRING_CST || code2 == STRING_CST)) > warning (OPT_Waddress, "comparison with string literal results in > unspecified behavior"); Hi, I just found from the gcc list that Wno-address stops the complaints. I couldn't find that option on the gcc-3.4.3 manpage. Here is some code: #include #include #define MAGIC "object" #define TYPE1 "type1" #define TYPE2 "type2" #define OB1(ob) (ob->type == TYPE1) #define OB2(ob) (ob->type == TYPE2) #define IS_OBJ (ob->magic == MAGIC) typedef struct { const char *magic; const char *type; } Object; static Object * object_new(const char *type) { Object *object = calloc(1, sizeof(Object)); object->magic = MAGIC; object->type = type; return object; } int main(int argc, char **argv) { Object *ob1 = object_new(TYPE1); Object *ob2 = object_new(TYPE2); Object *ob3 = ob2; if(ob1->type == ob2->type) { printf("same, %s %s\n", ob1->type, ob2->type); } else { printf("different, %s %s\n", ob1->type, ob2->type); } if(ob2->type == ob3->type) { printf("same, %s %s\n", ob2->type, ob3->type); } else { printf("different, %s %s\n", ob2->type, ob3->type); } if(ob3->magic == MAGIC) { printf("is object, %s\n", ob3->type); } }