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