對于GCC警告選項的理解
GCC警告選項對我們及時找出代碼中BUG,改善代碼品質(zhì)很有幫助。
聽說高手們對每個警告選項都很熟悉,能靈活運用各個警告選項來分門別類地過濾代碼中的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如果為外部函數(shù)的話,就應(yīng)該有個聲明加到類似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’函數(shù)就沒有被聲明過,而且如果定義文件和引用該函數(shù)文件不一樣時,引用該函數(shù)的文件也沒有提前用extern 聲明該函數(shù)
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警告選項中關(guān)注那些引用未初始化值的語句
7 變量定義時,就最好初始化一下,省得到GCC 警告信息里刷數(shù)據(jù)
8:警告信息過于嚴格,有些警告信息就不是BUG了。比如調(diào)用函數(shù)中實參是&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 就會產(chǎn)生上述警告信息
而&exitval 會產(chǎn)生
類似passing argument 1 of 'pjmd_pjsutil_rscunit_name2id' discards qualifiers from pointer target type的警告信息提示
dereferencing type-punned pointer will break strict-aliasing rules警告信息跟優(yōu)化選項-fstrict-aliasing 有關(guān)。當開啟這個優(yōu)化選項時,可能優(yōu)化會導(dǎo)致源代碼中部分語句缺失,而造成系統(tǒng)工作不正常,所以就所有的違反strict-aliasing rules原則的地方加了條這個警告信息,提醒讀者檢查這個地方的代碼,看看是不是如果優(yōu)化后會導(dǎo)致部分語句工作不正常
同時這個信息提示還有另外一個目的,兩個不同類型的指針指向同一個地址時,極有可能會導(dǎo)致代碼編寫出錯(比如犯大小端的錯誤,還有地址字節(jié)對齊的錯誤),所以這個警告信息還有這一層的目的。
編輯:admin 最后修改時間:2019-07-31