GCC警告选项理解

时间:2022-01-01 20:15:04

GCC警告选项对我们及时找出代码中BUG,改善代码品质很有帮助。

听说高手们对每个警告选项都很熟悉,能灵活运用各个警告选项来分门别类地过滤代码中的BUG信息。

1
../SRC/libpjmacl/pjmacl_jaccmd.c:1661: 警告: dereferencing type-punned pointer will break strict-aliasing rules
pjmacl_free((void**)&cmn_ofs_rg_p);
PjmAclComnAndOfsList_t *cmn_ofs_rg_p = NULL;

2
../SRC/libpjmacl/pjmacl_pjm.c:332: 警告: assignment from incompatible pointer type
data_p = (PjmAclPrioAddr_t *)calloc(1, sizeof(PjmAclPrioAddr_t))
uint64_t *data_p;

3
../SRC/libpjmacl/pjmacl_pjm.c:2867: 警告: no previous declaration for ‘pjmacl_get_node_pri_U’     
pjmacl_get_node_pri_U如果为外部函数的话,就应该有个声明加到类似pjsd_prt.h中

4
../SRC/libpjmfep/pjmfep_exec.c:406: 警告: implicit declaration of function ‘pjmfep_evc_queue_init’
../SRC/libpjmfep/pjmfep_exec.c:406: 警告: nested extern declaration of ‘pjmfep_evc_queue_init’

‘pjmfep_evc_queue_init’函数就没有被声明过,而且如果定义文件和引用该函数文件不一样时,引用该函数的文件也没有提前用extern 声明该函数

5
../SRC/pjmd/pjmd_conff.c:1053: 警告: passing argument 1 of ‘set_rscGrpNode_type4’ discards qualifiers from pointer target type
const char *str_p,
set_rscGrpNode_type4(str_p, &rscgrp_p->group_info.nodeinfo);
static int set_rscGrpNode_type4(char* strwk, NodeRscInfo_t* info_p)

6警告选项中关注那些引用未初始化值的语句
7 变量定义时,就最好初始化一下,省得到GCC 警告信息里刷数据
8:警告信息过于严格,有些警告信息就不是BUG了。比如调用函数中实参是&aa,这时这个指针就失去了具体的类型

dereferencing type-punned pointer will break strict-aliasing rules
call_ret = cmdlib_pjmcall(PJMCMD_CMD_PADLINE, &reqbufinf, buf_num, NULL, NULL, NULL, &exitval, &retval, (char **)&padlresp_p, &respsize, &resptype, clst_p);
中的(char **)&padlresp_p 就会产生上述警告信息

而&exitval 会产生
类似passing argument 1 of 'pjmd_pjsutil_rscunit_name2id' discards qualifiers from pointer target type的警告信息提示

dereferencing type-punned pointer will break strict-aliasing rules警告信息跟优化选项-fstrict-aliasing 有关。当开启这个优化选项时,可能优化会导致源代码中部分语句缺失,而造成系统工作不正常,所以就所有的违反strict-aliasing rules原则的地方加了条这个警告信息,提醒读者检查这个地方的代码,看看是不是如果优化后会导致部分语句工作不正常

同时这个信息提示还有另外一个目的,两个不同类型的指针指向同一个地址时,极有可能会导致代码编写出错(比如犯大小端的错误,还有地址字节对齐的错误),所以这个警告信息还有这一层的目的。