为什么"gcc -Wall"没有警告"if(ptr <0)"?

pyn*_*exj 2 c gcc pointers gcc-warning

(长话故事......你可以直接跳到最后的问题......)

我需要使用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
Run Code Online (Sandbox Code Playgroud)

结果./realpath /xxx/foo/bar让我感到惊讶.根据手册,失败更有意义ENOENT.我甚至提到了POSIX并没有找到答案.经过一段时间后,我重读了手册并找到了realpath(3)退货char *而不是int.我真的很恼火gcc.

那么为什么 gcc(甚至没有-Wall)警告过if (ptr < 0)呢?

Ron*_*eau 10

gcc -Wall没有启用GCC的所有警告! 有关更多信息,请参阅此问题.

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

gcc -Wall -Wextra -o realpath realpath.c
Run Code Online (Sandbox Code Playgroud)

根据海湾合作委员会的文件:

这会启用一些未启用的额外警告标志-Wall.

该选项-Wextra还会针对以下情况打印警告消息:

  • 将指针与整数零与<,<=,>或> =进行比较.

  • [...]


眠りネ*_*ネロク 5

那么为什么gcc(甚至没有-Wall)报告警告if (ptr < 0)

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

你需要通过-Wextra.这样,您将获得以下编译器警告:

warning: ordered comparison of pointer with integer zero [-Wextra]
Run Code Online (Sandbox Code Playgroud)