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