warning: comparison with string literal results in unspecified behaviour

Russell Shaw rjshaw@netspace.net.au
Tue Jan 22 13:25:00 GMT 2008


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<stdio.h>
> #include<stdlib.h>
> 
> #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.



More information about the Gcc-help mailing list