警告不被视为错误-Wall& -

时间:2017-06-26 05:53:54

标签: c gcc compiler-errors compiler-warnings

以下是源文件get.c的内容:

#include <stdio.h>

int main(){
  //int i = 0;
  char b[10];
  gets(b);
  puts(b);
  return 0;
}

当我使用这些命令编译它时

gcc -o get get.c -Wall -Werror

输出

/tmp/ccYEWZvx.o: In function `main':
get.c:(.text+0x10): warning: the `gets' function is dangerous and should not be used.

但是当将代码更改为

#include <stdio.h>

int main(){
  int i = 0; // **this line just be uncommented**
  char b[10];
  gets(b);
  puts(b);
  return 0;
}

使用相同的命令,输出为

cc1: warnings being treated as errors  
get.c: In function 'main':  
get.c:4: error: unused variable 'i'  

那么,为什么这个未使用的变量警告被视为错误,而使用gets()不是?

3 个答案:

答案 0 :(得分:6)

链接器而不是编译器发出gets()警告,因此编译器设置不适用。

只有链接器才能确定符号是使用标准库gets()解析的,而不是其他具有相同名称的实现。

要指示链接器将警告视为错误,您需要将--fatal-warnings选项传递给它。反过来,当没有直接调用链接器时,gcc使用逗号分隔列表中的-Wl选项将选项传递给链接器:

gcc -o get get.c -Wall -Werror -Wl,--fatal-warnings

请注意,GNU linker与编译器分开记录,作为binutils的一部分。链接器选项描述为here

答案 1 :(得分:2)

如果查看第一个示例的输出,则表示“错误”位于目标文件中,这意味着它是由链接器生成的。

第二个错误是由编译器生成的,这意味着没有生成目标文件,因此不会调用链接器。

答案 2 :(得分:-1)

-Werror将所有警告设为错误,仅打印您可以使用的安全警告:-Wformat -Wformat-security 您可以在此处阅读警告选项gcc 7

如果发生错误,编译器会中止编译,而是在有一个或多个警告的情况下继续编译。