(长篇故事......你最后可以直接跳到问题......)
我需要使用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
的结果让我感到惊讶。根据{{3}},ENOENT
失败更有意义。我甚至提到了POSIX并没有找到答案。很长一段时间后,我重新阅读了手册,发现realpath(3)
返回char *
而不是int
。我被gcc
感到非常恼火。
所以为什么没有gcc(即使-Wall
)警告if (ptr < 0)
?
答案 0 :(得分:10)
gcc -Wall
未启用GCC的所有警告!有关详细信息,请参阅this question。
在您的情况下,您需要添加 -Wextra
标记:
gcc -Wall -Wextra -o realpath realpath.c
这会启用一些
-Wall
未启用的额外警告标记。选项
-Wextra
还会针对以下情况打印警告消息:
将指针与整数零进行比较,使用&lt ;,&lt; =,&gt;或&gt; =。
[...]
答案 1 :(得分:5)
那么为什么gcc(即使是
-Wall
)报告if (ptr < 0)
的警告?
-Wall
标志的名称实际上是误导性的,因为它不会启用所有编译器警告。
您需要传递-Wextra
。这样,您将收到以下编译器警告:
warning: ordered comparison of pointer with integer zero [-Wextra]