warning: comparison with string literal results in unspecified behaviour

Russell Shaw rjshaw@netspace.net.au
Tue Jan 22 12:48:00 GMT 2008


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);
     }
}



More information about the Gcc-help mailing list