This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: warning: comparison with string literal results in unspecified behaviour


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.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]