为什么 "gcc -Wall" 不针对 "if (ptr < 0)" 发出警告?

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

(说来话长...可以直接跳到最后的问题...)

我需要使用realpath(3)所以我写了一个简单的例子来试试:

$> 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

./realpath /xxx/foo/bar的结果让我很吃惊。根据 manual,使用 ENOENT 失败更有意义。我什至提到了 POSIX 并没有找到答案。一段时间后,我重新阅读手册,发现 realpath(3) returns char * 而不是 int。我真的被gcc激怒了。

问题

那么 为什么 gcc(即使使用 -Wall)不警告 if (ptr < 0)

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

-Wall 标志的名称实际上具有误导性,因为它不会启用 所有 编译器警告。

你需要通过-Wextra。这样,您将收到以下编译器警告:

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

gcc -Wall 并未启用 GCC 的所有警告! 请参阅 this question 了解更多信息。

在您的情况下,您需要添加 -Wextra 标志:

gcc -Wall -Wextra -o realpath realpath.c

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

  • [...]