以下是源文件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()
不是?
答案 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
如果发生错误,编译器会中止编译,而是在有一个或多个警告的情况下继续编译。