張怡然 唐躍川 譚凱



摘 ?要: 軟件代碼的靜態分析是一種針對代碼的自動驗證的非常有效的方法,其目的是在不運行代碼的情況下,通過分析軟件代碼本身的語法和數據流,檢查代碼是否滿足安全性和可靠性要求。為控制程序的復雜性,便于后期的檢測與維護,《GJBZ 102A-2012 軍用軟件安全性設計指南》對軟件的復雜性提出了控制要求,對此引入Understand軟件對程序代碼的模塊規模進行分析。在分析Understand軟件及其在分析程序代碼后生成的TXT文件后,設計一種統計工具,利用C++語言對文件中的數據進行篩選,提取所需數據并對其進行處理,以此提高靜態分析時的工作效率。
關鍵詞: 軟件質量;軟件可靠性;靜態度量;信息統計;C++
中圖分類號: TP31 ? ?文獻標識碼: A ? ?DOI:10.3969/j.issn.1003-6970.2020.08.027
本文著錄格式:張怡然,唐躍川,譚凱. 軟件質量靜態度量信息統計工具的設計與實現[J]. 軟件,2020,41(08):94-96
【Abstract】: The static analysis of program code is a very effective method for automatic verification of programs. The purpose is to check whether the code meets security and reliability by analyzing the syntax and data flow of the program code itself without running the code. In order to control the complexity of the program and facilitate the later detection and maintenance, GJBZ 102A-2012 The military software security design guide puts forward control requirements for the complexity of the software. Understand is introduced to analyze the module size of the program code. This article will focus on analyzing the statistical files generated by Understand software analysis program code, using C++ language to filter the data in the file, ignoring the useless information, extracting and processing the required data in order to improve the work efficiency in static analysis.
【Key words】: Software quality; Software reliability; The static measurement; Information statistics; C++
0 ?引言
靜態分析工具主要檢查源代碼中的變量、模塊接口的一致性、邏輯上可能存在的錯誤結構和不可達的程序段等[1-2]。大部分靜態分析軟件無法對程序進行詳盡的復雜度分析,引入的Understand軟件不僅可以分析多種編程語言,也可以對程序的復雜度、扇入扇出等方面進行分析。
Understand是一款內部支持代碼編輯器和代碼分析器的靜態程序代碼審查軟件,該軟件可以將分析結果以圖表,文檔,架構圖等形式呈現[3],但是由于其生成的結果信息非常散亂,且不直觀,尤其在統計函數扇出個數時,需要通過人工的方式,肉眼觀察和統計調用的函數個數來獲取扇出信息,這種工作方式效率極低,容易出錯,而且,面對大型項目時,基本不具備可操作性。為增加工程實踐的可操作性,本文提供了一種可以識別、分析、提取和統計結果信息的工具,高效完成對代碼質量靜態度量信息的統計和直觀呈現。
本文將從實際出發,制定相應的技術要求方案,針對Understand軟件輸出的結果文件中的散亂的數據信息進行識別和讀取、讀取和分析,并分別通過GUI(Graphical User Interface)界面和Excel文件形式進行顯示。同時,為保證對歷史信息的可追溯性以及多次分析結果的效果比對,設計使用CSV文件對歷次操作信息進行存儲。
1 ?數據的讀取和處理
1.1 ?數據的識別與讀取
Understand軟件輸出的TXT文檔包含20份report內容,其中,File Contents Report部分包含了被檢查代碼的文件名信息;Program Unit Complexity Report部分能包含了被檢查代碼的函數圈復雜度信息;File Metrics部分包含了被檢查代碼的行數、注釋行數以及無效代碼行數等信息;Simple Invocation Tree Report部分包含了被檢查代碼的函數扇出信息;Program Unit Metrics report 部分包含了被檢查代碼的函數個數信息;Data Dictionary Summary Report部分包含了被調用函數所在的文件名信息。根據《GJBZ 102A-2012軍用軟件安全性設計指南》相關部分的要求,以上內容是需要識別、讀取和處理的信息。
統計工具采用C++編程語言對文本信息進行數據的識別、讀取和處理。首先定義一個CStdioFile類的File,并將File與待測文件關聯,調用.Find()函數查找關鍵字符串,如:“Cyclomatic”、“Lines”、“|”等,然后獲取所需數據并將數據存入vector類型容器中,完成數據的讀取。圖1為數據讀取流程圖。
1.2 ?數據的處理
1.2.1 ?數據的統計處理
在結束讀取需要進行數據提取的report信息后,對存儲相應數據的vector容器進行運算,通過使用.accumulate()對vector容器進行求和處理,獲得代碼的圈復雜度、函數行數和扇出個數的總和;通過.size()對vector容器的大小進行計算,獲得代碼函數個數信息;有些統計結果需要極值數據,通過max_element()對vector容器中的圈復雜度、函數行數、扇出個數等元素進行極值處理,獲得所需項的最大值。
1.2.2 ?數據的排序處理
Understand軟件生成的TXT文件的數據是按照代碼函數調用的先后順序來進行顯示的,因此,數據提取中所獲得的數據也是雜亂無章的。為保證最終顯示的不符合規范的函數能夠按照對應數值的大小,由高到低次序輸出,這就需要對容器中的數據進行排序處理。
為保證重新排序的數值能夠與函數名稱及文件名稱正確對應,需要定義一個結構體,將統計后需要的函數名和對應數值及文件名存入結構體數組,最后通過sort()函數對數值進行排序,對應的函數和文件也能夠被正確排序。最后,將完成排序的數據存入vector容器中。
1.2.3 ?數據的輸出處理
統計排序處理完成后的數據需要進行輸出處理,輸出內容有以下幾種:
(1)GUI數據輸出
在GUI界面添加兩個ListCtrl表格:可顯示代碼的基本信息和度量值不符合標準的函數名稱,對應數值以及源文件名稱。
在設計中對統計工具添加listCtrl可編輯功能,實現分析人員直接對界面信息的操作。圖2為界面可編輯功能部分代碼。
m_ListCtrl.GetSubItemRect(m_row,m_column,LVIR_LABEL,rc);
m_edit.SetParent(&m_ListCtrl);
m_edit.MoveWindow(rc);
m_edit.SetWindowTextW(m_ListCtrl.GetItemText(m_row,m_column));
m_edit.SetFocus();
m_edit.ShowCaret();
m_edit.SetSel(-1);
(2)Excel數據輸出
在進行Excel輸出數據的操作時,需要設置Excel驅動,創建表格文件數據庫。然后,在表格文件數據庫中,進行寫入數據信息的操作。圖3為Excel寫入數據的部分代碼。
for (i = 0; i < iColumnNum; i++)
{if (!(m_ListCtrl.GetColumn(i,&lvCol)))
return;
if (i < iColumnNum - 1)
{sSql = sSql + lvCol.pszText + _T(" TEXT , ");
strInsert = strInsert + lvCol.pszText + _T(" , ");
}
else
{sSql = sSql + lvCol.pszText + _T(" TEXT ) "};
strInsert = strInsert + lvCol.pszText + _T(" ) ?VALUES ( ");
}
}
database.ExecuteSQL(sSql);
sSql = strInsert;
對于度量值不符合標準的Excel文件,設計添加兩個sheet頁用來存儲不合標準扇出和函數行數的數據信息,來實現文件輸出的簡潔性。
(3)CSV數據輸出
在文件處理中需要保證歷史數據的可查性,避免程序誤關后的數據遺失和重復操作等問題,實現可重用信息的提取和隔離[4]。通過對CSV文件的設計和編輯,設計CSV格式文件對系統的操作信息進行存儲。
定義CStdioFile類File文件打開CSV格式文件,將操作時生成的數據存入文件,同時對文件添加追加功能,保證文件可以保存多次操作信息,最后在保存的信息中添加被統計的TXT文件的名稱,實現對數據的查詢操作。圖4為CSV文件寫入數據的部分代碼。
if (pos == size1)
{str22="";
for (j = 0; j < iRowCount; j++)
{CString chTemp;
i = 1;
{
chTemp = m_ListCtrl.GetItemText(j, i);
str22+=chTemp;
str22+=str2;
}
}
2 ?結果與分析
2.1 ?數據結果呈現
GUI是現代軟件的重要組成部分,其充分利用可復用的構件,可以使開發人員更加節省時間[5]。通過界面設計,在統計結束后,在GUI界面呈現出如圖5和6所示的最終數據結果。
2.2 ?性能效率分析
僅僅依靠以密集為特征的傳統手工測試,已經不能滿足快節奏軟件開發和測試的需求[6]。自動化測試及統計為此提供了解決方案,同時通過驗證可以確定:代碼基本信息中各數值統計值與實際值相同,函數名稱與數值和文件名稱能夠一一對應,CSV文件能夠存儲歷史操作信息。同時,通過大量的工程實踐也能夠看出統計工具能極大地提高工作效率。圖7為工具統計與人工統計花費時間的對比示意圖。
3 ?結論
軟件測試是軟件開發生命周期的重要組成部分,也是目前和今后相當長一段時間內保證軟件質量和可靠性的關鍵手段[7]。本文通過介紹軟件質量靜態度量的重要性和必要性以及獲取這些信息的一般方法和工具,對設計和開發的統計工具的實現方法進行了詳細描述.在實際工程實踐中,人工統計與工具統計相比較而言,統計工具對生產效率有明顯的提升。通過比較人工統計和工具統計的時間,可以看出統計工具能夠在保證正確統計軟件質量靜態度量信息的基礎上極大地提高工作效率,在工程應用中具有較高的應用價值。通過可視化技術將程序的內部直觀顯示,有利于軟件的測試和分析[8],并且保證了軟件質量。
參考文獻
[1] 張建. 精確的程序靜態分析[J]. 計算機學報, 2008, 9(8): 1549-1553.
[2] 文昌辭, 王昭順. 軟件測試自動化靜態分析研究[J]. 計算機工程與設計, 2005, 26(4): 987-989.
[3] 王相懂. 軟件靜態分析自動化工具的研究與實現[D]. 西安理工大學, 2006.
[4] 簡崢峰, 譚建榮. 面向虛擬企業的應用-基于可重用信息表達的CSV文件設計[J]. 浙江工業大學學報, 2000, 7(28): 85-99.
[5] 謝偉偉. GUI軟件自動化測試工具的開發研究[D]. 大連海事大學, 2008.
[6] 余公平. 軟件自動化測試系統的研究與實現[D]. 上海交通大學, 2007.
[7] 姚礪, 束永安. 軟件測試自動化關鍵技術的研究[J]. 安徽大學學報(自然科學版), 2003, 27(4): 27-33.
[8] 陳哲. 軟件自動化測試系統的研究與實現[D]. 華中師范大學, 2008.