




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