EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
对于GCC警告选项的理解+ C A5 z; C! F3 h5 k8 u( M
6 l2 w% z; K# Z3 ]5 h* G8 V* Y
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原则的地方加了条这个警告信息,提醒读者检查这个地方的代码,看看是不是如果优化后会导致部分语句工作不正常 同时这个信息提示还有另外一个目的,两个不同类型的指针指向同一个地址时,极有可能会导致代码编写出错(比如犯大小端的错误,还有地址字节对齐的错误),所以这个警告信息还有这一层的目的。 |