本公開涉及用于測試計算機程序的方法。
背景技術(shù):
1、開發(fā)軟件應(yīng)用程序的重要組成部分是測試以及在找到錯誤時進行對應(yīng)的錯誤清除。尤其是,應(yīng)該識別并且校正導(dǎo)致應(yīng)用程序失敗的錯誤。在此,一個重要的方面是鑒于以下方面的測試,即并非無意地(或由攻擊者)訪問重要的存儲區(qū)域,即利用如通過所謂的(存儲器)sanitizer進行的存儲器監(jiān)視的測試。借助于各種sanitizer在例如x86的常見的臺式硬件和服務(wù)器硬件上編譯和測試軟件是可以發(fā)現(xiàn)以前長時間保持未被發(fā)現(xiàn)的諸如心臟出血漏洞(heartbleed-bug)之類錯誤的措施。
2、也一起包括這樣的存儲器監(jiān)視的綜合測試對于通常是安全性相關(guān)的嵌入式系統(tǒng)(諸如用于車輛的控制裝置)上的計算機程序而言是特別重要的。然而,因為嵌入式系統(tǒng)典型地擁有受限制的資源,并且這樣的sanitizer具有巨大的資源需求且因此不能被使用或者甚至可能影響計算機程序的執(zhí)行,使得最初就發(fā)生錯誤或錯誤保持未被發(fā)現(xiàn),所以對于這樣的系統(tǒng)不能使用或僅能很差地使用用于臺式硬件和服務(wù)器硬件的sanitizer。
技術(shù)實現(xiàn)思路
1、因此,能夠?qū)崿F(xiàn)存儲器監(jiān)視并且適用于嵌入式系統(tǒng)的用于測試計算機程序的方法是值得期望的。
2、根據(jù)各種實施方式,提供用于(自動地)測試計算機程序的方法,所述方法包括:在計算機程序中將一個或多個斷點設(shè)置到一個或多個字符串輸出指令上;執(zhí)行計算機程序;在觸發(fā)所設(shè)置的斷點之一時,確定提供給由相應(yīng)的字符串輸出指令調(diào)用的字符串輸出函數(shù)以用于輸出的字符串是否針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于所述計算機程序的一個或多個格式規(guī)范;以及響應(yīng)于確定出提供給字符串輸出函數(shù)以用于輸出的字符串針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于計算機程序的一個或多個格式規(guī)范,觸發(fā)顯示:計算機程序具有錯誤。
3、這可以對于在計算機程序中出現(xiàn)的每個或至少多個字符串輸出指令來進行(例如根據(jù)有多少斷點可供使用)。
4、上述方法使得能夠借助于調(diào)試器在嵌入式系統(tǒng)上利用對危險的字符串的檢測進行測試。因為模糊測試也可以以調(diào)試器控制的方式實現(xiàn),并且以這種方式可以有效地用于嵌入式系統(tǒng),所以這在利用模糊測試進行測試時特別適用。
5、sanitizer可以借助于代碼插樁(code-instrumentierung)來實現(xiàn)。但是為此要么源代碼必須可供使用,要么需要基于二進制文件進行特定于命令集的插樁(二進制插樁),所述特定于命令集的插樁是非常易受影響的。替代的基于仿真器的插樁同樣是非常特定于平臺的,并且每個嵌入式平臺都需要自身的仿真器。上述方法使得能夠利用調(diào)試器控制的sanitizer進行測試,并且不需要插樁或仿真,因此可在許多情況下應(yīng)用。
6、下面說明各種實施例。
7、實施例1是如上所述的用于測試計算機程序的方法。
8、實施例2是根據(jù)實施例1所述的方法,包括響應(yīng)于確定出提供給字符串輸出函數(shù)以用于輸出的字符串針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于所述計算機程序的一個或多個格式規(guī)范,通過觸發(fā)計算機程序的中止(即崩潰)來觸發(fā)顯示:計算機程序具有錯誤。
9、因此,例如在模糊測試的范圍中,計算機程序可以被標記為有錯誤的,因為其執(zhí)行引起計算機程序的中止(即崩潰),緊接著模糊器顯示錯誤。例如,還可以在stderr流上輸出警告,或在主機側(cè)(即在借助于調(diào)試器在執(zhí)行系統(tǒng)上測試計算機程序的測試系統(tǒng)上)監(jiān)視所述調(diào)試器。
10、實施例3是根據(jù)實施例1或2所述的方法,其中將用于至少一個所述字符串輸出指令的字符串作為指針提供給所調(diào)用的字符串輸出函數(shù)以用于輸出,并且確定所述字符串是否針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于計算機程序的一個或多個格式規(guī)范,其方式是檢驗所述指針指向的存儲區(qū)域的內(nèi)容是否包含用于計算機程序的一個或多個格式規(guī)范(以及必要時確定其數(shù)量并且與作為自變量一起提供給字符串輸出函數(shù)的值的數(shù)量進行比較)。
11、特別地,未顯式說明而是借助于指針說明的字符串提高了可以以這種方式檢測到的錯誤(以及取決于安全漏洞)的風(fēng)險。
12、實施例是根據(jù)示例性實施例1至3中任一項所述的方法,其中確定提供給由所調(diào)用的字符串輸出函數(shù)以用于輸出的字符串是否針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于計算機程序的一個或多個格式規(guī)范,其方式是在個體步驟中穿過由字符串輸出指令調(diào)用的字符串輸出函數(shù),并且在此過程中確定所提供的字符串。
13、這可以取決于存儲器輸出函數(shù)更好地或更簡單地實現(xiàn)字符串的確定。
14、實施例5是根據(jù)實施例1至4中任一項所述的方法,其中至少部分地借助于堆棧將字符串提供給針對至少一個所述字符串輸出指令的所調(diào)用的字符串輸出函數(shù),并且確定字符串是否針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于計算機程序的一個或多個格式規(guī)范,其方式是檢驗堆棧以確定提供給所調(diào)用的字符串輸出函數(shù)的字符串是否包含用于所述計算機程序的一個或多個格式規(guī)范(以及必要時確定其數(shù)量并且與作為自變量一起提供給字符串輸出函數(shù)的值的數(shù)量進行比較)。
15、例如,堆棧可以具有指向被檢驗的符號鏈的一個或多個指針。這使得即使在自變量的數(shù)量高到自變量寄存器對于所述自變量不足的情況下也可以進行檢驗。
16、實施例6是根據(jù)實施例1至5中任一項所述的方法,包括執(zhí)行多個測試遍歷(例如模糊測試測試遍歷,即模糊測試迭代)并且將斷點設(shè)置到對于不同的測試遍歷不同的字符串輸出指令上。
17、從而可以涵蓋大量的字符串輸出指令。
18、實施例7是根據(jù)實施例1至6中任一項所述的方法,包括在嵌入式系統(tǒng)上執(zhí)行計算機程序,并且通過與嵌入式系統(tǒng)(經(jīng)由調(diào)試接口)連接的測試系統(tǒng)執(zhí)行以下步驟:設(shè)置斷點,確定相應(yīng)的字符串是否針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于所述計算機程序的一個或多個格式規(guī)范,以及必要時觸發(fā)顯示:所述計算機程序具有錯誤。
19、根據(jù)各種實施方式,尤其是使得能夠在嵌入式系統(tǒng)本身上測試用于嵌入式系統(tǒng)的計算機程序,包括存儲器監(jiān)視在內(nèi)。
20、實施例8是根據(jù)實施例1至7中任一項所述的方法,其中所述計算機程序是用于機器人裝置的控制程序,并且根據(jù)計算機程序的測試的結(jié)果利用所述計算機程序來控制機器人裝置。
21、實施例9是一種測試裝置,所述測試裝置被設(shè)立用于執(zhí)行根據(jù)實施例1至8中任一項所述的方法。
22、實施例10是一種具有指令的計算機程序,當所述指令由處理器執(zhí)行時,所述指令引起所述處理器執(zhí)行根據(jù)實施例1至8中任一項所述的方法。
23、實施例11是一種存儲指令的計算機可讀介質(zhì),當所述指令由處理器執(zhí)行時,所述指令引起所述處理器執(zhí)行根據(jù)實施例1至8中任一項所述的方法。
1.一種用于測試計算機程序(105)的方法,所述方法包括:
2.根據(jù)權(quán)利要求1所述的方法,包括響應(yīng)于確定出提供給所述字符串輸出函數(shù)以用于輸出的字符串針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于所述計算機程序(105)的一個或多個格式規(guī)范,通過觸發(fā)所述計算機程序(105)的中止來觸發(fā)所述顯示:所述計算機程序(105)具有錯誤。
3.根據(jù)權(quán)利要求1或2所述的方法,其中將用于所述字符串輸出指令中的至少一個字符串輸出指令的字符串作為指針提供給所調(diào)用的字符串輸出函數(shù)以用于輸出,并且確定所述字符串是否針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于所述計算機程序(105)的一個或多個格式規(guī)范,其方式是檢驗所述指針指向的存儲區(qū)域的內(nèi)容是否包含用于所述計算機程序(105)的一個或多個格式規(guī)范。
4.根據(jù)權(quán)利要求1至3中任一項所述的方法,其中確定提供給所調(diào)用的字符串輸出函數(shù)以用于輸出的字符串是否針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于所述計算機程序(105)的一個或多個格式規(guī)范,其方式是在個體步驟中穿過由所述字符串輸出指令調(diào)用的字符串輸出函數(shù),并且在此過程中確定所提供的字符串。
5.根據(jù)權(quán)利要求1至4中任一項所述的方法,其中至少部分地借助于堆棧將所述字符串提供給針對所述字符串輸出指令中的至少一個字符串輸出指令所調(diào)用的字符串輸出函數(shù),并且確定所述字符串是否針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于所述計算機程序(105)的一個或多個格式規(guī)范,其方式是檢驗所述堆棧以確定提供給所調(diào)用的字符串輸出函數(shù)的字符串是否包含用于所述計算機程序(105)的一個或多個格式規(guī)范。
6.根據(jù)權(quán)利要求1至5中任一項所述的方法,包括執(zhí)行多個測試遍歷并且將斷點設(shè)置到對于不同的測試遍歷不同的字符串輸出指令上。
7.根據(jù)權(quán)利要求1至6中任一項所述的方法,包括:在嵌入式系統(tǒng)(106)上執(zhí)行所述計算機程序(105),并且通過與嵌入式系統(tǒng)(106)連接的測試系統(tǒng)(100)來執(zhí)行以下步驟:設(shè)置斷點,確定相應(yīng)的字符串是否針對與作為自變量一起提供給相應(yīng)字符串輸出函數(shù)相比更多的值包含用于所述計算機程序(105)的一個或多個格式規(guī)范;以及必要時觸發(fā)顯示:所述計算機程序(105)具有錯誤。
8.根據(jù)權(quán)利要求1至7中任一項所述的方法,其中所述計算機程序(105)是用于機器人裝置的控制程序,并且根據(jù)所述計算機程序(105)的測試的結(jié)果利用所述計算機程序(105)來控制所述機器人裝置。
9.一種測試裝置,所述測試裝置被設(shè)立用于執(zhí)行根據(jù)權(quán)利要求1至8中任一項所述的方法。
10.一種具有指令的計算機程序,當所述指令由處理器執(zhí)行時,所述指令引起所述處理器執(zhí)行根據(jù)權(quán)利要求1至8中任一項所述的方法。
11.一種存儲指令的計算機可讀介質(zhì),當所述指令由處理器執(zhí)行時,所述指令引起所述處理器執(zhí)行根據(jù)權(quán)利要求1至8中任一項所述的方法。