Search code examples
cpointersgccgcc-warning

Why doesn't "gcc -Wall" warn for "if (ptr < 0)"?


(A long story... you can directly jump to the question at the end...)

I need to use realpath(3) so I wrote a simple example to try it:

$> cat realpath.c
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

int main(int argc, char * argv[])
{
    char pathname[PATH_MAX];

    if (realpath(argv[1], pathname) < 0) {
        perror("realpath");
        return 1;
    }

    printf("%s\n", pathname);

    return 0;
}
$> gcc -Wall -o realpath realpath.c
$> ls /xxx
ls: cannot access '/xxx': No such file or directory
$> ./realpath /xxx/foo/bar
/xxx

The result of ./realpath /xxx/foo/bar surprised me. According to the manual it makes more sense to fail with ENOENT. I even referred to the POSIX and found no answer. After quite some time I reread the manual and found realpath(3) returns char * rather than int. I was really irritated by gcc.

Question

So why doesn't gcc (even with -Wall) warn about if (ptr < 0)?


Solution

  • gcc -Wall does not enable all of GCC's warnings! See this question for more information.

    In your case, you need to add the -Wextra flag:

    gcc -Wall -Wextra -o realpath realpath.c
    

    According to GCC's documentation:

    This enables some extra warning flags that are not enabled by -Wall.

    The option -Wextra also prints warning messages for the following cases:

    • A pointer is compared against integer zero with <, <=, >, or >=.

    • [...]