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