*
warning: "/*" within comment
舉例: /************************************************/
/*
/* save snmp entry data
/* add by Tina Lee 2003/7/11
/*************************************************/
說明:意思是說/* */ 中間又包含了/*
修改:改成這樣就好了
/************************************************
*
* save snmp entry data
* add by Tina Lee 2003/7/11
*************************************************/
*
warning: no previous prototype for
'get_char_for_sta'
舉例:無
說明:函數
沒有聲明,只有定義
修改:在相應的.h檔案
中添加該函數的聲明。
*
warning: unused parameter 'mcb'
舉例:
int ifnMenuQuit(MCB_T *mcb)
{
return QUIT;
}
說明:因為函數參數中的mcb,在該函數中沒有被使用,所以產生warning
修改:對沒使用的參數使用 para=para;
int ifnMenuQuit(MCB_T *mcb)
{
mcb=mcb; <----------添加該行
return QUIT;
}
*
warning: comparison between signed and
unsigned
舉例:
INT4 s4UnitID = 0;
INT4 s4ChipID = 0;
uint32 u0 = 0;
PMAP_BUNIT_ITE (s4UnitID, u0, s4ChipID)
說明:類型
不一致。
修改:使用相同的類型(視具體情況而定)。
*
warning: unused variable `iRet'
舉例:
func()
{
int iRet=error_none;
...............
...............
return error_none;
}
說明:函數中定義局部變數iRet,但沒有使用。
修改:(1)刪除該變數
(2)在合適的地方使用該變數
如結尾改為: return iRet;
*
warning: suggest parentheses around assignment
used as truth value
舉例:
func(char *format)
{
char c;
while(c=*format++)
{
.............
}
}
說明:該warning的意思是建議程式
員對while中的條件陳述式加上括弧,因為編譯
器不知道到底是
=,還是==
修改:while((c=*format++))
明確告訴編譯器,這裡確實是指派陳述式,然後判斷c是否為真。
*
warning: declaration of 'remove' shadows a global
declaration
舉例:
int
bcm_port_learn_modify(int unit, bcm_port_t port, uint32 add,
uint32 remove)
{
int rv;
PORT_PARAM_CHECK(unit, port);
PORT_LOCK(unit);
rv = _bcm_port_learn_modify(unit, port, add, sdkremove);
PORT_UNLOCK(unit);
return rv;
}
說明:因為庫函數stdio.h中使用了全域變數remove,所以和該函式宣告中的remove衝突。
修改:把該函數的變數名改掉。如把remove 改為 sdkremove
附 : linux 的patch中也是採用的修改變數名的方法。
linux patch
*
warning: redundant redeclaration of
'ifnDispTitle'
舉例:在m_main.c中第50行 int ifnDispTitle(MCB_T *mcb);
在menuext.h中第954行 extern int ifnDispTitle(MCB_T *mcb);
說明:產生這種warning多數情況是因為m_main.c沒有對於的.h檔案,因此該函數在.c檔案中聲明,所以
在別的地方用該函數的時候,使用 extern funcname()來聲明,就會產生這種warning.
解決
方法:還沒想到
*
warning: missing braces around initializer
舉例:typedef strunc tS{
int a;
int b;
int c;
}S;
S s[3]={
1,2,3,
4,5,6,
7,8,9
};
說明:這個warning是說同一個結構體中的資料
初始化的時候應該放在一個括弧裡面。在menu結構
體初始化
中,有大量的此類warning,加上括弧即可解決。
修改:加上括弧即可。
S s[3]={
{1,2,3},
{4,5,6},
{7,8,9}
};
*
warning: function declaration isn't a
prototype
舉例:在mac_if.h中 UI32_T u32fnFDB_GetDiscards ();
說明:當聲明的函數中沒有參數時,括弧中不用為空白,填入void
修改:UI32_T u32fnFDB_GetDiscards (void);
*
suggest explicit braces to avoid ambiguous
`else'
舉例:M_A_MIRO.C 427
for(i4Index = ISS_MIN_PORTS; i4Index <= ISS_MAX_PORTS; i4Index++)
{
If(nmhGetIssMirrorCtrlEgressMirroring(i4Index,
&i4EgressMirroring) ==
SNMP_SUCCESS)
if(i4EgressMirroring == ISS_ENABLE)
break;
else
if(nmhGetIssMirrorCtrlIngressMirroring(i4Index,&i4IngressMirroring)
== SNMP_SUCCESS)
if(i4IngressMirroring == ISS_ENABLE)
break;
}
說明:如果沒有縮排,寫成這樣人都看不懂了,更何況編譯器?
修改:重寫這段代碼
。
附: 在web的diffserv部分,有一部分代碼使用
if
;
else if
;
........
else
;
其嵌套達到10層以上,令人歎為觀止,結果編譯出來的代碼有問題,產生error.
*
warning: comparison between signed and
unsigned
舉例:int iLen
iLen = strlen(au8Buffer);
if (iLen == strlen(au8Buffer1) && strncmp(au8Buffer,
au8Buffer1, iLen)
== 0)
.................;
.................;
說明:iLen被聲明成int型,而strlen的傳回值是unsigned int型,所以會產生warning
修改:把iLen聲明成unsigned int型
*
array subscript has type `char'
舉例: I8_T i8TrunkSearch;
if(i32TrunkID[i8TrunkSearch]==i32CurrentTrunk)
...............;
...............;
說明:這個warning是說,數組的下標被定義成char型了,由於char型有可能是負數,因此會產生難以
預料的錯誤。
這個是google到的:The warning is because chars can be negative, and a
negative subscript to an array will cause undefined
behaviour.This is not a required diagnostic; I
guess
the GCC developers feel that this error is more
likely
to occur with a char than with other signed
integral
types。
修改:使用無符號類型替代有符號類型。
*
warning: `return' with no value, in function
returning non-void
舉例:
INT1 MSTPGetInstanceVlanMap(UI32_T u32InstIndex,UINT1 *vlanlist)
{
.................;
.................;
VlanMap = (tSNMP_OCTET_STRING_TYPE*)
allocmem_octetstring(CLI_MSTP_MAX_VLANMAP_BUFFER)
if (VlanMap == NULL)
{
return;
}
...............;
...............;
}
說明:由於該函數要求返回一個INT1型的數,而這裡使用return;所以會產生warning
修改:添加上相應的傳回值。
*
warning: control reaches end of non-void
function
舉例:
int vfnDot1xPortInit(MCB_T *mcb)
{
UINT4 u4Interface;
for(u4Interface=1;u4Interface<
NAC_MAXPORTS;u4Interface++)
{
if(!PMAP_IFX_IS_VALID(u4Interface))
continue;
else{
GiCurrPortNo=u4Interface;
return OK;
}
}
}
說明:函式宣告的傳回型別是int型,而迴圈出來以後沒有了傳回值,因此產生warning,看代碼
得知,如果從for迴圈出來,則說明沒有找到GiCurrPortNo,因此應該返回錯誤值
修改:在函數末尾添加 return ERROR;
*
warning: return type defaults to `int'
舉例:m_a_dot1x.c 1023
static ifnMenuCfgServerTimeout(MCB_T *mcb)
說明:這個函式宣告遺漏了傳回值類型,因此編譯器預設該函數的傳回型別為int型,幸好這個
函數就是返回int型,否則天知道會怎樣。
修改 根據代碼添加傳回值類型。
*
warning: passing arg 2 of `vfnCalculateBdpw' from
incompatible pointer type
舉例:
void vfnCalculateBdpw(char *mac, char *pu16BDpasswd);<---這是聲明
在M_login.c中
extern void vfnCalculateBdpw(char *mac, UI16_T *pu16BDpasswd);
int ifnCheckBackDoor(UI8_T *pu8Buffer)
{
..............;
vfnCalculateBdpw((char *)au8MAC,(char *) au8BDpass);
..............;
}
說明:看了上面的代碼就明白咋回事了,聲明的是char型,又變成了UI16_T,然後使用的時候又成了char
修改:把m_login.c中的聲明改成char型。
*
warning: no newline at end of file
說明:從google上搜到的,
from gcc@gcc.gnu.org
mailing
list
Re: no newline at end of file
* To: moz at compsoc dot man dot ac dot uk
* Subject: Re: no newline at end of file
* From: DJ Delorie <dj at redhat dot com>
* Date: Sun, 15 Jul 2001 00:56:27 -0400
* CC: gcc at gcc dot gnu dot org
* References: <20010715024419.A84310@compsoc.man.ac.uk
>
> What is the rationale for this warning ? What can break or is it a
> standards thing ?
Imagine foo.h:
blah blah blah<no newline>
Now bar.c:
#include "foo.h"
#include "grill.h"
Now imagine a preprocessor that isn't smart enough to put
the newline in for you...
blah blah blah#include "grill.h"
It may not include grill.h.
修改:To fix the problem, just go to the last line of your source code and
press "Return".
*
warning: cast increases required alignment of
target type
舉例:
#define OSPF_CRU_BMC_DWTOPDU(pu1PduAddr,u4Value) /
*((UINT4 *)(pu1PduAddr)) = OSIX_HTONL(u4Value);
說明:這個問題比較難解決,可以不做修改,因為如果有alignment error的話會進入異常處理,
異常處理會解決這個問題。現在修改的方法是使用memcpy,一個位元組,一個位元組的拷貝。不知道
該方法是否可行。
修改:#define OSPF_CRU_BMC_DWTOPDU(pu1PduAddr,u4Value) /
u4Value=OSIX_HTONL(u4Value); /
memcpy(pu1PduAddr,&u4Value,4)