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

时间:2018-02-08 09:58:51

标签: c pointers gcc 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

./realpath /xxx/foo/bar的结果让我感到惊讶。根据{{​​3}},ENOENT失败更有意义。我甚至提到了POSIX并没有找到答案。很长一段时间后,我重新阅读了手册,发现realpath(3)返回char *而不是int。我被gcc感到非常恼火。

问题

所以为什么没有gcc(即使-Wall)警告if (ptr < 0)

2 个答案:

答案 0 :(得分:10)

gcc -Wall未启用GCC的所有警告!有关详细信息,请参阅this question

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

gcc -Wall -Wextra -o realpath realpath.c

根据GCC's documentation

  

这会启用一些-Wall未启用的额外警告标记。

     

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

     
      
  • 将指针与整数零进行比较,使用&lt ;,&lt; =,&gt;或&gt; =。

  •   
  • [...]

  •   

答案 1 :(得分:5)

  

那么为什么gcc(即使是-Wall)报告if (ptr < 0)的警告?

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

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

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