gcc-3.4.4-20050211: maybe a danger behaviour

Denis Zaitsev <[email protected]>
Newsgroups gmane.linux.gcc,gmane.comp.gcc.devel
Message-ID <[email protected]>
Consider the following example:


enum w {
//    c=-1,
    a,
    b
};
whattodo (
    char option
) {
    static
    struct todo {
        enum w what;
        char option;
    } todos[]= {
        {a,'a'},
        {b,'b'},
        {-1}
    };
    struct todo *p= todos;
    do if (
        (option && !option)
    ) break;
    while ((++p)->what >= 0);
    return p->what;
}


Compiling with -O[>0] and -Wall for x86 we have that code for
whattodo:


whattodo:
.L2:
	jmp	.L2


a) Formally, the code is correct.  As p->what can never be < 0
according to its type.

b) GCC _silently_ allows the {-1} initialization for that type, even
with -Wall.

Uncommenting the c= -1 member of enum, or explicit casting p->what to
int solves the problem, of course.  But maybe some warning would be
appropriate in such a situation?  It takes some time for me to
recognize what leads me to that cool .L2: jmp .L2 from seemengly
harmless C code...  Or maybe I don't know some healthy compiler
option?
-
To unsubscribe from this list: send the line "unsubscribe linux-gcc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.