Compiling the following code with gcc 4.4.0 20090506 on x86 with 'gcc
-fdiagnostics-show-option  -fshow-column  -O2 -Wunreachable-code  strcmp.c -o
strcmp':

-------8<-----------8<-------
#include <string.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
        if (argc != 3)
                return 1;

        printf("%d\n", strcmp(argv[1], "foo"));
        printf("%d\n", strcmp(argv[1], argv[2]));

        return 0;
}
-------8<-----------8<-------

produces the warning:

-------8<-----------8<-------
strcmp.c: In function ‘main’:
strcmp.c:9:17: warning: will never be executed [-Wunreachable-code]
-------8<-----------8<-------

using --save-temps you can see that the warning is about some generated code:

-------8<-----------8<-------
strcmp.c: In function ‘main’:
strcmp.c:9:2193: warning: will never be executed [-Wunreachable-code]
-------8<-----------8<-------

here the line of the .i file:

-------8<-----------8<-------
 printf("%d\n", __extension__ ({ size_t __s1_len, __s2_len;
(__builtin_constant_p (argv[1]) && __builtin_constant_p ("foo") && (__s1_len =
strlen (argv[1]), __s2_len = strlen ("foo"), (!((size_t)(const void
*)((argv[1]) + 1) - (size_t)(const void *)(argv[1]) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)(("foo") + 1) - (size_t)(const void *)("foo") == 1) ||
__s2_len >= 4)) ? __builtin_strcmp (argv[1], "foo") : (__builtin_constant_p
(argv[1]) && ((size_t)(const void *)((argv[1]) + 1) - (size_t)(const void
*)(argv[1]) == 1) && (__s1_len = strlen (argv[1]), __s1_len < 4) ?
(__builtin_constant_p ("foo") && ((size_t)(const void *)(("foo") + 1) -
(size_t)(const void *)("foo") == 1) ? __builtin_strcmp (argv[1], "foo") :
(__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *)
(__const char *) ("foo"); register int __result = (((__const unsigned char *)
(__const char *) (argv[1]))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) {
__result = (((__const unsigned char *) (__const char *) (argv[1]))[1] -
__s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned
char *) (__const char *) (argv[1]))[2] - __s2[2]); if (__s1_len > 2 && __result
== 0) __result = (((__const unsigned char *) (__const char *) (argv[1]))[3] -
__s2[3]); } } __result; }))) : (__builtin_constant_p ("foo") && ((size_t)(const
void *)(("foo") + 1) - (size_t)(const void *)("foo") == 1) && (__s2_len =
strlen ("foo"), __s2_len < 4) ? (__builtin_constant_p (argv[1]) &&
((size_t)(const void *)((argv[1]) + 1) - (size_t)(const void *)(argv[1]) == 1)
? __builtin_strcmp (argv[1], "foo") : (__extension__ ({ __const unsigned char
*__s1 = (__const unsigned char *) (__const char *) (argv[1]); register int
__result = __s1[0] - ((__const unsigned char *) (__const char *) ("foo"))[0];
if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned
char *) (__const char *) ("foo"))[1]); if (__s2_len > 1 && __result == 0) {
__result = (__s1[2] - ((__const unsigned char *) (__const char *) ("foo"))[2]);
if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned
char *) (__const char *) ("foo"))[3]); } } __result; }))) : __builtin_strcmp
(argv[1], "foo")))); }));
-------8<-----------8<-------

there aren't any problem with the second call to strcmp without constant
parameters.


-- 
           Summary: -Wunreachable-code warns for strcmp with constant
                    argument
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: s dot contini at oltrelinux dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40412

Reply via email to