¹9-8 :認真處理程序所能遇到的各種出錯情況
¹9-9 :系統運行之初,要初始化有關變量及運行環境,防止未經初始化的變量被引用
¹9-10 :系統運行之初,要對加載到系統中的數據進行一致性檢查
說明:使用不一致的數據,容易使系統進入混亂狀態和不可知狀態。
¹9-11 :嚴禁隨意更改其它模塊或系統的有關設置和配置
說明:編程時,不能隨心所欲地更改不屬于自己模塊的有關設置如常量、數組的大小等。
¹9-12 :不能隨意改變與其它模塊的接口
¹9-13 :充分了解系統的接口之后,再使用系統提供的功能
示例:在B型機的各模塊與操作系統的接口函數中,有一個要由各模塊負責編寫的初始化過程,此過程在軟件系統加載完成后,由操作系統發送的初始化消息來調度。因此就涉及到初始化消息的類型與消息發送的順序問題,特別是消息順序,若沒搞清楚就開始編程,很容易引起嚴重后果。以下示例引自B型曾出現過的實際代碼,其中使用了FID_FETCH_DATA與FID_INITIAL初始化消息類型,注意B型機的系統是在FID_FETCH_DATA之前發送FID_INITIAL的。
MID alarm_module_list[MAX_ALARM_MID];
int FAR SYS_ALARM_proc( FID function_id, int handle )
{
_UI i, j;
switch ( function_id )
{
... // program code
case FID_INITAIL:
for (i = 0; i < MAX_ALARM_MID; i++)
{
if (alarm_module_list[i]== BAM_MODULE // **)
|| (alarm_module_list[i]== LOCAL_MODULE)
{
for (j = 0; j < ALARM_CLASS_SUM; j++)
{
FAR_MALLOC( ... );
}
}
}
... // program code
break;
case FID_FETCH_DATA:
... // program code
Get_Alarm_Module( ); // 初始化alarm_module_list
break;
... // program code
}
}
由于FID_INITIAL是在FID_FETCH_DATA之前執行的,而初始化alarm_module_list是在FID_FETCH_DATA中進行的,故在FID_INITIAL中(**)處引用alarm_module_list變量時,它還沒有被初始化。這是個嚴重錯誤。
應如下改正:要么把Get_Alarm_Module函數放在FID_INITIAL中(**)之前;要么就必須考慮(**)處的判斷語句是否可以用(不使用alarm_module_list變量的)其它方式替代,或者是否可以取消此判斷語句。
¹9-14 :編程時,要防止差1 錯誤
說明:此類錯誤一般是由于把“<=”誤寫成“<”或“>=”誤寫成“>”等造成的,由此引起的后果,很多情況下是很嚴重的,所以編程時,一定要在這些地方小心。當編完程序后,應對這些操作符進行徹底檢查。
¹9-15 :要時刻注意易混淆的操作符。當編完程序后,應從頭至尾檢查一遍這些操作符,以防止拼寫錯誤
說明:形式相近的操作符最容易引起誤用,如C/C++中的“=”與“==”、“|”與“||”、“&”與“&&”等,若拼寫錯了,編譯器不一定能夠檢查出來。
示例:如把“&”寫成“&&”,或反之。
ret_flg = (pmsg->ret_flg & RETURN_MASK);
被寫為:
ret_flg = (pmsg->ret_flg && RETURN_MASK);
rpt_flg = (VALID_TASK_NO( taskno ) && DATA_NOT_ZERO( stat_data ));
被寫為:
rpt_flg = (VALID_TASK_NO( taskno ) & DATA_NOT_ZERO( stat_data ));
¹9-16 :有可能的話,if 語句盡量加上else 分支,對沒有else 分支的語句要小心對待;switch 語句必須有default 分支
¹9-17 :Unix 下,多線程的中的子線程退出必需采用主動退出方式,即子線程應return 出口。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/