ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

GCC编译警告选项总结

2019-11-28 10:01:11  阅读:330  来源: 互联网

标签:选项 GCC int 编译 test 警告 sections fno


一 前言

GCC有很多的编译选项,警告选项;指定头文件、库路径;优化选项。本文针整理一下GCC的警告选项,主要依据http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html文档,并加上实际的体验。

二 基本概述

-w
 禁止编译警告的打印。这个警告不建议使用。大约2012年底,公司代码进行一次大重构,另外从Codeblock集成开发环境转向Makefile管理,Makefile里面默认使用了-w,因而代码一直没有警告,今年个别项目开发中发现一些代码笔误导致的BUG,而这些问题可以从编译警告中知道。前几个月,领导安排我来fix这些警告。为了自己,为了后人,不建议使用-w选项。


-Werror
 将所有的警告当成错误处理。此选项谨慎建议加上。有的开源库警告很多(大名鼎鼎的ffmpeg也有很多警告呢),一一改掉耗时耗人力,必要性也不大。最后,公司代码加入了一个开源库,里面有很多代码警告,可能领导又安排我来fix了。

 

-Wfatal-errors
 遇到第一个错误就停止,减少查找错误时间。建议加上。很多人遇到错误,没有意识到从第一个开始排查。不管是编译错误,还是程序运行出错,从最开始的错误查起,是个好的做法。

-Wall

 开启“所有”的警告。强烈建议加上,并推荐该选项成为共识。如case语句没有default处理,有符号、无符号处理,未使用变量(特别是函数有大量未使用的数组,占用栈空间,测试发现,开辟一个未使用的8MB的数组,程序有coredump),用%d来打印地址,或%s打印int值,等,都可以发出警告。

-Wextra
 除-Wall外其它的警告。建议加上。

 在GCC编译时,加上必要的警告选项,可以避免很多低级错误引发的问题,我就在实际工程代码中遇到用“==”来赋值,我自己写的代码也出现过把“=”当成判断的。但是,有些错误却不是用GCC选项能解决的。比如一般项目都会自定义调试信息打印函数,但在处理可变参数类型时,往往不注意。

三 实例分析

  C代码:

  

#include <stdio.h>

int main()
{
        int inum = 10; 
        int a_num;
    
        while(inum--)
        {
                printf("inum is:%d \n\t",inum);
        }

        return 0;
}

 Makfile:

   

# compile and lib parameter
CC      := g++ 
LIBS    :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I. 
CFLAGS   := -fno-common -fmessage-length=0 -Wall \
           -fno-exceptions -ffunction-sections \
           -fdata-sections -fomit-frame-pointer

#CFLAGS   += -Werror
# link parameter
#LIB := libfunc.so
LIB := libfunc.a

#link
$(LIB):test.o
    $(CC) $(CFLAGS) -shared -o -fPIC -o $@ $^
#compile
func.o:test.c
    $(CC) -c -fPIC $^ -o $@ 

# clean
clean:
    rm -fr *.o

    编译结果:

➜  gcc git:(master) ✗ make      
g++ -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer   -c -o test.o test.c
test.c: In function ‘int main()’:
test.c:6:13: warning: unused variable ‘a_num’ [-Wunused-variable]
         int a_num;
             ^~~~~
g++ -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -shared -o -fPIC -o libfunc.a test.o

   假如把CFLAGS += -Werror打开,结果如下所示:

g++ -fno-common -fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -Werror   -c -o test.o test.c
test.c: In function ‘int main()’:
test.c:6:13: error: unused variable ‘a_num’ [-Werror=unused-variable]
         int a_num;
             ^~~~~
cc1plus: all warnings being treated as errors
<builtin>: recipe for target 'test.o' failed
make: *** [test.o] Error 1

  

 

标签:选项,GCC,int,编译,test,警告,sections,fno
来源: https://www.cnblogs.com/dylancao/p/11947107.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有