为什么 "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
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 >=.
[...]
(说来话长...可以直接跳到最后的问题...)
我需要使用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 forif (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
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 >=.
[...]