From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23997 invoked by alias); 21 Jan 2008 11:14:48 -0000 Received: (qmail 23989 invoked by uid 22791); 21 Jan 2008 11:14:48 -0000 X-Spam-Check-By: sourceware.org Received: from mail-out1.netspace.net.au (HELO mail.netspace.net.au) (203.10.110.71) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 21 Jan 2008 11:14:28 +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 CA12D4A405 for ; Mon, 21 Jan 2008 22:14:24 +1100 (EST) Message-ID: <47947E92.8060004@netspace.net.au> Date: Tue, 22 Jan 2008 13:25: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> <47947C1E.3000502@netspace.net.au> In-Reply-To: <47947C1E.3000502@netspace.net.au> 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/msg00201.txt.bz2 Russell Shaw wrote: > 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); > } > } > Scrap that example. ob3->magic == MAGIC is two separate strings.