版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
軟件可靠性安全性技術(shù)1第1頁,共123頁,2023年,2月20日,星期日幾個基本術(shù)語故障(Fault)差錯(Error)失效(Failure)缺陷(Defect)失誤(Mistake)隱錯(Bug)2第2頁,共123頁,2023年,2月20日,星期日軟件質(zhì)量的一個示例在一段VisualBasic6.0編寫的程序Division中,從文本框1中輸入數(shù)A#,從文本框2中輸入數(shù)B#,計算C#=A#/B#從文本框3中輸出,其程序如下:PublicA#,B#,C#PrivateSubDivision()A#=Val(Text1.Text)'從文本框1中輸入
B#=Val(Text2.Text)'從文本框2中輸入
C#=A#/B#Text3.Text=Str(C#)‘從文本框3中輸出EndSubA#=1,B#=0時結(jié)果如何?exam13第3頁,共123頁,2023年,2月20日,星期日軟件可靠性軟件可靠性:在一定條件下軟件實現(xiàn)所要求功能的能力。關(guān)于軟件可靠性的誤區(qū):軟件對一組條件下的運行,如果是對的,則永遠(yuǎn)是對的,何有可靠性?對軟件可靠性誤區(qū)的回答:對已認(rèn)為滿足了功能和性能要求的軟件,為何有的軟件在實際的運行中會經(jīng)常出錯?追其原因都是對運行中異常的操作、輸入、事件無防范處理措施,諸如人機交互界面軟件對誤操作經(jīng)常死機,通訊軟件對外界干擾經(jīng)常癱瘓等,這能說不是軟件可靠性的問題嗎?4第4頁,共123頁,2023年,2月20日,星期日軟件可靠性的一個示例前面的exam1就是一個示例。我們再給一個示例。用VisualBasic編寫一個讀入給定數(shù)據(jù)文件的程序。用戶輸入的文件名存放在text1.txt中,數(shù)據(jù)文件格式是:第一個數(shù)是整型數(shù)N(表明以下存放了N個浮點數(shù)),后續(xù)以空格、逗號或換行為區(qū)分符存放N個浮點數(shù)。OpenFile()子程序完成將數(shù)據(jù)文件中的N個浮點數(shù)讀出存放在變量數(shù)組A#()中。5第5頁,共123頁,2023年,2月20日,星期日PrivateSubOpenFile()Dimi,NOpenTrim(Text1.Text)ForInputAs#1'打開數(shù)據(jù)文件
Input#1,N'讀入數(shù)據(jù)個數(shù)
ReDimA#(1ToN)Fori=1ToNInput#1,A#(i)'讀入數(shù)據(jù)
NextClose#1'關(guān)閉數(shù)據(jù)文件EndSub文件不存在或數(shù)據(jù)格式錯誤時結(jié)果如何?exam26第6頁,共123頁,2023年,2月20日,星期日軟件安全性軟件安全性:對由于軟件的缺陷造成人員傷亡、財產(chǎn)損失等危險事件的防范能力。關(guān)于軟件安全性的誤區(qū):軟件只是代碼程序和相應(yīng)文檔,軟件結(jié)果只是對與錯,何有安全性?對軟件安全性誤區(qū)的回答:對實時嵌入式軟件而言,軟件的指令直接控制著硬件的動作,如果軟件不對所控制硬件的指令進行安全性保護,有何信心保證系統(tǒng)是安全的?由于軟件的錯誤造成重大財產(chǎn)損失、嚴(yán)重人員傷亡的實例已屢見不鮮,這能說軟件沒有安全性的問題嗎?7第7頁,共123頁,2023年,2月20日,星期日軟件安全性的實例轉(zhuǎn)塔設(shè)備的調(diào)轉(zhuǎn)控制……8第8頁,共123頁,2023年,2月20日,星期日軟件可靠性安全性設(shè)計準(zhǔn)則9第9頁,共123頁,2023年,2月20日,星期日軟件可靠性和安全性設(shè)計的一般性指導(dǎo)可參考GJB/Z102-1997軟件可靠性和安全性設(shè)計準(zhǔn)則Q/WE871-1999軟件可靠性和安全性設(shè)計指南
二院制定的《武器系統(tǒng)軟件可靠性安全性設(shè)計準(zhǔn)則》,則是結(jié)合二院以往地空導(dǎo)彈武器系統(tǒng)軟件中實際暴露的典型問題,總結(jié)整理歸納出的有關(guān)軟件可靠性和安全性設(shè)計的具體細(xì)則,適用于二院武器系統(tǒng)軟件開發(fā)中可靠性和安全性的設(shè)計。10第10頁,共123頁,2023年,2月20日,星期日4.4圈復(fù)雜度的限制11第11頁,共123頁,2023年,2月20日,星期日圈復(fù)雜度問題的示例圈復(fù)雜度115的控制流圖
圈復(fù)雜度10的控制流圖
12第12頁,共123頁,2023年,2月20日,星期日4.5余量的設(shè)計應(yīng)注意關(guān)鍵軟件的余量設(shè)計,這些余量包括:存儲量、IO通道吞吐量及處理時間等。在同步時間要求較高的系統(tǒng)中,處理時間的余量應(yīng)不少于20%。如,某系統(tǒng)9ms通訊一次,則該系統(tǒng)的處理時間應(yīng)小于7.2ms。余量設(shè)計為我們在軟件測試時使用一些在線動態(tài)測試工具,如CodeTest等,提供了必要的應(yīng)用條件。13第13頁,共123頁,2023年,2月20日,星期日4.9.1謹(jǐn)防實數(shù)取整的精度損失實數(shù)取整的轉(zhuǎn)換函數(shù)int()在C中是截取取整的,如果需要四舍五入,則必須特殊處理。例如:
floatf=1.9;intk;k=(int)(f);
則k是1,而不是2。14第14頁,共123頁,2023年,2月20日,星期日實數(shù)四舍五入后取整的方法如果f>=0,則int(f+0.5)是四舍五入后的取整結(jié)果;如果f<0,則int(f–0.5)是四舍五入后的取整結(jié)果。15第15頁,共123頁,2023年,2月20日,星期日4.11安全關(guān)鍵信息碼的設(shè)計安全關(guān)鍵的信息碼應(yīng)采用具有檢錯能力的編碼。禁止對關(guān)鍵信息用一位的邏輯判別,如用“0”來表示“不起飛”,用“1”來表示“起飛”。對此具有檢錯能力的編碼可以為用二位的邏輯判別,如用“01”來表示“不起飛”,用“10”來表示“起飛”。顯然在有一位可能受干擾的系統(tǒng)假設(shè)下,用一位的邏輯判別無法檢測其是否受干擾,而二位的邏輯判別則可以檢測其是否受干擾,如“00”和“11”就表示信號受到了干擾。16第16頁,共123頁,2023年,2月20日,星期日安全關(guān)鍵信息碼應(yīng)用的實例操作桿的誤信號……17第17頁,共123頁,2023年,2月20日,星期日4.10異常計算的防范設(shè)計在數(shù)值計算中,要充分考慮計算中的異常情況,如:(1)在除法計算中,要考慮除數(shù)為0或很小時的計算溢出的處理,可計算前先進行除數(shù)大小的判別檢查;(2)在開平方根的計算中,要考慮被開根數(shù)是否大于等于零,可計算前先進行被開根數(shù)的符號判別。18第18頁,共123頁,2023年,2月20日,星期日異常計算設(shè)計問題的實例一有效視線角誤差……19第19頁,共123頁,2023年,2月20日,星期日異常計算設(shè)計問題的實例二……20第20頁,共123頁,2023年,2月20日,星期日4.13接口數(shù)據(jù)的定義在通訊接口數(shù)據(jù)定義時必須明確通訊的數(shù)據(jù)量、數(shù)據(jù)格式、數(shù)據(jù)內(nèi)容、換算要求、傳輸協(xié)議、傳輸率、誤碼率。
(1)初始狀態(tài)要設(shè)計為0位狀態(tài)。如,“00表示狀態(tài)未定”即應(yīng)為初始狀態(tài)。又如,用2位表示的:“01表示狀態(tài)1”、“10表示狀態(tài)2”、“00表示狀態(tài)未定”,和用1位表示的:“0表示狀態(tài)1”、“1表示狀態(tài)2”,對初始狀態(tài)的理解是不一樣的。21第21頁,共123頁,2023年,2月20日,星期日(2)對交換字各位解釋說明其含義時,單一位的解釋說明,不僅要說明為“1”的含義,還要說明為“0”的含義;多位解釋說明時,不僅要說明特定組合的含義,還要說明其它組合的含義。如2位組合的含義解釋說明時,不僅要說明“00表示狀態(tài)未定”、“01表示狀態(tài)1”、“10表示狀態(tài)2”,還要說明“11”表示何含義(可能是無意義,但要明確說明,有些是不需要處理而保持以前狀態(tài),有些是要進行報警或異常錯誤處理的)。22第22頁,共123頁,2023年,2月20日,星期日4.15異常處理的設(shè)計對軟件的編程不能只考慮正常情況下的處理,還應(yīng)充分考慮可能的異常事件的處理。在軟件的設(shè)計過程中應(yīng)專門對可能的異常事件進行分析,這一工作稱之為“軟件失效模式及影響分析”。23第23頁,共123頁,2023年,2月20日,星期日
如,在對數(shù)據(jù)文件操作時可以考慮的異常事件有:(1)錯誤的文件名或文件數(shù)(2)文件沒找到(3)錯誤的文件模式(4)文件已經(jīng)被打開(5)I/O設(shè)備錯誤(6)文件已經(jīng)存在(7)錯誤的記錄長度(8)磁盤滿(9)超過文件結(jié)尾的輸入(10)錯誤的記錄數(shù)(11)錯誤的文件名(12)太多的文件(13)設(shè)備不可使用(14)權(quán)限不允許(15)磁盤沒準(zhǔn)備好(16)不能對不同設(shè)備重新命名(17)路徑或文件訪問錯誤(18)沒找到路徑24第24頁,共123頁,2023年,2月20日,星期日顯然這18種模式無需也不必都考慮,可依據(jù)實際情況裁剪考慮。如在人機交互軟件中用戶選擇數(shù)據(jù)文件,則“錯誤的文件名或文件數(shù)”、“文件沒找到”和“路徑或文件訪問錯誤”是必須要考慮的,需要對此設(shè)計相應(yīng)的處理方法。如果是具有運行錯誤陷阱功能的高級語言,如:VB、VC、Ada等,則錯誤陷阱的使用是很好的方法。無可靠性措施的軟件:如當(dāng)輸入的文件不存在時,軟件運行被異常終止。用戶不知所措,甚至連相關(guān)信息都沒得到。軟件失控了!有可靠性措施的軟件:如當(dāng)輸入的文件不存在時,軟件提示《輸入文件不存在》的信息,并重新返回到用戶輸入狀態(tài),等待用戶終止輸入過程,或重新輸入。軟件始終處于受控!exam325第25頁,共123頁,2023年,2月20日,星期日4.17變量的命名變量命名要清晰。通常的命名有頭字母大寫命名法和下劃線命名法。頭字母大寫命名法如:InitialValue,ObjectPosition等。下劃線命名法如:initial_value,object_position等?,F(xiàn)在又流行帶類型說明的頭字母大寫命名法:如intInitialValue表明是int的類型,flObjectPosition表明是float的類型,而用tempInitialValue來表明其是一個臨時變量。變量的命名對程序的理解及維護起著非常重要的作用。26第26頁,共123頁,2023年,2月20日,星期日變量命名問題的實例for(tchflag=0;tchflag<14;tchflag++)
……27第27頁,共123頁,2023年,2月20日,星期日4.19變量的初始化所使用的變量要有明確的初始化,避免使用缺省的初始值。同時,對循環(huán)處理過程的變量初始化要特別注意。28第28頁,共123頁,2023年,2月20日,星期日變量初始化問題的實例一固化與非固化的差異……29第29頁,共123頁,2023年,2月20日,星期日變量初始化問題的實例二雙發(fā)時的過程標(biāo)志……30第30頁,共123頁,2023年,2月20日,星期日4.21多組條件判別的完全性C語言中的IF語句推薦的書寫格式為
if(id==0){//0的處理;}elseif(id==1){//1的處理;……}else{//其它情況的處理;}注意這里else要求明確寫出,要充分利用else進行異常情況的處理。事實上,if處理條件的遺漏是經(jīng)常發(fā)生的,需要特別小心。
31第31頁,共123頁,2023年,2月20日,星期日多組條件判別不完全性的實例if(mo>0&&mo<11&&no>0&&no<10){…}if(mo<1||mo>11)mp(5);if(no<1||no>10)mp(6);
if(mo>0&&mo<11&&no>0&&no<10){…}elseif(mo<1||mo>10){mp(5);}elseif(no<1||no>9){mp(6);}else{//此處進行提示報告}32第32頁,共123頁,2023年,2月20日,星期日4.22函數(shù)調(diào)用返回的設(shè)計函數(shù)的返回必須要有運行狀態(tài)的標(biāo)識,以使調(diào)用者能識別被調(diào)函數(shù)的運行狀態(tài)。33第33頁,共123頁,2023年,2月20日,星期日函數(shù)調(diào)用返回設(shè)計的示例方法一:可以設(shè)置整型函數(shù)的返回值,以標(biāo)識函數(shù)的運行狀態(tài)。如計算三角形面積的函數(shù)可設(shè)計為:intTriangleComp(floata,floatb,floatc,float*s){if(……){//正常時的計算,面積值賦給*s
……return(0);}elseif(……){//出現(xiàn)邊長小于零的情況
return(-1);}elseif(……){//兩邊之和小于第三邊的情況
return(-2);
……}else{//其它情況
return(-10);}}
intflag;flag=TriangleComp(3,4,5,&s);if(flag<0){
……//異常處理}else{
……//正常處理}在調(diào)用時可以進行判別34第34頁,共123頁,2023年,2月20日,星期日方法二:可以在調(diào)用參數(shù)中專門設(shè)計一個函數(shù)運行狀態(tài)的參數(shù)。如上述計算三角形面積的函數(shù)也可設(shè)計為:floatTriangleComp(floata,floatb,floatc,int*e){floats;if(……){//正常時的計算,面積值賦給s返回*e=0;return(s);}elseif(……){//出現(xiàn)邊長小于零的情況*e=-1;return(0);}elseif(……){//兩邊之和小于第三邊的情況*e=-2;return(0);}else{//其它情況*e=-10;return(0);}}
inte;floats;s=TriangleComp(3,4,5,&e);if(e<0){
……//異常處理}else{
……//正常處理}在調(diào)用時可以進行判別35第35頁,共123頁,2023年,2月20日,星期日4.23函數(shù)調(diào)用參數(shù)的匹配函數(shù)調(diào)用的參數(shù)類型、次序和個數(shù)必須匹配。類型的匹配一是注意int、float、double、char等類型的匹配,二是注意指針地址和地址內(nèi)容的匹配。如,intfunc(float*)的函數(shù),直接調(diào)用func(0),則func使用的是0地址單元中的值,而非0值,如要送0值則應(yīng)先申請“floatangle=0;”再調(diào)用func(&angle)。36第36頁,共123頁,2023年,2月20日,星期日函數(shù)調(diào)用參數(shù)匹配問題的實例回路測試……37第37頁,共123頁,2023年,2月20日,星期日4.28對GOTO語句的限制原則上限制使用跳轉(zhuǎn)(GOTO)語句,在使用GOTO語句能帶來某些好處的地方,一定要控制GOTO的方向:只允許向下GOTO,不允許向上GOTO;
只允許從循環(huán)中GOTO出去,不允許GOTO到循環(huán)中來。但在即將頒布的國軍標(biāo)中將嚴(yán)格禁止GOTO語句的使用。38第38頁,共123頁,2023年,2月20日,星期日4.29.2中斷的嵌套中斷嵌套分自嵌套和外嵌套。自嵌套就是被自身中斷嵌套,外嵌套就是被其它中斷嵌套。中斷的使用除特殊需要外一定要避免嵌套,常用的方法就是進入中斷服務(wù)程序后關(guān)掉不希望嵌套的所有中斷。自嵌套一定要避免;必要時的外嵌套要充分考慮中斷優(yōu)先級的影響;允許中斷和禁止中斷的語句位置要獨立進行仔細(xì)分析。39第39頁,共123頁,2023年,2月20日,星期日4.29.3中斷的返回除特殊需要外一定要避免從中斷服務(wù)子程序中使用跳轉(zhuǎn)語句直接出去,應(yīng)當(dāng)使用正常返回語句。因為直接跳出一是影響了堆棧的控制,二是可能破壞跳轉(zhuǎn)處的應(yīng)有狀態(tài)。40第40頁,共123頁,2023年,2月20日,星期日4.29.4中斷的現(xiàn)場保護要充分考慮到中斷任何時刻都可能發(fā)生的特點,保存好需要保存的現(xiàn)場,并在中斷服務(wù)子程序返回時正確恢復(fù)現(xiàn)場。如在主程序中有的程序段是禁止帶符號位運算,有的程序段是允許帶符號位運算,而中斷服務(wù)子程序中需要帶符號位運算,則在中斷服務(wù)子程序返回時一定要恢復(fù)到中斷響應(yīng)時的禁止或允許帶符號位運算。41第41頁,共123頁,2023年,2月20日,星期日4.29.5不用中斷源的屏蔽不用中斷源一定要進行屏蔽。不用中斷源的軟屏蔽應(yīng)通過編寫空處理的對應(yīng)中斷服務(wù)子程序來實現(xiàn)。42第42頁,共123頁,2023年,2月20日,星期日不用中斷源無空中斷服務(wù)子程序的實例Int03中斷不用后,殘留允許打開語句,但刪除了Int03的中斷服務(wù)子程序……43第43頁,共123頁,2023年,2月20日,星期日4.29.6注意對誤中斷和漏中斷的防范在中斷的使用中,除了要遵循一般的可靠性安全性設(shè)計準(zhǔn)則外,還應(yīng)該重點對每一中斷的兩個故障模式進行認(rèn)真分析。這兩個故障模式是:誤中斷和漏中斷。通常是在程序中設(shè)計一些特征標(biāo)識量,在中斷響應(yīng)服務(wù)子程序中應(yīng)首先檢查相應(yīng)的特征標(biāo)識量,以防誤中斷。在一些依賴于中斷響應(yīng)服務(wù)子程序執(zhí)行結(jié)果的關(guān)鍵處理程序中,應(yīng)首先檢查相應(yīng)的特征標(biāo)識量,以防漏中斷。在軟件的概要設(shè)計階段,應(yīng)認(rèn)真分析哪些處理過程是不能被中斷打斷的,必須以清單方式列表。對這些處理過程應(yīng)在相應(yīng)程序執(zhí)行前關(guān)閉中斷源,執(zhí)行完后再打開必要的中斷源。44第44頁,共123頁,2023年,2月20日,星期日誤中斷的實例上傳程序被中斷打斷……45第45頁,共123頁,2023年,2月20日,星期日漏中斷的實例多通道異步并發(fā)……46第46頁,共123頁,2023年,2月20日,星期日防漏不防誤防漏又防誤47第47頁,共123頁,2023年,2月20日,星期日4.30看門狗的設(shè)計看門狗技術(shù)是控制運行時間的一種有效方法??撮T狗實際上是一種計時裝置,當(dāng)計時啟動后看門狗在累計時間,當(dāng)累計時間到了規(guī)定值時觸發(fā)到時中斷(即狗叫),看門狗在不需要時可以關(guān)閉??撮T狗的設(shè)計要首先明確其目的性。如:(1)要防某段程序可能的死循環(huán),則在此段程序前啟動狗,在此段程序后關(guān)閉狗,在狗叫中斷中進行超時異常處理。(2)要防外來的信息長時間不來,則在開始等外來信息時啟動狗,在接收到外來信息時關(guān)閉狗,在狗叫中斷中進行超時異常處理。(3)要防計算超時,則在開始計算時啟動狗,在計算完畢后關(guān)閉狗,在狗叫中斷中進行超時異常處理。顯然,不可能要求一個狗可以看管好所有的超時情況。48第48頁,共123頁,2023年,2月20日,星期日看門狗設(shè)計問題的實例一這里,狗叫可能是因為程序某處選入死循環(huán),可能是外來信息長時間不來,也可能是處理信息超時。如果這里設(shè)計的定時器是為了檢測與外系統(tǒng)的通訊是否出現(xiàn)異常為目的(如規(guī)定18ms未來信息表明通訊異常),顯然如此設(shè)計就有所欠缺。49第49頁,共123頁,2023年,2月20日,星期日看門狗設(shè)計問題的實例二總線占用超時控制……50第50頁,共123頁,2023年,2月20日,星期日4.31避免潛在的死循環(huán)在等待外部信號的程序段中,不允許無限制地等待。正確的做法應(yīng)是,或采用循環(huán)等待次數(shù)控制,或使用定時器,使得規(guī)定時間內(nèi)(無論成功或失敗)必須保證退出等待外部信號的程序段。
不允許的設(shè)計方法建議采用的設(shè)計方法51第51頁,共123頁,2023年,2月20日,星期日4.35注意通過雙口RAM進行握手通過雙口RAM進行信息交換是設(shè)計師經(jīng)常采用的一種設(shè)計方案。的確雙口RAM提供了信息交換雙方的方便讀寫,但僅靠雙口RAM要做到讀寫的時序要求就要格外小心。如此的設(shè)計是要避免的:通過雙口RAM交換信息,在雙口RAM中設(shè)置了握手信號單元。讀方檢查到握手信號為01H,表明對方已準(zhǔn)備好數(shù)據(jù),再讀數(shù)據(jù),讀完后將握手信號置為00H;寫方檢查到握手信號為00H,表明對方已取走數(shù)據(jù),再寫數(shù)據(jù),寫完數(shù)據(jù)后再將握手信號置為01H,表明自己已準(zhǔn)備好數(shù)據(jù)。52第52頁,共123頁,2023年,2月20日,星期日這種設(shè)計不一定可靠,可能會出現(xiàn)寫方要寫握手信號時,讀方正在讀握手信號,則寫方要寫的值寫不進去。可靠的設(shè)計應(yīng)用硬件連線保證握手,而不要靠雙口RAM中的握手信號。如果一定要靠雙口RAM進行握手,則寫握手信號單元數(shù)據(jù)時一定要寫完后接著再讀出,經(jīng)驗證確實寫成功后再進行下面的操作,否則需繼續(xù)寫。
當(dāng)然這必須與避免潛在的死循環(huán)的設(shè)計準(zhǔn)則聯(lián)合使用。53第53頁,共123頁,2023年,2月20日,星期日可靠的設(shè)計方法
握手標(biāo)志置不上的可能
54第54頁,共123頁,2023年,2月20日,星期日4.36數(shù)據(jù)采集的多路冗余設(shè)計關(guān)鍵數(shù)據(jù)的采集可采用多路冗余設(shè)計,即可以從多個通訊口對同一數(shù)據(jù)進行采集,通過表決進行有效數(shù)據(jù)的裁決。通常多采用奇數(shù)路的冗余設(shè)計,如3路、5路等。(1)開關(guān)量的裁決可采用多數(shù)票的裁決,如3取2、5取3等。(2)模擬量的裁決可采用中間數(shù)平均值的裁決,如3路數(shù)的中間值、5路數(shù)去掉最大最小值后的平均值等。55第55頁,共123頁,2023年,2月20日,星期日關(guān)鍵數(shù)據(jù)的采集可采用多次冗余設(shè)計,即可以從同一通訊口多次對同一數(shù)據(jù)進行采集,通過表決進行有效數(shù)據(jù)的裁決。通常多采用奇數(shù)次的冗余設(shè)計,如3次、5次等。(1)開關(guān)量的裁決可采用多數(shù)票的裁決,如3取2、5取3等,也可采用連續(xù)次數(shù)的裁決,如5次里連續(xù)3次的量被才被認(rèn)可,當(dāng)然這種裁決被認(rèn)可量比簡單的5取3裁決更嚴(yán)格。(2)模擬量的裁決可采用中間數(shù)平均值的裁決,如3次數(shù)的中間值、5次數(shù)去掉最大最小值后的平均值等。
56第56頁,共123頁,2023年,2月20日,星期日極關(guān)鍵數(shù)據(jù)的采集亦可采用多路多次的綜合冗余設(shè)計,即可以從多個通訊口對同一數(shù)據(jù)進行多次采集,通過表決進行有效數(shù)據(jù)的裁決。附注:(m+1)/(2m+1)冗余措施失效率的計算假設(shè)一個過程的失效率是,在2m+1個相同功能的過程中取m+1個相同的結(jié)果作為最終結(jié)果,這種措施稱為(m+1)/(2m+1)冗余措施,在不考慮共因失效的前提下,其失效率為57第57頁,共123頁,2023年,2月20日,星期日4.37時間飄逸的防范58第58頁,共123頁,2023年,2月20日,星期日4.38TMS320C25的初始化采用輔助寄存器對4號單元進行初始化置位,在常溫下是可以的,但在低溫條件下(小于-5℃)將會出現(xiàn)問題。對4號單元進行初始化置位必須采用直接尋址的方式。59第59頁,共123頁,2023年,2月20日,星期日軟件可靠性安全性C語言編程準(zhǔn)則60第60頁,共123頁,2023年,2月20日,星期日1998年,國際汽車工業(yè)軟件可靠性協(xié)會MISRA組織制定了“汽車軟件C語言使用指南”的標(biāo)準(zhǔn)。這份標(biāo)準(zhǔn)的產(chǎn)生在自動化行業(yè)極大地推動了使用“安全的C”進行編程。這份標(biāo)準(zhǔn)在汽車行業(yè)被廣泛接受,同時它也被其它行業(yè)所廣泛借鑒。利物浦?jǐn)?shù)據(jù)研究協(xié)會LDRA作為專業(yè)軟件測試協(xié)會建立于1975年。LDRATestbed軟件測試工具可基于MISRA的C語言使用標(biāo)準(zhǔn)對C語言程序進行檢查,以幫助用戶們在程序代碼上加強行業(yè)標(biāo)準(zhǔn)的執(zhí)行。在我國,2005年頒布實施了《GJB5369-2005,航天型號軟件C語言安全子集》。61第61頁,共123頁,2023年,2月20日,星期日Q/WE905-2005《導(dǎo)彈武器系統(tǒng)C語言安全子集》本標(biāo)準(zhǔn)完全遵循《GJB5369-2005,航天型號軟件C語言安全子集》,并在二院型號軟件工程實踐的基礎(chǔ)上,新補充了22條強制性準(zhǔn)則和2條推薦性準(zhǔn)則,將GJB航天型號軟件C語言安全子集中的一條推薦性準(zhǔn)則上升為強制性準(zhǔn)則。附錄B是相對于GJB航天型號軟件C語言安全子集新增加的附錄。62第62頁,共123頁,2023年,2月20日,星期日準(zhǔn)則分類(1)聲明定義類(2)版面書寫類(3)分支控制類(4)指針使用類(5)跳轉(zhuǎn)控制類(6)運算處理類(7)過程調(diào)用類(8)語句使用類
(9)調(diào)用返回類(10)程序注釋類(11)循環(huán)控制類(12)類型轉(zhuǎn)換類(13)初始化類(14)比較判斷類(15)名稱、符號與變量使用類63第63頁,共123頁,2023年,2月20日,星期日4.1.1.15字符型變量必須明確定義是有符號還是無符號voidstatic_p(void){charc='c';/*...*/}違背64第64頁,共123頁,2023年,2月20日,星期日4.1.1.20禁止在#include<……>中使用絕對路徑名
#include<C:\VC\include\stdio.h>voidDummy(void){/*...*/}頭文件路徑應(yīng)該在編譯器的選項中予以設(shè)置說明違背65第65頁,共123頁,2023年,2月20日,星期日4.2.1.2循環(huán)體必須用大括號括起來
intstatic_p(intp_1){intj=10;intk=0;/*...*/for(k=0;k<10;k=k+1)j=j+1;returnj;}違背66第66頁,共123頁,2023年,2月20日,星期日4.2.1.3then/else中的語句必須用大括號括起來(二院簡化為:else中的語句必須用大括號括起來)
intstatic_p(intp_1,intp_2){inti=1;intj=2;/*...*/if(p_1>0){i=i-1;}elsei=i+1;
returni;}違背67第67頁,共123頁,2023年,2月20日,星期日4.2.1.4邏輯表達式的連接必須使用括號
voidstatic_p(void){boolflag=true;unsignedinty=0u,x=0u,z=1u;/*...*/if(x<0||z+y!=0&&!flag){flag=false;}}
違背68第68頁,共123頁,2023年,2月20日,星期日4.2.1.5禁止在頭文件前有可執(zhí)行代碼
voidstatic_p(void){#include"myfile.h"
/*...*/}違背69第69頁,共123頁,2023年,2月20日,星期日4.2.1.6宏參數(shù)必須用括號括起來
#definestatic_p(x)x>=0?x:-xvoidtest_p(void){unsignedintresult;inta=6,b=5;/*...*/result=static_p(a-b);result=static_p(a)+1;/*...*/}違背70第70頁,共123頁,2023年,2月20日,星期日4.2.1.7嵌入?yún)R編程序的過程必須是純匯編程序
voidstatic_p(void){unsignedintx;x=0u;_asm{moveax,x}}違背71第71頁,共123頁,2023年,2月20日,星期日4.2.1.9禁止字符串中單獨使用“\”而非“\0”(二院進一步明確為:4.2.1.9字符型數(shù)組賦值時,必須使用“\0”終止字符串)
voidstatic_p(void){unsignedcharstr[5];str[0]='a';str[1]='b';str[2]='c';/*其它處理*/}違背72第72頁,共123頁,2023年,2月20日,星期日4.3.1.1禁止條件判別成立時相應(yīng)分支無執(zhí)行語句
voidstatic_p(void){unsignedintvalue_x=1u;/*...*/if(value_x==0u);/*...*/if(value_x==0u){;}}違背73第73頁,共123頁,2023年,2月20日,星期日4.3.1.4在switch語句中必須有default語句
如果switch語句中缺省了default語句,當(dāng)所有的case語句的表達式值都不匹配時,則會跳轉(zhuǎn)到整個switch語句后的下一個語句執(zhí)行。強制default語句的使用體現(xiàn)出已考慮了各種情況的編程思想。74第74頁,共123頁,2023年,2月20日,星期日4.3.1.7禁止switch的case語句不是由break終止
如果某個case語句最后的break被省略,在執(zhí)行完該case語句后,系統(tǒng)會繼續(xù)執(zhí)行下一個case語句。case語句不是由break終止,有可能是編程者的粗心大意,也有可能是編程者的特意使用。為了避免編程者的粗心大意,因此禁止switch的case語句不是由break終止.二院的調(diào)整:原則上禁止switch的case語句不是由break終止,當(dāng)確實是編程者的特意使用時,必須加以“/*此情況屬于部分的case共用*/”的明確注釋。75第75頁,共123頁,2023年,2月20日,星期日4.4.1.2指針的指針不能超過兩級(二院進一步明確為:4.4.1.2禁止指針的指針超過兩級)對指針進行控制是很困難的,當(dāng)指針的指針超過兩級時,使用起來更是具有風(fēng)險,因此禁止指針的指針超過兩級。二院的細(xì)化:當(dāng)在某種特殊情況下確實需要超過兩級的指針時,必須加以“/*詳見《詳細(xì)設(shè)計報告》的指針特殊設(shè)計*/”的明確注釋,在《詳細(xì)設(shè)計報告》的指針特殊設(shè)計中詳細(xì)說明理由,并在單元測試報告中提供針對性的測試結(jié)果。76第76頁,共123頁,2023年,2月20日,星期日4.6.1.15禁止在邏輯表達式中使用賦值操作符(二院進一步明確為:4.2.1.15禁止在條件判別語句中使用賦值操作符)voidstatic_p(void){unsignedintz=0u,x=0u;boolflag=true;/*...*/if(flag=false){z=x-1u;}/*...*/}違背77第77頁,共123頁,2023年,2月20日,星期日4.6.1.2數(shù)組的使用必須保證不會出現(xiàn)越界voidstatic_p(void){unsignedinta[4];/*...*/a[4]=1;/*...*/}違背78第78頁,共123頁,2023年,2月20日,星期日4.6.1.7位的定義必須是有符號整數(shù)或無符號整數(shù)
structstatic_p{unsignedcharx:1;};voiddummy(void){/*...*/}違背79第79頁,共123頁,2023年,2月20日,星期日4.6.1.8禁止給變量賦的值與變量的類型不一致
voidstatic_p(void){unsignedintd;d=2.0;/*應(yīng)該使用2u*//*...*/}違背80第80頁,共123頁,2023年,2月20日,星期日4.6.2.2謹(jǐn)防長度操作符sizeof的副作用
長度操作符sizeof不計算操作數(shù)的值,所以更明確的要求是:禁止在sizeof中使用賦值。voidstatic_p(void){unsignedintx=1u;unsignedinty=2u;inta=3;/*...*/a=sizeof(x=y);}違背81第81頁,共123頁,2023年,2月20日,星期日4.6.2.4避免由于設(shè)計的原因?qū)е履承┐a不能執(zhí)行
#definedefval0voidstatic_p(void){if(0){/*...*/}if(defval){/*...*/}}違背82第82頁,共123頁,2023年,2月20日,星期日對程序文件的限制4.2.2.1建議一個文件中的程序總行不超過2000行4.2.2.2建議一個過程或函數(shù)中的程序總行不超過200行4.7.1.3static類型的過程在所在文件中必須被調(diào)用83第83頁,共123頁,2023年,2月20日,星期日4.8.1.1禁止使用容易混淆的語句(二院進一步明確為:4.8.1.1禁止單獨使用小寫字母“l(fā)”或大寫字母“O”作為變量名
)voidstatic_p(void){intl=1,O=0;/*...*/l=O;O=l;}違背84第84頁,共123頁,2023年,2月20日,星期日4.8.1.4禁止使用不起作用的語句(二院補充)
voidstatic_p(void){unsignedintx=0u;x;}違背85第85頁,共123頁,2023年,2月20日,星期日函數(shù)返回的限制4.9.1.1函數(shù)必須有返回語句4.9.1.2禁止void類型的過程中的return語句帶有返回值4.9.1.3有返回值的函數(shù)中return必須帶有返回值4.9.1.4函數(shù)返回類型必須一致86第86頁,共123頁,2023年,2月20日,星期日4.10.1.1禁止使用嵌套的注釋
voidstatic_p(void){/*ThisistheOuterComment/*ThisistheInnerComment*/}違背87第87頁,共123頁,2023年,2月20日,星期日4.11.1.2循環(huán)變量必須是局部聲明的
unsignedintglobal_f=0u;intloop_standards(intp_1){intj=10;/*...*/for(global_f=0;global_f<10;global_f++){j--;}returnj;}
違背88第88頁,共123頁,2023年,2月20日,星期日4.13.1.4變量使用前必須被賦過值
在使用變量前應(yīng)確保變量曾被賦過值。例如:
unsignedintx;unsignedinty;y=x;
其中對變量x的使用,在使用前未曾被賦過值。如果變量是在某些條件前提下進行的賦值,在條件結(jié)束后使用該變量,則同樣是違背該條準(zhǔn)則。89第89頁,共123頁,2023年,2月20日,星期日4.14.1.1禁止對實數(shù)類型的量做是否相等的比較
voidstatic_p(void){floatf1,f2;f1=1.01f;f2=2.01f;/*...*/if(f1==f2){/*...*/}if(f1==0.0f){f1=f1+0.01f;}}違背90第90頁,共123頁,2023年,2月20日,星期日4.15.1.2禁止局部變量與全局變量同名
C語言編譯器是允許局部變量與全局變量同名,但局部變量的作用域只限制在聲明的模塊內(nèi)部。為避免本意是需要對全局變量更新,但由于存在同名的局部變量,導(dǎo)致全局變量未得到實際有效的更新,因此禁止局部變量與全局變量同名。unsignedintFire_Command;voidstatic_p(void){unsignedintFire_Command=2u;……}違背91第91頁,共123頁,2023年,2月20日,星期日“4.14.1.1禁止對實數(shù)類型的量做是否相等的比較”實驗說明如下代碼:
intP=1000; floatd=0.435f; intH=435;if(H==(P*d)){/*違背了準(zhǔn)則*/
i=1; }else{i=2; }到底走哪個分支?走此分支?exam4H=435P*d=1000*0.435=435是否相等?92第92頁,共123頁,2023年,2月20日,星期日“4.2.1.6宏參數(shù)必須用括號括起來”實驗說明如下代碼1:#definep(x)x>=0?x:-x…… intresult; inta=6; result=p(a)+1;result到底等于幾?
如下代碼2:#definep(x)(x>=0?x:-x)
……
intresult; inta=6; result=p(a)+1;result到底等于幾?result=6還是7?exam593第93頁,共123頁,2023年,2月20日,星期日“4.6.2.2謹(jǐn)防長度操作符sizeof的副作用”實驗說明如下代碼:
intx=1;inty=2;inta=3;a=sizeof(x=y);
……
x到底等于幾?現(xiàn)在x=1還是2?exam694第94頁,共123頁,2023年,2月20日,星期日編程準(zhǔn)則違背的典型實例95第95頁,共123頁,2023年,2月20日,星期日“4.8.1.4禁止使用不起作用的語句”(二院補充)的典型實例該準(zhǔn)則在某軟件中以“x-0;”的形式違背了,而經(jīng)過確認(rèn)是由于編程人員誤將“x=0;”的“=”號寫成了“-”號所致,其結(jié)果是導(dǎo)致變量x的賦值失敗。
96第96頁,共123頁,2023年,2月20日,星期日“4.6.1.15禁止在條件判別語句中使用賦值操作符”的典型實例一
該準(zhǔn)則在某軟件中以“if(the_i=5)”的形式違背了,而經(jīng)過確認(rèn)是由于編程人員誤將“if(the_i==5)”的“==”寫成了“=”所致,其結(jié)果是該判別條件無論變量the_i為何值都將執(zhí)行該分支的處理。97第97頁,共123頁,2023年,2月20日,星期日“4.6.1.15禁止在條件判別語句中使用賦值操作符”的典型實例二在某軟件中有如下語句:
if((uiSendLen==0x55AA)&&(uiRecvLen==0x66BB)&&(uiBaud=0x77CC))其中將條件(uiBaud==0x77CC)判別誤寫為(uiBaud=0x77CC)的賦值,后果是即使uiBaud不為0x77CC,其他條件滿足仍能走入真分支。98第98頁,共123頁,2023年,2月20日,星期日“4.14.1.4邏輯判別表達式如果存在運算項,必須要使用括號”(二院補充)的典型實例
該準(zhǔn)則在某軟件中以“if(tbc&0x80==0x80)”的形式違背了,導(dǎo)致當(dāng)tbc=0x80時條件判別走不成立的分支。正確的寫法應(yīng)該是“if((tbc&0x80)==0x80)”。exam799第99頁,共123頁,2023年,2月20日,星期日“4.12.1.2禁止對指針變量賦值類型不匹配”(二院補充)的典型實例在某軟件中,變量定義如下:unsignedlong*p;unsignedcharq[50];程序中有如下的使用:p=&q[1];100第100頁,共123頁,2023年,2月20日,星期日“4.2.1.4邏輯表達式的連接必須使用括號”的典型實例在某軟件中if((S1[0].Coun<7&&S1[0].Coun>=1)||(S1[1].Coun<7&&S1[1].Coun>=1)&&(B3Leav==7)){……}從程序結(jié)構(gòu)上猜想,應(yīng)該是:在(B3Leav==7)條件下,或(S1[0].Coun<7&&S1[0].Coun>=1)或(S1[0].Coun<7&&S1[0].Coun>=1)如果是此,就應(yīng)該if(((S1[0].Coun<7&&S1[0].Coun>=1)||(S1[1].Coun<7&&S1[1].Coun>=1))&&(B3Leav==7)){……}101第101頁,共123頁,2023年,2月20日,星期日“4.6.1.9賦值類型必須匹配”的典型實例
在某軟件中ADData[]是定義為signedchar類型,程序中:
ADData[i]=(signedchar)*AD402;/*讀12位帶符號的AD采樣值*/
ADData[i]=ADData[i]&0xfff;在標(biāo)準(zhǔn)C中,signedchar類型變量是8位的,有效范圍[-128,127],對8位變量賦12位數(shù)值在標(biāo)準(zhǔn)C中是取后8位。ADData[]應(yīng)定義為int類型。
102第102頁,共123頁,2023年,2月20日,星期日“4.6.1.2數(shù)組的使用必須保證不會出現(xiàn)越界”的典型實例在某軟件中是如下定義的:unsignedcharYkd[6];但程序中是如下使用的:
for(n=0;n<7;n++){Ykd[n]=0x0;按定義,Ykd只有6個元素,即Ykd[0]、Ykd[1]、……、Ykd[5],而是使用中卻用到了Ykd[6]。103第103頁,共123頁,2023年,2月20日,星期日“4.14.1.5禁止對無符號數(shù)進行大于等于零或小于零的比較”(二院補充)的典型實例在某軟件中有如下語句:unsignedlongs_addr;s_addr=(unsignedlong)hostGetByName(compName);while(s_addr==ERROR)ERROR在vxWorks.h被定義為-1,用unsignedlong類型數(shù)與ERROE進行比較總是不成立的。104第104頁,共123頁,2023年,2月20日,星期日“4.13.1.4變量使用前必須被賦過值”的典型實例
在某軟件中,voidPara_check(){intk;while(k<4){……k++;}顯然對變量k未賦初值就進行while(k<4)的使用。k未賦初值并不意味著就等于0,有可能是一隨機數(shù)。在某臺式機的VC6.0中,k的初值為0xcccccccc,此時while(k<4)上來就不滿足。105第105頁,共123頁,2023年,2月20日,星期日“4.13.1.4變量使用前必須被賦過值”(二院的細(xì)化:4.13.1.4(1)變量使用前必須被賦過值(禁止只是條件賦值))的典型實例在某軟件中有如下語句:
inttest_start(void){intflag,sum;sum=…;if(sum==400){......flag=NO_RESPOND;}returnflag;}106第106頁,共123頁,2023年,2月20日,星期日專業(yè)代碼規(guī)則檢查輔助工具簡介107第107頁,共123頁,2023年,2月20日,星期日LDRATestbed(準(zhǔn)則多)PRQAQAC(準(zhǔn)則多)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024酒店土建工程合同績效考核與獎勵合同
- 2025至2030年中國聚丙烯液面覆蓋球數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國治療用綠膿桿菌菌苗數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國柚木書柜數(shù)據(jù)監(jiān)測研究報告
- 2025年度餐飲店食品安全管理制度合同范本3篇
- 安全柵基礎(chǔ)知識
- 2024電視節(jié)目制作與播出合同
- 幼兒園信息技術(shù)培訓(xùn)總結(jié)
- 二零二五年度電梯設(shè)備采購與節(jié)能評估合同3篇
- 幼兒園班本課程活動
- 高處作業(yè)風(fēng)險及隱患排查(安全檢查)清單
- 五年級口算1000題(打印版)
- 服務(wù)器自動化擴容與縮容解決方案
- 團意險項目招標(biāo)書
- 城市軌道-城軌交通車輛制動系統(tǒng)故障與檢修
- (郭伯良)兒童青少年同伴關(guān)系評級量表
- 煙道加強肋計算書(樣本)
- 登高平臺梯安全操作保養(yǎng)規(guī)程
- 土力學(xué)與地基基礎(chǔ)(課件)
- ERP沙盤模擬經(jīng)營實訓(xùn)報告
- 人傷理賠專業(yè)試卷
評論
0/150
提交評論