原文:
http://blog.163.com/verilog_007/blog/static/7404420820089942125877/<環(huán)境>Rule1.1(強(qiáng)制):所有的代碼應(yīng)該遵守ISO 9899:1990“Programming Language C”
Rule1.2(強(qiáng)制):只有當(dāng)具備統(tǒng)一接口的目標(biāo)代碼的時候才可以采用多種編譯器和語言
Rule1.4(強(qiáng)制) 檢查編譯器/連接器以確保支持31一個有效字符,支持大小寫敏感
<語言擴(kuò)展>
Rule 2.1(強(qiáng)制):
語言應(yīng)該封裝起來并且隔離:
例如:#define NOP asm(“ NOP”)
Rule 2.2(強(qiáng)制) :源代碼只能采用/*…*/風(fēng)格的注釋
Rule2.3(強(qiáng)制): 字符序列/*不能在注釋中使用
注:C語言不支持注釋的嵌套即使一些編譯器支持這個語言擴(kuò)展
Rule 2.4(建議):代碼段不能注釋掉
注:應(yīng)采用#IF 或者#ifdef來構(gòu)成一個注釋,否則代碼里如果有注釋會改變代碼的作用
<文檔化>
Rule 3.3(建議):編譯器對于整數(shù)除法運(yùn)算的實(shí)施應(yīng)該寫入文檔
例編譯器:-5/3 = -1 余-2 有些編譯器結(jié)果是-2于+1
<字符集>
Rule 4.1(強(qiáng)制):只能使用ISO標(biāo)準(zhǔn)定義的字符集
<標(biāo)識符>
Rule6.5 (強(qiáng)制):在內(nèi)部范圍的標(biāo)識符不能和外部的標(biāo)識符用同樣的名字,因為會隱藏那個標(biāo)識符
例:
Int16_t i:
Void f()
{
int16_t I;
i=3;
}
Rule 5.2(強(qiáng)制): typedef 名稱只能唯一,不能重復(fù)定義
Rule 5.4(強(qiáng)制): 標(biāo)記名應(yīng)該是唯一的標(biāo)識符
Rule 5.7(建議):標(biāo)識符不能重復(fù)使用
<類型>
Rule 6.1(強(qiáng)制):Char類型只能用來存儲使用字符
Rule 6.2(強(qiáng)制):signed和unsigned char 只能用來存儲和使用數(shù)據(jù)值
Rule6.3(建議)對于基本的類型使用Typedef來表示大小和有無符號
例:
Typedef char char_t
Typedef signed int int32_t
<約束>
Rule 7.1(強(qiáng)制):不要用八進(jìn)制數(shù)
注:整型常數(shù)以”0“開始會被認(rèn)為是8進(jìn)制
例:code[1]=109
code[2]=100
code[3]=052
code[4]=071
如果是對總線消息初始化,會有危險
<聲明和定義>
Rule 8.1(強(qiáng)制):函數(shù)都應(yīng)該有原型聲明,且相對函數(shù)定義和調(diào)用可見
Rule8.2 (強(qiáng)制):無論何時一個對象和函數(shù)聲明或者定義,它的類型應(yīng)該明確聲明
Rule 8.5(強(qiáng)制):頭文件中不要定義對象或者函數(shù)
Rule8.3(強(qiáng)制):每個函數(shù)聲明中的參數(shù)的類型應(yīng)該和定義中的類型一致
Rule 8.8(強(qiáng)制):外部變量或者函數(shù)只能聲明在一個文件中
注:一般來講,聲明在頭文件中,然后包含在定義和使用的文件中
Rule 8.12(強(qiáng)制):數(shù)組聲明為外部,應(yīng)該明確聲明大小或者直接初始化確定
例:extern int array2[ ] /* 違反Rule8.8 */
<初始化>
Rule 9.1(強(qiáng)制):所有變量在使用之前都應(yīng)該賦值
<數(shù)學(xué)類型轉(zhuǎn)換(隱式)>
Rule 10.1(強(qiáng)制):整型表達(dá)式不要隱式轉(zhuǎn)換為其他類型:
a)轉(zhuǎn)換到更大的整型
b)表達(dá)式太復(fù)雜
c)表達(dá)式不是常數(shù)是一個函數(shù)
d)表達(dá)式不是一個常數(shù)是一個返回表達(dá)式
Rule 10.2(強(qiáng)制):浮點(diǎn)數(shù)表達(dá)式不要隱式轉(zhuǎn)換為其他類型:
a)轉(zhuǎn)換到更大的浮點(diǎn)數(shù)
b)表達(dá)式太復(fù)雜
c)表達(dá)式是一個函數(shù)
d)表達(dá)式是一個返回表達(dá)式
<數(shù)學(xué)類型轉(zhuǎn)換(明確)>
Rule 10.3(強(qiáng)制):整型表達(dá)式的值只能轉(zhuǎn)換到更窄小且是同樣符號類型的表達(dá)式
Rule 10.4(強(qiáng)制):浮點(diǎn)表達(dá)式的值只能轉(zhuǎn)換到更窄小的浮點(diǎn)表達(dá)式
<數(shù)學(xué)類型轉(zhuǎn)換>
Rule 10.6(強(qiáng)制):所有的 unsigned類型都應(yīng)該有后綴”U“
Rule 11.1(強(qiáng)制):指針不能轉(zhuǎn)換為函數(shù)或者整型以外的其他類型
<表達(dá)式>
Rule12.2(強(qiáng)制):表達(dá)式的值應(yīng)和標(biāo)準(zhǔn)允許的評估順序一致
例:
X=b + i++;
不同的編譯器給出的結(jié)果不一樣,b是否先執(zhí)行?
應(yīng):x=b;
i++;
比如:
X=func(i++,i);
Rule12.3(強(qiáng)制):sizeof操作符不能用在包含邊界作用(side effect)的表達(dá)式上
例:
Int32_t=i;
Int32_t=j;
j=sizeof(i=1234);
表達(dá)式并沒有執(zhí)行,只是得到表達(dá)式類型int的size
Rule 12.4(強(qiáng)制):邏輯操作符&&或者||右邊不能包含邊界作用(side effect)
例:
If(ishight) && (x== i++)),如果ishight=0那么i++不會評估
Rule 12.3(建議):++和- -不能和其他表達(dá)式用在一個表達(dá)式中
例:
U8a=++u8b + u8c--;
<控制語句表達(dá)式>
Rule13.1(強(qiáng)制):賦值語句不能用在一個產(chǎn)生布爾值的表達(dá)式中
例:
If((x=y)!=0)…
更差:
If (x=y)…
Rule13.3(強(qiáng)制):浮點(diǎn)表達(dá)式不應(yīng)該測試其是否相等或者不相等
Rule13.4(強(qiáng)制):for控制表達(dá)式中不要包含任何浮點(diǎn)類型
Rule13.6(強(qiáng)制):數(shù)字變量作為for循環(huán)的循環(huán)計數(shù)不要在循環(huán)體內(nèi)部被修改
例:
Flag=1;
For(i=0;(i<5)&&(flag==1);i++)
{
Flag=0;
i=i+3;
}
<控制流>
Rule 14.1(強(qiáng)制):不要有執(zhí)行不到的代碼
例:
Swich(event)
{
Case www;
do_wakeup();
break;
do_more();
…
}
Rule 14.4(強(qiáng)制):goto語句不能使用
Rule 14.5(強(qiáng)制):continue不能使用
Rule 14.6(強(qiáng)制):函數(shù)應(yīng)在函數(shù)結(jié)束有一個出口
Rule 14.7(強(qiáng)制):witch,while,do ...while,for語句體應(yīng)是一個混合語句(括號)
Rule 14.10(強(qiáng)制):所有if…else if結(jié)構(gòu)都應(yīng)該由else結(jié)束
<Switch語句>
Rule 15.3(強(qiáng)制):switch的最后應(yīng)是default
Rule 15.4(強(qiáng)制):switch表達(dá)式不能使用布爾表達(dá)式
例:
Switch(x==0)
{
… …
}
Rule 15.5(強(qiáng)制):每一個Switch語句都應(yīng)該有一個case
例:
Switch(x)
{
Uint8_t var; /* 違反*/
Case 0:
A=b;
…
}
<函數(shù)>
Rule16.2(強(qiáng)制):函數(shù)不能直接或者間接的調(diào)用自己
注:safe-related 系統(tǒng)不能用遞歸,超出堆??臻g很危險
Rule16.8(強(qiáng)制):non-void類型函數(shù)的所有出口路徑都應(yīng)該有一個明確的return語句表達(dá)式
<指針和數(shù)組>
Rule17.1(強(qiáng)制):指針的數(shù)學(xué)運(yùn)算只能用在指向數(shù)組的地址上
Rule17.3(強(qiáng)制):>,>=,<,<=不能用在指針類型除非指向同一個數(shù)組
Rule 17.5(建議):不要用2級以上指針
<結(jié)構(gòu)和聯(lián)合>
Rule18.4(強(qiáng)制)不要用Union
<預(yù)處理指令>
Rule19.1(建議):#include語句的前面只能有其他預(yù)處理指令和注釋
Rule19.2(建議):#include指令中的頭文件名稱不能包含非標(biāo)準(zhǔn)的字符
Rule19.5(強(qiáng)制):宏不能在函數(shù)體內(nèi)定義
Rule19.8(強(qiáng)制):類函數(shù)宏調(diào)用時不能沒有它的參數(shù)
<標(biāo)準(zhǔn)庫>
Rule20.1(強(qiáng)制):標(biāo)準(zhǔn)庫中的保留標(biāo)識符,宏和函數(shù)不能定義,重定義,和undefined
Rule20.4(強(qiáng)制):動態(tài)內(nèi)存分配不能使用
注:不能使用:malloc,calloc,free,realloc
Rule20.9(強(qiáng)制):輸入輸出庫(stdio.h)不能用在產(chǎn)生嵌入式系統(tǒng)中
Rule20.12(強(qiáng)制):時間處理函數(shù)<time.h>不能使用
<運(yùn)行時故障>
Rule 21.1(強(qiáng)制):通過使用一下手段確保把運(yùn)行時故障最小化:
– 靜態(tài)分析工具/技術(shù)
– 動態(tài)分析工具/技術(shù)
– 編寫明確的代碼避免運(yùn)行時錯誤