GCC命令详解与实践(四) -- 告警选项

告警是指代码本身没有错误,但有风险,或有潜在错误。GCC编译器可以通过告警选项请求或禁止打印告警信息。通常在调试过程中,打印必要的告警信息,这对于程序员排查代码错误,提高软件质量非常有帮助。

在本章中,我们依然以之前文章提到的foo.c文件为例进行讲解。

gcc -fmax-errors

用法:gcc -fmax-errors=n

作用:将代码中的错误提示数量限制为n,当错误数量达到n时,此时GCC会退出,而不是试图继续处理
源代码。默认情况下n=0,即不限制错误提示数量。如果还指定了-wfatal-error,则-wfatal-error优先于此选项。

例如:

gcc -fmax-errors=3 foo.c

举个例子,我们将之前的foo.c文件人为的制造几个确实';'的错误。代码如下:

#include <stdio.h>

int main(void)
{
	int num1 = 0 
	int num2 = 0;
	int sum = 0 
	
	printf("请输入数字1:") 
	scanf("%d",&num1);
	
	printf("请输入数字2:") 
	scanf("%d",&num2);
	
	sum = num1 + num2;
	printf("这两数之和为:%d",sum);
	
	return 0;	
}

在不使用-fmax-error命令,直接使用命令gcc -c foo.c进行编译,以上程序编译结果会出现4个错误:

-fmax-error编译选项1

使用命令gcc -fmax-errors=1 foo.c进行编译,编译结果只提示一个错误:

-fmax-error编译选项2

gcc -w

用法:gcc -w

作用:禁止告警信息

例如:

gcc -w foo.c

gcc -Werror

用法:gcc -Werror

作用:将所有告警变成错误。这个选项使得在编译过程中,即使你代码没有实质性的错误,只是因为有告警而导致编译失败。

例如:

gcc -Werror foo.c

-Wfatal-errors

用法:gcc -Wfatal-errors

作用:此选项会使编译器在出现第一个错误时中止编译。

例如:

gcc -Wfatal-errors foo.c

gcc -Wall

用法:gcc -Wall

作用:使能所有可能的告警信息,这些告警都是常见的告警。

例如:

gcc -Wall foo.c

以下是-Wall使能的所有告警:

-Waddress   
-Warray-bounds=1 (only with -O2)  
-Wbool-compare  
-Wbool-operation  
-Wc++11-compat  -Wc++14-compat  
-Wcatch-value (C++ and Objective-C++ only)  
-Wchar-subscripts  
-Wcomment  
-Wduplicate-decl-specifier (C and Objective-C only) 
-Wenum-compare (in C/ObjC; this is on by default in C++) 
-Wenum-conversion in C/ObjC; 
-Wformat   
-Wformat-overflow  
-Wformat-truncation  
-Wint-in-bool-context  
-Wimplicit (C and Objective-C only) 
-Wimplicit-int (C and Objective-C only) 
-Wimplicit-function-declaration (C and Objective-C only) 
-Winit-self (only for C++) 
-Wlogical-not-parentheses 
-Wmain (only for C/ObjC and unless -ffreestanding)  
-Wmaybe-uninitialized 
-Wmemset-elt-size 
-Wmemset-transposed-args 
-Wmisleading-indentation (only for C/C++) 
-Wmissing-attributes 
-Wmissing-braces (only for C/ObjC) 
-Wmultistatement-macros  
-Wnarrowing (only for C++)  
-Wnonnull  
-Wnonnull-compare  
-Wopenmp-simd 
-Wparentheses  
-Wpessimizing-move (only for C++)  
-Wpointer-sign  
-Wreorder   
-Wrestrict   
-Wreturn-type  
-Wsequence-point  
-Wsign-compare (only in C++)  
-Wsizeof-pointer-div 
-Wsizeof-pointer-memaccess 
-Wstrict-aliasing  
-Wstrict-overflow=1  
-Wswitch  
-Wtautological-compare  
-Wtrigraphs  
-Wuninitialized  
-Wunknown-pragmas  
-Wunused-function  
-Wunused-label     
-Wunused-value     
-Wunused-variable  
-Wvolatile-register-var  
-Wzero-length-bounds

gcc -Wextra

用法:gcc -Wextra

作用:使能一些没被-Wall使能的额外的告警信息。该选项之前是(-W)

例如:

gcc -Wextra foo.c

以下是-Wextra使能的所有告警:

-Wclobbered  
-Wcast-function-type  
-Wdeprecated-copy (C++ only) 
-Wempty-body  
-Wignored-qualifiers 
-Wimplicit-fallthrough=3 
-Wmissing-field-initializers  
-Wmissing-parameter-type (C only)  
-Wold-style-declaration (C only)  
-Woverride-init  
-Wsign-compare (C only) 
-Wstring-compare 
-Wredundant-move (only for C++)  
-Wtype-limits  
-Wuninitialized  
-Wshift-negative-value (in C++03 and in C99 and newer)  
-Wunused-parameter (only with -Wunused or -Wall) 
-Wunused-but-set-parameter (only with -Wunused or -Wall)
下一节