左萬娟 虞礪琨黃 晨董 燕
1.北京控制工程研究所,北京100190 2.北京軒宇信息技術有限公司, 北京 100190
軟件缺陷指軟件產品中存在的問題,最終表現為用戶所需要的功能沒有完全實現,不滿足用戶的需求[1]。從產品內部看,軟件缺陷是軟件產品開發或維護過程中存在的錯誤、毛病等各種問題;從產品外部看,軟件缺陷是系統需要實現的某種功能的失效或違背[2]。
在目前的軟件測試工程實踐中,針對代碼審查環節,一般都是通過對缺陷的分類、建模,形成代碼檢查單,并依據代碼檢查單開展代碼審查活動,從而查找軟件中的未知缺陷。其相關研究參見文獻[3-13]。但是,通過該方式形成的代碼檢查單,大部分是面向全部代碼的,缺乏與特定代碼操作特征之間的關聯性,導致在工程實踐中,未能充分發揮檢查單的最大效能。
從作為代碼基本構成要素的變量出發,專注于研究基于變量操作特征分析的軟件缺陷模式。通過對變量的共性操作特征以及分類操作特征的分析,分別提取與之相關聯的缺陷模式,建立了缺陷模式與變量操作特征之間的關聯性,構建了基于變量操作特征分析的軟件缺陷模式集。依據該缺陷模式集,在軟件測試的工程實踐中,可以針對變量的特定操作開展分析,按圖索驥,查找特定的缺陷,從而使軟件測試活動更加有的放矢,提高測試質量和效率。在編碼階段,軟件開發人員也可以參考該模式集,在編碼階段有效規避缺陷。
為使研究工作有的放矢,對中國空間技術研究院軟件產品保證中心航天器軟件第三方評測缺陷數據庫[14]中的萬余條軟件缺陷的處理方式進行了統計分析,結果如表1。

表1 缺陷處理方式統計分析
從缺陷相關因素的角度,對表1中以修改程序方式更正的缺陷進行分類分析,結果如表2。

表2 修改程序缺陷分析
對表2中的缺陷相關因素說明如下:
1)需求相關:將文實不一致(即,代碼實現與需求規定不符)、需求未實現、設計無依據等軟件缺陷,均歸類為需求相關缺陷。此類軟件缺陷主要通過核對軟件需求來識別;
2)變量相關:將與變量操作相關的軟件缺陷,均歸類為變量相關缺陷。此類軟件缺陷主要通過分析變量操作來識別,缺陷本身與需求關聯性較小。具體可見本文第2-3節的闡述;
3)邏輯相關:將與代碼邏輯相關的軟件缺陷,均歸類為邏輯相關缺陷。比較典型的邏輯相關缺陷包括代碼設計存在自相矛盾、if-else分支結構設計導致if和else工況并發時的處理缺失及循環計數變量的計數周期與循環處理函數調用周期不一致導致未能實現所有計數情況下的遍歷處理,等等。此類軟件缺陷主要通過分析代碼邏輯來識別,缺陷本身與需求關聯性較?。?/p>
4)其它:將無法歸入以上3類的軟件缺陷,歸類為其它缺陷。
可以看出,除了需求相關缺陷之外,變量相關缺陷占比最大。因此,有必要針對變量相關的軟件缺陷開展專題研究,建立軟件缺陷與變量操作特征之間的關聯性,以提高變量相關缺陷的檢出效率,提高軟件質量。
定義、初始化及讀寫操作,這些是所有變量都具有的共性操作。針對這些共性操作,需要根據其操作特點,分別加以分析。
2.1.1 變量定義的操作特征分析
變量定義確定了變量的數據類型,個別變量定義時還指定了變量的絕對存儲地址。針對變量定義,應重點分析如下操作特征:
1)變量定義的數據類型是否滿足變量所要表示的數據范圍和精度的要求;
2)指針變量所指向的地址區域是否滿足指針變量的使用要求。比如,軟件利用指針變量實現外部RAM區自檢,但是定義該指針變量指向內部RAM區,導致外部RAM區自檢未實現;
3)變量定義時所指定的絕對存儲地址是否正確。比如,絕對地址相互覆蓋導致變量被意外改寫、絕對地址定義順序與遙測組包順序不符導致按地址順序取數組包后遙測結果錯誤,等等。
2.1.2 變量初始化的操作特征分析
變量初始化是正確使用變量的前提,針對變量初始化,應重點分析如下操作特征:
1)變量使用前是否被賦予了特定的初值。即代碼中不應存在變量未初始化就使用的情況;
2)初值設置是否合理。某些情況下,變量的初值不是由需求規定的,而是由變量的使用邏輯所決定。此類情況下,初值設置應與變量使用邏輯相符。比如,當需要根據上位機指令驅動執行某項功能時,則應初始化設置標志變量為FALSE,在收到上位機指令后再修改標志變量為TRUE,從而在指令驅動下使能該項功能的執行。
2.1.3 變量讀寫的操作特征分析
讀寫操作是對變量的基本操作,針對變量讀寫,應重點分析如下操作特征:
1)操作完整性:代碼中應當有對變量的讀和寫操作。僅讀和僅寫是典型的操作不完整的體現;
2)操作位置準確性:代碼中應在恰當的位置對變量進行讀、寫操作,以正確實現變量所承載的物理意義。比如,狀態變量設置位置不當,導致變量未能正確記錄軟件運行狀態,等等;
3)操作銜接性:變量均承載了特定的物理意義。特殊情況下,當一個變量承載多個物理意義時,要求操作上必須做好銜接,避免因多個物理意義導致的操作混亂。
通過上述變量共性操作的特征分析,建立與變量共性操作特征相關聯的缺陷模式集如表3。

