2

(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)?

13
  • Related: How to turn on (literally) ALL of GCC's warnings? Commented Feb 8, 2018 at 10:03
  • 2
    Because 0 is a perfectly legal null pointer constant. You are comparing the result of realpath, which is a pointer, with a null pointer. Not that it is legal, but this violation does not require a diagnostic. Commented Feb 8, 2018 at 10:03
  • Because comparing a pointer to 0 is well defined. It pretty much only makes sense to do that comparison for equality, but it seems the compiler doesn't really have that special case to a special case to warn for that (at least mine doesn't, maybe some newer versions of gcc do). Commented Feb 8, 2018 at 10:06
  • 1
    for me it's ok for if (ptr == 0 /* NULL */) or if (ptr != 0). when does it make sense for > 0 or < 0? i believe gcc has a good reason not to warn this by default. no? Commented Feb 8, 2018 at 10:10
  • 1
    I personally use -std= together with -Wall -Wextra -Wpedantic -Wconversion. Commented Mar 10, 2018 at 2:47

2 Answers 2

11

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 >=.

  • [...]

Sign up to request clarification or add additional context in comments.

Comments

5

So why doesn't gcc (even with -Wall) report a warning for if (ptr < 0)?

The name given to the -Wall flag is actually misleading, since it does not enable all compiler warnings.

You need to pass -Wextra. This way, you will get the following compiler warning:

warning: ordered comparison of pointer with integer zero [-Wextra] 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.