張怡然 唐躍川 譚凱
摘 ?要: 軟件代碼的靜態(tài)分析是一種針對代碼的自動驗(yàn)證的非常有效的方法,其目的是在不運(yùn)行代碼的情況下,通過分析軟件代碼本身的語法和數(shù)據(jù)流,檢查代碼是否滿足安全性和可靠性要求。為控制程序的復(fù)雜性,便于后期的檢測與維護(hù),《GJBZ 102A-2012 軍用軟件安全性設(shè)計(jì)指南》對軟件的復(fù)雜性提出了控制要求,對此引入U(xiǎn)nderstand軟件對程序代碼的模塊規(guī)模進(jìn)行分析。在分析Understand軟件及其在分析程序代碼后生成的TXT文件后,設(shè)計(jì)一種統(tǒng)計(jì)工具,利用C++語言對文件中的數(shù)據(jù)進(jìn)行篩選,提取所需數(shù)據(jù)并對其進(jìn)行處理,以此提高靜態(tài)分析時的工作效率。
關(guān)鍵詞: 軟件質(zhì)量;軟件可靠性;靜態(tài)度量;信息統(tǒng)計(jì);C++
中圖分類號: TP31 ? ?文獻(xiàn)標(biāo)識碼: A ? ?DOI:10.3969/j.issn.1003-6970.2020.08.027
本文著錄格式:張怡然,唐躍川,譚凱. 軟件質(zhì)量靜態(tài)度量信息統(tǒng)計(jì)工具的設(shè)計(jì)與實(shí)現(xiàn)[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 ?引言
靜態(tài)分析工具主要檢查源代碼中的變量、模塊接口的一致性、邏輯上可能存在的錯誤結(jié)構(gòu)和不可達(dá)的程序段等[1-2]。大部分靜態(tài)分析軟件無法對程序進(jìn)行詳盡的復(fù)雜度分析,引入的Understand軟件不僅可以分析多種編程語言,也可以對程序的復(fù)雜度、扇入扇出等方面進(jìn)行分析。
Understand是一款內(nèi)部支持代碼編輯器和代碼分析器的靜態(tài)程序代碼審查軟件,該軟件可以將分析結(jié)果以圖表,文檔,架構(gòu)圖等形式呈現(xiàn)[3],但是由于其生成的結(jié)果信息非常散亂,且不直觀,尤其在統(tǒng)計(jì)函數(shù)扇出個數(shù)時,需要通過人工的方式,肉眼觀察和統(tǒng)計(jì)調(diào)用的函數(shù)個數(shù)來獲取扇出信息,這種工作方式效率極低,容易出錯,而且,面對大型項(xiàng)目時,基本不具備可操作性。為增加工程實(shí)踐的可操作性,本文提供了一種可以識別、分析、提取和統(tǒng)計(jì)結(jié)果信息的工具,高效完成對代碼質(zhì)量靜態(tài)度量信息的統(tǒng)計(jì)和直觀呈現(xiàn)。
本文將從實(shí)際出發(fā),制定相應(yīng)的技術(shù)要求方案,針對Understand軟件輸出的結(jié)果文件中的散亂的數(shù)據(jù)信息進(jìn)行識別和讀取、讀取和分析,并分別通過GUI(Graphical User Interface)界面和Excel文件形式進(jìn)行顯示。同時,為保證對歷史信息的可追溯性以及多次分析結(jié)果的效果比對,設(shè)計(jì)使用CSV文件對歷次操作信息進(jìn)行存儲。
1 ?數(shù)據(jù)的讀取和處理
1.1 ?數(shù)據(jù)的識別與讀取
Understand軟件輸出的TXT文檔包含20份report內(nèi)容,其中,F(xiàn)ile Contents Report部分包含了被檢查代碼的文件名信息;Program Unit Complexity Report部分能包含了被檢查代碼的函數(shù)圈復(fù)雜度信息;File Metrics部分包含了被檢查代碼的行數(shù)、注釋行數(shù)以及無效代碼行數(shù)等信息;Simple Invocation Tree Report部分包含了被檢查代碼的函數(shù)扇出信息;Program Unit Metrics report 部分包含了被檢查代碼的函數(shù)個數(shù)信息;Data Dictionary Summary Report部分包含了被調(diào)用函數(shù)所在的文件名信息。根據(jù)《GJBZ 102A-2012軍用軟件安全性設(shè)計(jì)指南》相關(guān)部分的要求,以上內(nèi)容是需要識別、讀取和處理的信息。
統(tǒng)計(jì)工具采用C++編程語言對文本信息進(jìn)行數(shù)據(jù)的識別、讀取和處理。首先定義一個CStdioFile類的File,并將File與待測文件關(guān)聯(lián),調(diào)用.Find()函數(shù)查找關(guān)鍵字符串,如:“Cyclomatic”、“Lines”、“|”等,然后獲取所需數(shù)據(jù)并將數(shù)據(jù)存入vector類型容器中,完成數(shù)據(jù)的讀取。圖1為數(shù)據(jù)讀取流程圖。
1.2 ?數(shù)據(jù)的處理
1.2.1 ?數(shù)據(jù)的統(tǒng)計(jì)處理
在結(jié)束讀取需要進(jìn)行數(shù)據(jù)提取的report信息后,對存儲相應(yīng)數(shù)據(jù)的vector容器進(jìn)行運(yùn)算,通過使用.accumulate()對vector容器進(jìn)行求和處理,獲得代碼的圈復(fù)雜度、函數(shù)行數(shù)和扇出個數(shù)的總和;通過.size()對vector容器的大小進(jìn)行計(jì)算,獲得代碼函數(shù)個數(shù)信息;有些統(tǒng)計(jì)結(jié)果需要極值數(shù)據(jù),通過max_element()對vector容器中的圈復(fù)雜度、函數(shù)行數(shù)、扇出個數(shù)等元素進(jìn)行極值處理,獲得所需項(xiàng)的最大值。
1.2.2 ?數(shù)據(jù)的排序處理
Understand軟件生成的TXT文件的數(shù)據(jù)是按照代碼函數(shù)調(diào)用的先后順序來進(jìn)行顯示的,因此,數(shù)據(jù)提取中所獲得的數(shù)據(jù)也是雜亂無章的。為保證最終顯示的不符合規(guī)范的函數(shù)能夠按照對應(yīng)數(shù)值的大小,由高到低次序輸出,這就需要對容器中的數(shù)據(jù)進(jìn)行排序處理。
為保證重新排序的數(shù)值能夠與函數(shù)名稱及文件名稱正確對應(yīng),需要定義一個結(jié)構(gòu)體,將統(tǒng)計(jì)后需要的函數(shù)名和對應(yīng)數(shù)值及文件名存入結(jié)構(gòu)體數(shù)組,最后通過sort()函數(shù)對數(shù)值進(jìn)行排序,對應(yīng)的函數(shù)和文件也能夠被正確排序。最后,將完成排序的數(shù)據(jù)存入vector容器中。
1.2.3 ?數(shù)據(jù)的輸出處理
統(tǒng)計(jì)排序處理完成后的數(shù)據(jù)需要進(jìn)行輸出處理,輸出內(nèi)容有以下幾種:
(1)GUI數(shù)據(jù)輸出
在GUI界面添加兩個ListCtrl表格:可顯示代碼的基本信息和度量值不符合標(biāo)準(zhǔn)的函數(shù)名稱,對應(yīng)數(shù)值以及源文件名稱。
在設(shè)計(jì)中對統(tǒng)計(jì)工具添加listCtrl可編輯功能,實(shí)現(xiàn)分析人員直接對界面信息的操作。圖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數(shù)據(jù)輸出
在進(jìn)行Excel輸出數(shù)據(jù)的操作時,需要設(shè)置Excel驅(qū)動,創(chuàng)建表格文件數(shù)據(jù)庫。然后,在表格文件數(shù)據(jù)庫中,進(jìn)行寫入數(shù)據(jù)信息的操作。圖3為Excel寫入數(shù)據(jù)的部分代碼。
for (i = 0; i < iColumnNum; i++)
{if (?。╩_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;
對于度量值不符合標(biāo)準(zhǔn)的Excel文件,設(shè)計(jì)添加兩個sheet頁用來存儲不合標(biāo)準(zhǔn)扇出和函數(shù)行數(shù)的數(shù)據(jù)信息,來實(shí)現(xiàn)文件輸出的簡潔性。
(3)CSV數(shù)據(jù)輸出
在文件處理中需要保證歷史數(shù)據(jù)的可查性,避免程序誤關(guān)后的數(shù)據(jù)遺失和重復(fù)操作等問題,實(shí)現(xiàn)可重用信息的提取和隔離[4]。通過對CSV文件的設(shè)計(jì)和編輯,設(shè)計(jì)CSV格式文件對系統(tǒng)的操作信息進(jìn)行存儲。
定義CStdioFile類File文件打開CSV格式文件,將操作時生成的數(shù)據(jù)存入文件,同時對文件添加追加功能,保證文件可以保存多次操作信息,最后在保存的信息中添加被統(tǒng)計(jì)的TXT文件的名稱,實(shí)現(xiàn)對數(shù)據(jù)的查詢操作。圖4為CSV文件寫入數(shù)據(jù)的部分代碼。
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 ?結(jié)果與分析
2.1 ?數(shù)據(jù)結(jié)果呈現(xiàn)
GUI是現(xiàn)代軟件的重要組成部分,其充分利用可復(fù)用的構(gòu)件,可以使開發(fā)人員更加節(jié)省時間[5]。通過界面設(shè)計(jì),在統(tǒng)計(jì)結(jié)束后,在GUI界面呈現(xiàn)出如圖5和6所示的最終數(shù)據(jù)結(jié)果。
2.2 ?性能效率分析
僅僅依靠以密集為特征的傳統(tǒng)手工測試,已經(jīng)不能滿足快節(jié)奏軟件開發(fā)和測試的需求[6]。自動化測試及統(tǒng)計(jì)為此提供了解決方案,同時通過驗(yàn)證可以確定:代碼基本信息中各數(shù)值統(tǒng)計(jì)值與實(shí)際值相同,函數(shù)名稱與數(shù)值和文件名稱能夠一一對應(yīng),CSV文件能夠存儲歷史操作信息。同時,通過大量的工程實(shí)踐也能夠看出統(tǒng)計(jì)工具能極大地提高工作效率。圖7為工具統(tǒng)計(jì)與人工統(tǒng)計(jì)花費(fèi)時間的對比示意圖。
3 ?結(jié)論
軟件測試是軟件開發(fā)生命周期的重要組成部分,也是目前和今后相當(dāng)長一段時間內(nèi)保證軟件質(zhì)量和可靠性的關(guān)鍵手段[7]。本文通過介紹軟件質(zhì)量靜態(tài)度量的重要性和必要性以及獲取這些信息的一般方法和工具,對設(shè)計(jì)和開發(fā)的統(tǒng)計(jì)工具的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)描述.在實(shí)際工程實(shí)踐中,人工統(tǒng)計(jì)與工具統(tǒng)計(jì)相比較而言,統(tǒng)計(jì)工具對生產(chǎn)效率有明顯的提升。通過比較人工統(tǒng)計(jì)和工具統(tǒng)計(jì)的時間,可以看出統(tǒng)計(jì)工具能夠在保證正確統(tǒng)計(jì)軟件質(zhì)量靜態(tài)度量信息的基礎(chǔ)上極大地提高工作效率,在工程應(yīng)用中具有較高的應(yīng)用價值。通過可視化技術(shù)將程序的內(nèi)部直觀顯示,有利于軟件的測試和分析[8],并且保證了軟件質(zhì)量。
參考文獻(xiàn)
[1] 張建. 精確的程序靜態(tài)分析[J]. 計(jì)算機(jī)學(xué)報(bào), 2008, 9(8): 1549-1553.
[2] 文昌辭, 王昭順. 軟件測試自動化靜態(tài)分析研究[J]. 計(jì)算機(jī)工程與設(shè)計(jì), 2005, 26(4): 987-989.
[3] 王相懂. 軟件靜態(tài)分析自動化工具的研究與實(shí)現(xiàn)[D]. 西安理工大學(xué), 2006.
[4] 簡崢峰, 譚建榮. 面向虛擬企業(yè)的應(yīng)用-基于可重用信息表達(dá)的CSV文件設(shè)計(jì)[J]. 浙江工業(yè)大學(xué)學(xué)報(bào), 2000, 7(28): 85-99.
[5] 謝偉偉. GUI軟件自動化測試工具的開發(fā)研究[D]. 大連海事大學(xué), 2008.
[6] 余公平. 軟件自動化測試系統(tǒng)的研究與實(shí)現(xiàn)[D]. 上海交通大學(xué), 2007.
[7] 姚礪, 束永安. 軟件測試自動化關(guān)鍵技術(shù)的研究[J]. 安徽大學(xué)學(xué)報(bào)(自然科學(xué)版), 2003, 27(4): 27-33.
[8] 陳哲. 軟件自動化測試系統(tǒng)的研究與實(shí)現(xiàn)[D]. 華中師范大學(xué), 2008.