印玲 宋力立
摘要:論文闡述了類(lèi)型轉(zhuǎn)換所要遵守的規(guī)則,介紹此類(lèi)問(wèn)題的表現(xiàn)形式、種類(lèi),規(guī)則檢查時(shí)的分析要點(diǎn),并列舉了一則航天型號(hào)軟件中所發(fā)生的案例來(lái)說(shuō)明類(lèi)型轉(zhuǎn)換可能產(chǎn)生數(shù)值誤差,以及引發(fā)的代碼質(zhì)量問(wèn)題。論文可用于指導(dǎo)航天型號(hào)軟件代碼規(guī)則檢查。
關(guān)鍵詞:編碼規(guī)范;規(guī)則檢查;類(lèi)型轉(zhuǎn)換
1.背景
軟件編碼規(guī)范是程序在編寫(xiě)過(guò)程中必須遵守的規(guī)則標(biāo)準(zhǔn),實(shí)施什么樣的編碼規(guī)程取決于很多因素,航天型號(hào)項(xiàng)目所采用的編碼規(guī)程最重要的就是軟件的可靠性和安全性,編碼規(guī)程使得開(kāi)發(fā)人員在編程時(shí)和測(cè)試人員在測(cè)試時(shí)有章可循,減少因編程語(yǔ)言的因素而導(dǎo)致的錯(cuò)誤,降低存在隱患的語(yǔ)言特征可能導(dǎo)致的風(fēng)險(xiǎn),提高軟件質(zhì)量。
2.代碼規(guī)則檢查方法
軟件靜態(tài)測(cè)試包括代碼審查、靜態(tài)結(jié)構(gòu)分析、代碼質(zhì)量度量和代碼規(guī)則檢查等,是指不運(yùn)行被測(cè)程序本身,僅通過(guò)分析或檢查源程序的語(yǔ)法、結(jié)構(gòu)、過(guò)程、控制流、數(shù)據(jù)流、接口和表達(dá)式等來(lái)測(cè)試程序代碼的正確性。其中代碼規(guī)則檢查根據(jù)各項(xiàng)標(biāo)準(zhǔn),從代碼的安全性、可移植性、可維護(hù)性、可測(cè)試性等方面,分析查找出程序的欠缺和不足以及錯(cuò)誤之處,發(fā)現(xiàn)違背程序編寫(xiě)標(biāo)準(zhǔn)的問(wèn)題,找出程序中不安全、不明確和有歧義的模塊,例如語(yǔ)言使用規(guī)則變量命名檢查、類(lèi)型檢查、函數(shù)的聲明和定義中使用的標(biāo)識(shí)符不匹配,在函數(shù)體內(nèi)使用外部變量聲明,不允許的遞歸、未使用過(guò)變量的變量、數(shù)組的初始化不完整等。
代碼規(guī)則一般分為強(qiáng)制項(xiàng)規(guī)則和建議項(xiàng)規(guī)則,可以由人工進(jìn)行,充分發(fā)揮人的邏輯思維優(yōu)勢(shì),也可以借助軟件工具自動(dòng)進(jìn)行。根據(jù)測(cè)試方面的經(jīng)驗(yàn)可以得出,在測(cè)試過(guò)程中,靜態(tài)測(cè)試比動(dòng)態(tài)測(cè)試更有效率,以最小的代價(jià)更多更快速地找到問(wèn)題,通常能夠發(fā)現(xiàn)不少于70%的編碼設(shè)計(jì)缺陷和程序邏輯問(wèn)題。代碼檢查非常的耗費(fèi)時(shí)間,很大程度上依賴于測(cè)試人員的知識(shí)儲(chǔ)備、經(jīng)驗(yàn)積累以及細(xì)心程度,而代碼規(guī)則檢查則依據(jù)相關(guān)標(biāo)準(zhǔn)和規(guī)范,一般由測(cè)試工具執(zhí)行生成檢查報(bào)告,常用工具包括QAC/QA C+、Testbed、logiscope等,這些工具可以很好地和軟件開(kāi)發(fā)工具以及測(cè)試工具集成在一起,程序員在編程過(guò)程可以同時(shí)完成編程規(guī)則的檢查,測(cè)試人員在測(cè)試過(guò)程中能更全面檢查出違反編程規(guī)則的代碼。航天型號(hào)軟件通常采用的標(biāo)準(zhǔn)有GJB2725A、航天型號(hào)軟件c語(yǔ)言安全子集、探月工程探測(cè)器系統(tǒng)C語(yǔ)言編程規(guī)范等,可以極大的提高測(cè)試效率,減少錯(cuò)誤的出現(xiàn)概率,確保軟件研制質(zhì)量和可靠性,提高軟件研制工程化水平。
3.類(lèi)型轉(zhuǎn)換規(guī)則
代碼規(guī)則檢查中一項(xiàng)重要的規(guī)則就是關(guān)于類(lèi)型轉(zhuǎn)換方面的要求,類(lèi)型轉(zhuǎn)換包括隱式類(lèi)型轉(zhuǎn)換、強(qiáng)制轉(zhuǎn)換、用戶定義的轉(zhuǎn)換和使用幫助程序類(lèi)的轉(zhuǎn)換。隱式轉(zhuǎn)換是一種安全類(lèi)型的轉(zhuǎn)換,不會(huì)導(dǎo)致數(shù)據(jù)丟失,如果要存儲(chǔ)的值無(wú)需截?cái)嗷蛩纳嵛迦思纯蛇m應(yīng)變量,則可進(jìn)行隱式轉(zhuǎn)換,不需要任何特殊的語(yǔ)法。強(qiáng)制轉(zhuǎn)換是顯示地通知編譯器需要類(lèi)型轉(zhuǎn)換,要使用強(qiáng)制轉(zhuǎn)換運(yùn)算符,必須使用強(qiáng)制轉(zhuǎn)換的情況是在轉(zhuǎn)換中可能丟失信息或者其他原因轉(zhuǎn)換可能不成功。另外,編程人員可以自定義一些特殊的方法來(lái)執(zhí)行用戶定義的轉(zhuǎn)換,從而使不具有基類(lèi)一派生類(lèi)關(guān)系的定義類(lèi)型之間可以顯式和隱式轉(zhuǎn)換。
程序員在軟件編寫(xiě)時(shí)經(jīng)常會(huì)使用類(lèi)型轉(zhuǎn)換,類(lèi)型轉(zhuǎn)換一方面提高了編程的靈活性,另一方面,也帶來(lái)了一定的安全隱患,使用不恰當(dāng)會(huì)導(dǎo)致軟件異常。因此類(lèi)型轉(zhuǎn)換一般遵守以下幾條原則:禁止將類(lèi)型長(zhǎng)度較小的指針強(qiáng)制轉(zhuǎn)換為類(lèi)型長(zhǎng)度較大的指針、禁止對(duì)指針變量使用強(qiáng)制類(lèi)型轉(zhuǎn)換賦值、有符號(hào)和無(wú)符號(hào)之間不得隱式轉(zhuǎn)換、寬類(lèi)型不得向窄類(lèi)型隱式轉(zhuǎn)換、整型和浮點(diǎn)類(lèi)型之間不得隱式轉(zhuǎn)換、函數(shù)參數(shù)不得隱式轉(zhuǎn)換、函數(shù)的返回表達(dá)式不得隱式轉(zhuǎn)換、復(fù)雜表達(dá)式不得隱式轉(zhuǎn)換等。