表3 基于變量共性操作特征的缺陷模式集
本節從變量的使用特點及其所承載的物理意義出發,對變量進行了分類,并基于各類變量的操作特征,進行了分析及缺陷建模。
3.1.1 標志變量的操作特征分析
標志變量指用于表征軟件特定運行條件、或運行狀態是否有效的變量,在代碼中通常表現為2種狀態:有效和無效。針對標志變量,應重點分析如下操作特征:
1)標志變量設置位置分析:標志變量應在恰當的位置被設置為有效,以正確表征軟件運行狀態;
2)標志變量清除位置分析:標志變量的有效狀態應在恰當的位置被予以清除,以正確表征軟件運行狀態;
3)標志變量讀狀態分析:通過對標志變量寫操作的全局分析,確認標志變量讀操作時是否可以讀到相應的狀態。比如,標志變量的置TRUE與置FALSE操作存在相互覆蓋,導致讀變量時讀到的始終是TRUE、或始終是FALSE;
4)標志變量操作完整性分析:一般來說,針對標志變量,代碼中應進行置TRUE、置FALSE和判斷設計。否則,極有可能存在設計缺陷。
3.1.2 計數變量的操作特征分析
計數變量是指用于實現特定條件下計數功能的變量。針對計數變量,應重點分析如下操作特征:
1)計數條件是否具備:不具備計數條件,意味著計數變量未實現設計目的。比如,計數操作在定時器中斷中完成,由于初始化階段尚未開啟定時器中斷,即,計數條件不具備,計數未能累加,導致初始化階段以計數閾值作為while循環退出條件的設計失效;
2)計數條件與計數操作是否匹配:即,是否在特定條件下執行了特定的計數操作;
3)是否進行了必要的清零設計:多數情況下,計數變量需要在特定條件下清零;
4)清零設計是否合理:計數變量的清零操作是否滿足特定條件;
5)是否采取了計數溢出的保護措施:計數溢出必將導致對計數變量的判斷結果錯誤,因此,必須分析計數溢出的可能性并設計必要的保護措施。
3.1.3 運算變量的操作特征分析
運算變量是指參與加、減、乘和除等各類數學運算的變量。針對運算變量,應重點分析如下操作特征:
1)參與運算的數據與變量數據類型是否匹配:數據類型不匹配將導致運算結果未實現既定的設計目的。比如,對32位無符號變量進行溢出保護設計時,引入4294967295.0參與運算,導致運算結果自動提升為浮點型、溢出保護設計失效,此時應引入4294967295(即0xFFFFFFFF)參與運算;
2)參與運算的多個變量的數據類型是否匹配:變量數據類型不匹配將導致運算結果未實現既定的設計目的;
3)運算是否溢出:運算溢出常見于無符號變量的小數減大數操作、乘除運算順序設計不當等;
4)變量數據類型是否滿足運算過程及運算結果的表示范圍;
5)運算過程是否導致精度受損:運算過程設計不當將導致運算結果達不到預期的精度要求。比如,先對整型變量進行除法運算,再將運算結果轉換為浮點數,導致運算精度受損;
6)是否存在除0運算:代碼中存在除法運算時,應分析除數是否存在等于0的情況。
3.1.4 位操作變量的操作特征分析
位操作變量是指參與移位、位與、位或等操作的變量。針對位操作變量,應重點分析如下操作特征:
1)移位操作是否導致結果溢出。
2)位與、位或操作是否破壞了不應被改變的位值。
3)有符號變量移位結果是否達到預期設計目的。比如,變量取值為負時,右移操作后高位填1,這可能不是預期的設計結果。
3.1.5 遙測變量的操作特征分析
遙測變量是指需要按照遙測協議組包后通過遙測通道下傳至地面的變量。針對遙測變量,應重點分析如下操作特征:
1)遙測拼接分析:大規模軟件,受遙測通道的限制,經常需要將多個變量拼接為一路遙測(比如,8bit字節,或16bit字)后下傳。針對遙測拼接設計,首先要分析拼接結果是否包含了各個拼接變量的有效位,其次要分析拼接過程是否存在各個變量有效位之間的相互覆蓋;
2)遙測量綱/當量分析:為滿足遙測分配及地面解析的需要,遙測量綱/當量經常與參與運算及控制過程的變量量綱/當量不同,因此需要特別加以分析;
3)遙測組包時機分析:遙測組包時機應確保能取到預期的遙測變量值;
4)遙測設計合理性分析:比如,當多個遙測變量共用一路遙測時,通常會引發遙測狀態的混淆;
5)多路組合遙測分析:當多路遙測之間具有關聯性時,應確保關聯性不被破壞。
3.1.6 條件變量的操作特征分析
條件變量是指變量的不同取值分別代表不同的物理意義、且代碼中有對該變量的條件判斷設計。針對條件變量,應重點分析如下操作特征:
1)條件判斷設計應確保涵蓋變量不同取值所對應的所有物理意義,即,針對變量物理意義的條件判斷設計應具有完整性的特征;
2)條件判斷設計應與變量取值相匹配;
3)條件判斷設計邏輯應合理,不會導致判斷結果始終為真或始終為假。
3.1.7 地址變量的操作特征分析
地址變量是指所承載的物理意義為地址的變量,多見于內存修改、內存下傳、程序修改等相關功能處理,涉及到的變量物理意義多為起始地址、結束地址、操作長度等。針對地址變量,應重點分析如下操作特征:
1)結束地址計算是否正確:當指定起始地址和操作長度的情況下,應加強對結束地址計算的正確性分析;
2)地址有效范圍判斷設計是否合理:為確保操作地址在有效范圍內,應根據起始地址、操作長度、結束地址的物理關聯性設計合理的地址合法性判斷條件;
3)地址是否為4字節對齊:在字長為32bit的CPU代碼中,一般要求操作地址應為4字節對齊。
3.1.8 量綱變量的操作特征分析
量綱變量是指所承載的物理意義帶有指定量綱的變量。針對量綱變量,應重點分析如下操作特征:
1)量綱的一致性分析:參與運算或比較的多個變量的量綱應一致;
2)量綱轉換的正確性分析:當參與運算或比較的多個變量的量綱不一致時,代碼中是否進行了正確的量綱轉換。
3.1.9 指針變量的操作特征分析
指針變量是指定義為指針類型的變量。針對指針變量,應重點分析如下操作特征:
1)指針變量賦值是否正確:應確保指針變量指向正確的操作地址;
2)指針代數運算是否正確:當代碼中利用指針代數運算進行特定地址訪問時,必須確保指針代數運算的正確性。
3.1.10 數組變量的操作特征分析
數組變量是指定義為數組的變量。
針對數組變量,重點分析數組下標的取值是否會導致對數組的讀寫訪問越界,要注意分析各個操作場景下數組下標的所有可能取值情況。數組訪問越界比較常見于如下3種情況:
1)初始化數組元素個數超過數組大??;
2)以立即數為數組下標時,立即數取值超過數組大?。?/p>
3)以變量為數組下標時,對變量取值范圍未采取合理的限定措施導致變量取值超過數組大小。
3.1.11 宏定義變量的操作特征分析
宏定義變量是指通過宏定義方式定義的變量。代碼設計中使用宏定義的最大好處是利于代碼維護。針對宏定義變量,應重點分析如下操作特征:
1)宏定義是否與使用相匹配:比如,宏定義TRUE為0x55、FALSE為0xAA,函數返回TRUE/FALSE,代碼中判斷函數返回值是否為0,從而導致判斷結果唯一(始終不為0),條件判斷設計失效;
2)已有宏定義則不應再使用立即數:主要為了避免后期修改宏定義后未同步修改立即數而導致立即數使用錯誤;
3)不應混用取值相同的宏定義:主要為了避免修改其中一個宏定義時,引發不良后果。
3.1.12 相似變量的操作特征分析
相似變量指具有相似的物理意義、且定義名稱相似的變量。
相似變量的設計缺陷多由克隆代碼引入。相似變量使用混淆問題在代碼中屢見不鮮。
通過上述變量分類操作的特征分析,建立與變量分類操作特征相關聯的缺陷模式集(見表4)。

表4 基于變量分類操作特征的缺陷模式集

續表4 基于變量分類操作特征的缺陷模式集
為檢驗本文所構建的基于變量操作特征分析的軟件缺陷模式集在軟件測試實踐中的應用效果,對3個不同專業背景的軟件開展了應用前、后的測試效果比對,比對結果如表5。

表5 應用前后變量相關缺陷數目對比
可見,將本文所構建的基于變量操作特征分析的軟件缺陷模式集應用于工程實踐后,測試過程中發現的變量相關缺陷的數目得到了提升。
目前,該缺陷模式集已在航天器軟件第三方評測的工程實踐中推廣使用。
從作為代碼基本構成要素的變量出發,研究構建了基于變量操作特征分析的軟件缺陷模式集,這種與變量操作特征相關聯的軟件缺陷建模思路在國內外的相關研究中尚屬首例。通過工程實踐應用證明,本文研究成果提高了變量相關缺陷的檢出效率,從而有效提高了軟件缺陷的整體檢出效率。后續工作中,將以本文研究成果為基礎,研究開發基于變量操作特征分析的自動化缺陷檢測工具,從而進一步提高軟件測試的效率。