GJB 8114-2013中不恰当的编码规则解析
?????? 軟件代碼的安全性及可靠性直接關乎相關產品的品質。為了提高代碼的安全性及可靠性,各種編碼規則標準應運而生。MISRA-C標準由于其起步早、應用廣泛、闡述嚴謹、可操作性強、與時俱進等特性,在眾多編碼標準中具有舉足輕重的地位,是沒有爭議的編碼標準的標桿。考慮到代碼安全性及可靠性的重要性,國內也定制了許多編碼標準。就目前來說,還沒有哪個標準能夠同MISRC-C相比較。相對而言,在國內的編碼標準中,GJB 8114-2013是比較完善且應用范圍較廣的編碼標準。然而,僅就GJB 8114-2013中的規則來說,還是有部分規則是值得商榷的。下面從中提出幾條來同大家一起討論。
??????? 內容:除枚舉類型列舉完全外,switch必須要有default
?????? 分析:此規則是錯誤的。switch中default的作用就是處理可預見分支之外的情況。在default中可能是記錄下相關信息、返回錯誤號或者異常處理等。因此default對于軟件代碼安全性及可靠性具有非常重要的作用,不可以省略。而R-1-4-6卻給出了“枚舉類型列舉完全”的例外,實際情況是即使“枚舉類型列舉完全”,switch條件的取值也可能取到枚舉值之外的值,如果出現這種情況,并且沒有default語句的話,很可能會代碼災難性的后果。因此規則R-1-4-6具有誤導性,是錯誤且急需改正的。
?????? 內容:switch中的case和default必須以break或return終止,共用case必須加以明確注釋。 注:共用case必須加以“/* shared,/”明確注釋。
??????? 分析:此規則文字表述不當,規則不恰當。規則R-1-4-7應該隱含了共用case不必符合“switch中的case和default必須以break或return終止”的規則內容,但如規則中表述也太考驗讀者的閱讀理解能力了。此類的表述可參考MISRA-C,共用case就作為“switch中的case和default必須以break或return終止”的例外情形就是了。規則中指出“共用case必須加以“/* shared,/”明確注釋”,作為GJB,卻使用英文作為共用case是否合規的特征,從哪個角度來說也是不合適的。另外,規則R-1-4-6的一個隱含作用是避免將共用case同未完成的case相混淆。可是,結合case需要大括號、不要出現空塊等規則的限制,實際上能夠避免將共用case同未完成的case相混淆問題的出現,因此,綜合來說,共用case必須加以明確注釋的必要性并不大。
??????? 內容:略。
??????? 分析:此三條規則不嚴謹。此三條規則以“循環控制變量”為核心概念進行指定,可在整個標準中卻找不到“循環控制變量”的具體的定義,頗有些國畫的“神韻”的意味。可是將“神韻”放到標準之中,恐怕未必合適。
??????? 內容:變量初始化禁止隱含依賴于系統的缺省值。
??????? 分析:該規則同其它規則關系不清。由于R-1-11-1規則的內容是“變量禁止未賦值就使用”,從字面意思來看,對于很多編譯器來說,在很多情況下,變量未賦值,編譯器會自動給其賦值。如此的話,R-1-11-2同R-1-11-1存在很大的相關性,可二者的分界線在哪里呢?可能該規則是參照C語言的某版(C89,C99,C11…)定義指定的,如果是的話,可以參照MISRA-C或者CERT-C,將所參照的具體的定義列出來以便于標準使用者理解。
??????? 內容:函數中的指針或引用參數如果不是修改項建議使用const說明。
??????? 分析:該規則有些另類。推測該規則制定時是考慮到設計時,確定某參數不是修改項,在編碼時就應該添加上const限定符,用以避免出現編碼同設計不相符合的情況。而8114標準中的絕大多數規則都不是從設計同實現不一致的角度進行檢查,而是純粹從實現的角度來檢測違規,因此顯得此規則有些奇怪。
??????? 內容:建議用宏或const定義常數
??????? 分析:此規則不嚴謹。規則中沒有對“常數”進行定義。依據定義的不同,代碼是否合規會出現不同的結果。
??????? 以上列出了8114標準中部分值得商榷的典型的規則,類似的規則就不一一列舉了,造成在編碼標準中出現不完善規則的原因肯定有很多。但其中很可能包含以下兩點:
??????? 除了編碼規則外,在8114標準中,還給出了依據編碼標準進行代碼評價方法,這是8114標準相對于其它標準獨具特色的部分。然而,盡管該評價方法有一定的合理性,但不可否認的是,該方法仍然有待于進一步完善。比較突出的一個問題就是有些規則以及有些發現的違規無法納入到評價方法涉及的相關評價指標中,也就導致了評價結果的可參考性仍不能令人滿意。相關內容我會在其它文章中分析。
??????? 總的來說,在國內的編碼標準中,8114標準算是相對完備的一個,是值得評價的標準,同時也是一個需要完善的編碼標準。
總結
以上是生活随笔為你收集整理的GJB 8114-2013中不恰当的编码规则解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++11之std::move()
- 下一篇: 对于一颗完全二叉树,要求给所有节点加上一