專利名稱:源碼檢查器、方法、程序以及存儲介質的制作方法
技術領域:
本發(fā)明,涉及一種對與計算機程序的源碼所表示的程序的動作相關各個性質進行檢查的源碼檢查器以及源碼檢查方法、用來執(zhí)行該方法的程序、以及用來存儲該程序的存儲介質。
背景技術:
作為以往的源碼檢查器,有對與源碼所表示的程序(以下也稱作應用程序)的動作相關的諸性質進行檢查的源碼分析器。作為源碼分析器的例子,有使用模型檢查技術對源碼進行分析的源碼模型檢查器。
源碼所表示的應用程序的動作,是指按照源碼中所描述的一系列命令的、程序的一系列動作。與該動作相關的諸性質的例子,可以列舉出在動態(tài)確保存儲器的情況下必須釋放該存儲器的性質、在執(zhí)行了程序中的某個命令的情況下早晚必須要執(zhí)行對應的特定命令的性質等。
模型檢查是指,輸入表示要檢查的性質的規(guī)格與成為檢查對象的模型,判斷模型是否具有規(guī)格所表示的性質。進行模型檢查的裝置稱作模型檢查器,描述成為檢查對象的模型的稱為模型描述。用于描述模型的語言,根據模型檢查器而有所不同。例如,在模型檢查器SPIN的情況下,用來描述模型的語言稱作“Promela”。
模型檢查器SPIN,是對作為有限狀態(tài)遷移系統(tǒng)而模型化的系統(tǒng)是否滿足通過線性時間邏輯式所描述的檢查式以全狀態(tài)檢索進行網羅式檢查的檢查器。模型檢查器SPIN,例如公開在Gerard J.Holzmann,‘The modelChecker Spin’,IEEE Trans,On Software Engineering,Vol.23,No.5,May1997,pp.279-295。
源碼模型檢查,是指以源碼為檢查對象的模型檢查,是用來與以邏輯電路等硬件為對象的模型檢查即硬件模型檢查對比而使用的術語。
作為以往的源碼檢查器,有的使用用來將源碼翻譯成模型檢查器的輸入語言的變換表。這種構成,例如公開在美國專利申請公開第2001/037492號、美國專利申請公開第2002/100022號中。圖14為表示美國專利申請公開第2001/037492號中所記載的以往的源碼檢查器之構成的方框圖。
作為圖14中所示的以往的源碼檢查器的模型檢查器,從源碼輸入部1302輸入成為檢查對象的源碼1301。接下來,該源碼檢查器,在源碼變換表生成部1303中,基于由源碼輸入部1302所接收的源碼1301,構成控制流向圖。然后,對根據該控制流向圖成為檢查對象的源碼1301的各個語句,生成集合有通過對應的模型描述語言、例如Promela描述寫出的對譯例的源碼變換表1304。
接下來,模型描述生成部1305,使用源碼變換表1304中含有的對譯例,將源碼1301變換成模型描述語言。另外,規(guī)格輸入部1307,將記載有表示所輸入的要檢查的源碼1301的性質的規(guī)格的要檢查的規(guī)格1308,發(fā)送給模型檢查器執(zhí)行部1306。之后,模型檢查器執(zhí)行部1306,使用來自規(guī)格輸入部1307的規(guī)格1308、和模型描述生成部1305中所生成的模型描述,執(zhí)行模型檢查,并輸出檢查結果1309。
另外,在自動生成的源碼變換表1304不符合源碼模型檢查器使用者的意圖的情況下,使用者的修正機構1310需要對源碼變換表1304適當進行修正。例如,成為檢查對象的源碼1301,處理該源碼以外的、例如與外部模型間的通信等情況。源碼變換表生成部1303經常無法示出適當的翻譯例,需要使用者進行彌補。
源碼模型檢查中所使用的Promela等模型描述語言,與描述源碼的例如C語言等編程語言的表現(xiàn)力是不同的。具體的說,存在編程語言能夠描述,而模型描述語言無法描述的遷移條件。因此,本質上就很難將源碼所表示的動作準確地翻譯成模型描述語言,經常難以生成適當的源碼變換表。因此,存在的問題是,很多情況下無法獲得對成為檢查對象的源碼所表示的動作準確進行再現(xiàn)的模型描述,導致檢查不正確。
詳細說明的話,模型檢查按照以下順序進行根據模型的描述,生成標號有向圖(labeled directed graph),并對該圖是否滿足例如通過線性時間邏輯式等所給出的規(guī)格所表示的制約進行判斷。線性時間邏輯式,通過給命題邏輯式添加時間概念而構成,廣泛應用于對狀態(tài)遷移模型進行形式描述時等。
標號有向圖由頂點與邊的集合構成。各個邊表示兩個頂點間的關系,在連接頂點彼此的邊中存在朝向。也即,標號有向圖中,存在與邊的起點以及終點逐個對應的頂點,各個頂點中附有標號。
在將標號有向圖的各個頂點看作狀態(tài),將沿著邊的朝向移動頂點看作狀態(tài)遷移時,可以將標號有向圖看作狀態(tài)遷移圖。各個頂點的標號,能夠看作各個狀態(tài)下所產生的事件等。另外,模型檢查,對該事件發(fā)生的列是否滿足所給出的規(guī)格的制約進行判斷。
但是,標號有向圖不存在遷移條件。遷移條件是指在存在以某個頂點為起點的多個邊時,對應當遷移到哪個邊終點的起點進行判斷的條件。遷移條件不存在,表示在有以某個頂點為起點的多個邊時,能夠任意選擇將哪個邊的頂點所對應的狀態(tài)看作下一個狀態(tài)。模型檢查通常對是否違反了要檢查的規(guī)格的制約進行確認,因此對于可任意選擇的遷移目的地,總是選擇最差的情況。
但是,表示源碼所表示的動作的狀態(tài)遷移圖,一般通過帶有遷移條件的標號有向圖來表示。例如,通過if語句等所表示的條件節(jié),通過該條件式的真?zhèn)蝸頉Q定下一個狀態(tài)。
根據以上理由,存在的問題是通過沒有遷移條件的標號有向圖所表示的模型描述語言,與通過帶遷移條件的標號有向圖所表示的一般的編程語言之間,通過逐句翻譯來進行變換本質上很困難。另外,以往的方法中,檢查器的使用者很難對源碼變換表進行修正。
具體來說,檢查器的使用者進行源碼變換表的修正時,需要理解變換表中所描述的模型描述。進而,需要確定出沒有正確反映出源碼所表示的應用程序的動作之處。另外,對于成為檢查對象的源碼以外的部分,考慮到要適當進行模型檢查,需要給出對該部分進行補足的模型描述。這些既便使用者是模型檢查的專家,也需要非常困難且復雜的工作。
發(fā)明內容
本發(fā)明的目的在于,提供一種更正確地對成為檢查對象的源碼所表示的動作進行檢查的源碼檢查器以及源碼檢查方法、用來執(zhí)行該方法的方法執(zhí)行程序、以及存儲該程序的存儲介質。
本發(fā)明包括路徑抽出步驟,通過模擬執(zhí)行由預先輸入的計算機用程序的源碼所描述的程序,來抽出實際執(zhí)行的命令串;以及,檢查內容決定步驟,根據上述路徑抽出步驟所抽出的命令串,決定上述源碼的檢查內容。通過本發(fā)明,能夠更加正確地檢查源碼所表示的動作。
圖1為本發(fā)明的第1實施例中的包含源碼檢查器的源碼檢查系統(tǒng)的方框圖。
圖2為表示該實施例中的成為檢驗對象的源碼的例子的圖。
圖3為表示根據圖2中所示的源碼所構成的控制流向圖的圖。
圖4為表示將圖2中所示的源碼改變?yōu)槁窂匠槌鲇盟玫降脑创a的圖。
圖5為表示根據從圖2中所示的源碼中抽出路徑得到的結果所構成的模型圖。
圖6為表示根據圖5的模型圖所生成的模型描述的圖。
圖7為表示本發(fā)明的第2實施例,將圖2中所示的源代碼改變?yōu)槭褂肅BMC的路徑抽出用所得到的源代碼的圖。
圖8為本發(fā)明的第3實施例中的包含源碼檢查器的源碼檢查系統(tǒng)的方框圖。
圖9為本發(fā)明的第4實施例中的源碼檢查器的方框圖。
圖10為表示該實施例中的檢驗程序之一例的圖。
圖11為表示該實施例中的檢驗程序之一部分的第1圖。
圖12為表示該實施例中的檢驗程序之一部分的第2圖。
圖13為表示該實施例中的檢驗程序之一部分的第3圖。
圖14為表示以往的源碼檢查器之構成的方框圖。
圖中100、600-源碼檢查系統(tǒng),102-源碼輸入部,103-路徑抽出部,104-模型圖構成部,105-模型描述生成部,106-模型檢查器執(zhí)行部,107-規(guī)格輸入部,120、122-檢查內容決定部,130、131、700-源碼檢查器,140-控制部,150-存儲介質,601-規(guī)格自動生成部,701-檢驗程序生成部,702-檢驗程序執(zhí)行部。
具體實施例方式
本發(fā)明的源碼檢查方法,具有路徑抽出步驟,和檢查內容決定步驟。路徑抽出步驟,通過模擬執(zhí)行預先輸入的計算機用程序的源碼所描述的應用程序,來抽出實際執(zhí)行的命令串。檢查內容決定步驟,根據路徑抽出步驟所抽出的命令串,決定源碼的檢查內容。
通過這樣,能夠進行源碼的檢查,而且不會脫離成為檢查對象的源碼所表示的程序的動作。
另外,本發(fā)明的源碼檢查方法中,檢查內容決定步驟,置于通過模型描述、與表示檢查源碼的性質的規(guī)格進行源碼的模型檢查的模型檢查執(zhí)行步驟之前,具有模型圖(model graph)構成步驟、和模型描述生成步驟。模型圖構成步驟,根據由路徑抽出步驟所抽出的命令串構成模型圖。模型描述生成步驟,根據模型圖構成步驟所構成的模型圖生成模型描述。可以通過模型描述生成步驟所生成的模型描述與預先輸入的規(guī)格,在模型檢查執(zhí)行步驟中進行源碼的檢查。
通過該方法,使用模型檢查方法,還不會生成脫離了成為檢查對象的源碼所表示的程序的動作的模型描述。因此,不會進行與脫離了成為檢查對象的源碼所表示的程序的動作的那一部分相對應的模型描述所引起的、錯誤的異常檢測。也即,本發(fā)明的方法中,不存在脫離源碼動作的模型描述。因此,不會盡管原來的源碼動作滿足檢查對象的規(guī)格制約,而報告出不符合規(guī)格的誤檢測結果。另外,通過在進行模型檢查之前事先抽出模型圖,還能夠留出應用對模型圖進行壓縮等的效率化手段的余地。
另外,本發(fā)明的源碼檢查方法中,路徑抽出步驟,可以通過將源碼變換成邏輯式并進行邏輯式的充分可能性判斷,來抽出源碼的可執(zhí)行命令串。
通過該方法,通過進一步將成為檢查對象的源碼所給出的程序模擬地、也即對條件語句是否成立進行充分可能性判斷,能夠抽出程序的動作。這樣,由于不需要對成為檢驗對象的源碼進行編譯、鏈接使其能夠執(zhí)行,因此能夠進行例如無法鏈接的、在一系列的源碼群中只以一部分源碼的集合為對象的模型檢查。
另外,本發(fā)明的源碼檢查方法,還可以具有自動生成規(guī)格的規(guī)格自動生成步驟,預先輸入的規(guī)格,是規(guī)格自動生成步驟所生成的規(guī)格。
通過該方法,還不需要手動輸入規(guī)格。也即,不需要煩雜且有時需要專業(yè)知識的規(guī)格的手動輸入。
另外,本發(fā)明的源碼檢查方法中,可以讓規(guī)格自動生成步驟,自動生成表示源碼所描述的程序不會非法使用存儲器的規(guī)格。
通過該方法,還不需要關于存儲器的非法使用的知識,就能夠進行與存儲器的非法使用相關的模型檢查。另外,不需要規(guī)格的手動輸入,就能夠進行關于程序對存儲器的非法使用的檢查。
再有,本發(fā)明的源碼檢查方法中,檢查內容決定步驟可以具有檢驗程序生成步驟與檢驗程序執(zhí)行步驟。檢驗程序生成步驟,生成用來對所抽出的命令串是否非法使用存儲器進行單獨判斷的檢驗程序。檢驗程序執(zhí)行步驟,執(zhí)行所生成的檢驗程序。
通過這樣,不需要執(zhí)行模型檢查執(zhí)行步驟就能夠進行源碼的檢查。也即由于不需要使用外部的模型檢查方法,因此提高了可移動性與便利性。
本發(fā)明的方法執(zhí)行程序,是一種用來在計算機中執(zhí)行上述源碼檢查方法的程序。另外,本發(fā)明的存儲介質,是存儲上述方法執(zhí)行程序的存儲介質。
下面參照附圖對本發(fā)明的實施例進行說明。
(第1實施例)對照圖1,對含有本發(fā)明的第1實施例的源碼檢查器的源碼檢查系統(tǒng)進行說明。圖1為表示含有第1實施例中的源碼檢查器的源碼檢查系統(tǒng)的方框圖。
第1實施例的源碼檢查系統(tǒng)100,是一種計算機系統(tǒng),具有源碼檢查器130、模型檢查器106、以及規(guī)格輸入部107。源碼檢查器130具有源碼輸入部102、路徑抽出部103、檢查內容決定部120、控制部140、以及存儲介質150。檢查內容決定部120具有模型圖構成部104與模型描述生成部105。
源碼輸入部102,輸入作為計算機用程序的源碼101。路徑抽出部103,抽出通過源碼輸入部102所接收的源碼101的可被執(zhí)行的命令串,并將所抽出的命令串發(fā)送給模型圖構成部104。模型圖構成部104將路徑抽出部103所抽出的路徑的信息作為圖(graph)歸納起來,并將所歸納的圖發(fā)送給模型描述生成部105。
模型描述生成部105,根據模型圖構成部104中所構成的圖生成模型描述,并將所生成的模型描述,發(fā)送給位于源碼檢查器130的外部的模型檢查器執(zhí)行部106。
控制部140,通過存儲介質150中所存儲的用來執(zhí)行源碼檢查方法的方法執(zhí)行程序,控制源碼檢查器130的各部。存儲介質150由硬盤存儲裝置或半導體存儲器、CD-ROM等構成。
模型檢查器執(zhí)行部106,使用從規(guī)格輸入部107所接收到的記載有表示要檢查的源碼101之性質的制約的要檢查的規(guī)格108、和模型描述生成部105中所生成的模型描述,執(zhí)行模型檢查,并輸出檢查結果109。上述控制部140還可以通過存儲介質150中所存儲的程序,對模型檢查器執(zhí)行部106進行控制。源碼檢查器的各個部,可以為使用隨機邏輯的硬件結構,或由使計算機執(zhí)行的軟件構成,或者為它們混合。
接下來,對路徑抽出部103進行詳細說明。
路徑抽出部103中,首先根據成為檢查對象的源碼101,構成其控制流向圖(flow graph)。
控制流向圖用來表現(xiàn)源碼101的控制構造,是由處理模塊節(jié)點、判斷節(jié)點、合流節(jié)點這3個基本要素構成的圖。處理模塊節(jié)點,是與沒有基于判斷的分支的連續(xù)源碼命令串相對應的圖的頂點。判斷節(jié)點是表示通過某個式子的真?zhèn)沃邓鶊?zhí)行的命令串發(fā)生分支的點的圖的頂點。合流節(jié)點是表示多個命令串合流的點的圖的頂點。
圖2中示出了本實施例中的源碼之一例,圖3中示出了根據圖2的源碼所構成的控制流向圖之一例。
圖3由處理模塊節(jié)點301、303、305、306、判斷節(jié)點302、合流節(jié)點304、以及連接各個節(jié)點的有向邊構成。
路徑抽出部103生成這樣的控制流向圖。
接下來,路徑抽出部103,進行可根據所構成的控制流向圖執(zhí)行的命令串的抽出,也即進行執(zhí)行路徑抽出。這里示出了基于C語言的執(zhí)行路徑抽出例,但并不僅限于C語言,在C++或Java(注冊商標)等語言中也能夠通過同樣的方法抽出命令串。
路徑抽出部103改變成為檢查對象的源碼101,對所改變的源碼進行編譯并執(zhí)行,通過這樣進行執(zhí)行路徑抽出。路徑抽出部103所進行的源碼101的改變,用來抽出要執(zhí)行的命令串,但不會給原來的源碼101所表示的動作帶來影響。也即,路徑抽出部103模擬執(zhí)行源碼101,并抽出所執(zhí)行的命令串。
下面使用圖3與圖4,對路徑抽出部103的處理進行具體說明。圖4為表示為了執(zhí)行路徑抽出而改變了圖2中所示的源碼的例子的圖。
401所示的語句,是對flag變量進行定義并初始化的語句。402所示的語句是表示開始點的標號與變量定義中含有的初始化語句。403所示的語句是改變具有不定值的變量的函數。404所示的語句是給對應分支命令的flag變量代入1的語句。405所示的語句,是判斷flag變量是否都為1的函數。
首先,路徑抽出部103,在全局變量定義區(qū)域中定義與控制流向圖中含有的判斷節(jié)點的數目相同數目個flag變量。圖4的例子中,路徑抽出部103在從int main(){起開始,并以對應該{的最后的}結束的區(qū)域外,也即401所位于的場所,或最后的}以下的區(qū)域中,定義全局變量定義區(qū)域。
設flag變量,是分別具有不同的名稱,初始化為0,并且具有存儲0或1這兩個值的區(qū)域的全局變量。例如,在控制流向圖中含有的判斷節(jié)點有3個的情況下,路徑抽出部103在要改變的源代碼的開頭的全局變量定義區(qū)域中,描述“int flag1=0,flag2=0,flag3=0;”。
接下來,路徑抽出部103,對控制流向圖中含有的各個判斷節(jié)點302,選擇1個分支,并在與分支目的地的處理方框節(jié)點303相對應的命令串(free(p);)的開頭,插入給flag變量賦值1的命令句404。
路徑抽出部103,不使用曾使用過的flag變量,重復給flag變量賦值1的操作。另外,路徑抽出部103,在對應各個判斷節(jié)點的分支命令句的跟前,插入為了執(zhí)行路線探索而改變成為不定值的變量的函數403。
不定值的變量,表示因來自源碼描述范圍外的輸入、例如程序使用者的輸入而改變的值,或由隨機數所決定的值,還有具有由該值決定的值的變量。通過數據流解析,能夠判斷各個變量是否具有不定值。
所插入的函數,將對應的分支命令句中含有的成為不定值的變量作為自變量,并改變各個變量的值。另外,該函數每次被調用時,將不同值的組合賦值給自變量給出的各個變量。
接下來,路徑抽出部103,在將源碼101中的除了變量定義語句之外最早執(zhí)行的命令所對應的命令句(在位于圖4中的402所示的部分之后的p=malloc(sizeof(char)))之前,插入表示開始點的標簽(402中所示的第一行,init_point),在插入了該標簽的場所之后,添加變量定義語句中含有的變量的初始化命令(402中所示的部分的第2行,p=0;)。
接下來,路徑抽出部103在源碼中所含有的表示程序結束的語句之前(405所示的部分之后,return 0;),判斷分別通過上述順序所插入的flag變量全體是否都被賦值為1,在都被賦值為1的情況下結束,此外的情況下,插入返回由上述順序所插入的標簽處的函數(405中所示的check_point(flag 1))。
這里,在結束的情況下,路徑抽出部103將執(zhí)行過的命令串的信息傳送給模型圖構成部104。
這樣,路徑抽出部103在圖2中所示的源碼中插入通過401~405所示的語句。
通過這樣,路徑抽出部103通過對所有的判斷節(jié)點的組合重復代入flag變量的操作,能夠將可執(zhí)行的命令串全部抽出。
另外,在源碼的規(guī)模較大,且組合的數目龐大的情況下,最好通過能夠使用的計算機資源適當中止上述抽出,進入以下順序。
接下來,對檢查內部決定部120中含有的模型圖構成部104進行詳細說明。
通過路徑抽出部103的執(zhí)行,所執(zhí)行的命令串的集合傳送給模型圖構成部104。模型圖構成部104根據該集合,構成模型圖。這里所構成的模型圖由頂點與邊的集合構成,各個頂點中分別標注有對應的命令句作為標簽,各個邊是起點與終點分別與圖中的頂點逐一對應的有向邊。
下面,對模型圖構成部104構成模型圖的方法進行說明。
首先,模型圖構成部104,從命令串的集合中讀出1個命令串。接下來,模型圖構成部104,生成標注有表示與該列命令的出現(xiàn)順序相對應的命令語句之標簽的頂點,生成將前一個生成的頂點與新生成的頂點分別作為起點、終點的邊。通過該操作,構成與1個所選擇的命令串相對應的一列模型圖。這里,將首先所生成的頂點稱作開始頂點。
接下來,模型圖構成部104,(1)從命令串的集合中取出1個命令串,與上述同樣構成一列模型圖。
接下來,模型圖構成部104,(2)與已構成的模型圖從各自的開始頂點起進行比較,在出現(xiàn)標注有對應不同命令句的標簽的頂點的情況下,讓圖進行分支,給原來的模型圖中添加與剩下的命令串相對應的新的模型圖。
接下來,模型圖構成部104,(3)返回(1)直到沒有命令串的集合要素為止,并將這一順序從(1)起順次執(zhí)行。通過這樣能夠構成模型圖。另外,模型圖構成部104,將所構成的模型圖傳送給模型描述生成部105。圖5所示的圖,是根據從圖2中所示的源碼中抽出路徑得到的結果而構成的模型圖。
這樣,模型圖構成部104如圖5所示,構成帶遷移條件的也即正確再現(xiàn)了源碼所表示的動作的模型圖。
接下來,對模型描述生成部105進行詳細說明。這里,列舉出根據從模型圖構成部104傳送的圖5所示的模型圖,生成基于模型檢查器SPIN用模型描述語言Promela的模型描述(圖6中所示)的例子。這里所生成的模型描述是字符串的列。圖6為根據圖5的模型圖所生成的基于Promela的模型描述。
首先,模型描述生成部105,生成通過Promela所描述的模型的開始點。這里開始點的描述,是601所示的部分,為“proctype main(){”。
接下來,模型描述生成部105從模型圖的開始點起順次選擇頂點,并執(zhí)行以下操作。
首先,模型描述生成部105,(1)在接著所選擇的頂點沒有分支的情況下(圖5中的500a~500i所示的部分),在標注給該頂點的標簽為L時,如圖6中的602a~602i所示,在模型描述中添加“Lskip;”。
接下來,模型描述生成部105,選擇接下來的模型圖中的頂點,執(zhí)行(1)或以下的(2)。
(2)模型描述生成部105,在接著所選擇的頂點有分支的情況下(通過圖5中的501所示的部分),在設標注給該頂點的標簽為L時,如圖6中的603以后的部分所示,在模型描述中添加“Lif∷A∷B fi;”。
接下來,模型描述生成部105,選擇各個分支目的地的頂點,分別執(zhí)行(1)、(2),覆蓋上述A、B。這種情況下,A為圖6中604所示的部分,B為605所示的部分。
然后,模型描述生成部105重復以上操作,直到選擇并執(zhí)行了模型圖的所有頂點。最后,將圖6中606所示的“}”添加到模型描述中。
模型描述生成部105,將這里所得到的模型描述發(fā)送給模型檢查器執(zhí)行部106。
之后,模型檢查器執(zhí)行部106中,將從上述模型描述生成部獲得的模型描述、與從規(guī)格輸入部107所接收到的規(guī)格,輸入給模型檢查器,并輸出模型檢查的結果作為檢查結果109。
如上所述,通過第1實施例,路徑抽出部103通過模擬執(zhí)行源碼所描述的應用程序,來抽出實際執(zhí)行的命令串。然后,能夠根據檢查內容決定部120中含有的模型圖構成部104所抽出的命令串構成模型圖,根據模型描述生成部105所構成的模型圖生成模型描述,從而能夠進行源碼的檢查。
這樣,通過模擬執(zhí)行源碼,不會生成脫離了成為檢查對象的源碼所表示的程序的動作的模型描述。因此,不會產生與脫離了成為檢查對象的源碼所表示的程序的動作的那一部分相對應的模型描述所引起的、錯誤的異常檢測。也即,“盡管原來的源碼的動作滿足檢查對象的規(guī)格制約,但由于存在脫離了該動作的模型描述,從而不滿足規(guī)格的性質的情況下所檢測出的、不符合規(guī)格的這種誤檢測結果”,不會再報告出來。
另外,通過在進行模型檢查之前抽出模型圖,還能夠給使用對模型圖進行壓縮等的效率化手段留出余地。
另外,通過第1實施例,還可以去掉以往必需的源碼變換表,因此,檢查源碼的人不需要修正源碼變換表。
(第2實施例)對本發(fā)明的第2實施例進行說明。第2實施例中,作為路徑抽出部103模擬執(zhí)行程序的方法,是通過將源碼變換成邏輯式,并進行該邏輯式的充分可能性判斷,來抽出實際執(zhí)行的命令串。邏輯式的充分可能性判斷,是指對是否存在使得所給出的邏輯式整體為1、也即為真的變量值的分配進行判斷。
由于含有第2實施例中的源碼檢查器的源碼檢查系統(tǒng)的構成與第1實施例相同,因此使用圖1對第1實施例中的源碼檢查器進行說明。
第2實施例中的源碼檢查器130,在路徑抽出部103中,將源碼101變換成邏輯式,并進行該邏輯式的充分可能性判斷,通過這樣抽出源碼所執(zhí)行的命令串。
這里,作為路徑抽出部103將源碼101變換成邏輯式,并進行充分可能性判斷的工具,使用模型檢查器CBMC(Bounded Model Checker forANSI-C programs)。CBMC,是輸入C語言的源碼,將其變換成邏輯式,并進行該邏輯式的充分可能性判斷,通過這樣來檢查所輸入的源碼的諸性質的模型檢查器。路徑抽出部103為了抽出路徑,使用對總是滿足assert語句這一性質進行檢查的功能。
使用圖7對路徑抽出部103的處理進行具體說明。圖7為表示本發(fā)明的第2實施例中,為了執(zhí)行路徑抽出而改變圖2中所示的源碼的例子的圖。
圖7中所示的源碼,給圖2所示的源碼插入了flag變量504、502以及assert語句503。
路徑抽出部103根據成為檢查對象的源碼101,構成其控制流向圖。接下來,路徑抽出部103通過改變所輸入的源碼,來生成用來輸入給CBMC的C語言源碼。
首先,路徑抽出部103與第1實施例一樣,進行flag變量504之定義的插入、賦值語句503的插入。
接下來,路徑抽出部103在源碼中所含有的表示程序結束的語句之前,插入表示不給所有分別通過上述順序插入的flag變量賦值1的聲明語句,也即assert語句503。例如,在設flag變量為flag1、flag2、flag3這3個時,所插入的assert語句是“assert(flag1!=1||flag1?。?||flag1!=1)”。
接下來,路徑抽出部103,將通過上述順序所改變并得到的源碼輸入給CBMC。
此時,如果CBMC指出有違反assert語句的聲明的情況,則表示有所插入的flag變量都變?yōu)?的情況。也即,表示存在全部通過對flag變量賦值1的場所的可執(zhí)行路徑。
因此,在基于CBMC的assert語句的違反的指出,是輸入給CBMC,且所執(zhí)行的結果中含有字符串“Failed assertion”的情況下,路徑抽出部103通過檢索所輸出的字符串,能夠判斷違反了assert語句。
路徑抽出部103在判斷為是可執(zhí)行路徑的情況下,將該路徑所對應的命令串的信息,發(fā)送給檢查內容決定部120中含有的模型圖構成部104。
路徑抽出部103變更給flag變量502賦值1的場所的同時,重復以上順序,通過這樣,在模型圖構成部104中收集可執(zhí)行的命令串的信息。
這樣,收集了足夠的信息之后,通過同樣進行第1實施例中所列舉出的模型圖構成部104的執(zhí)行及其之后的執(zhí)行,能夠進行源碼的檢查。
如上所述,通過本實施例,通過在路徑抽出部103中將源碼101變換成邏輯式,并進行邏輯式的充分可能性判斷,能夠抽出源碼101的可被執(zhí)行的命令串。通過這樣,不需要對成為檢查對象的源碼101所給出的程序實際進行執(zhí)行,就能夠抽出程序的動作。這樣,由于不需要對作為檢查對象的源碼101實際進行編譯、鏈接來使其可以執(zhí)行,因此能夠進行無法進行例如鏈接的、在一系列的源碼群中只以一部分源碼的集合為對象的模型檢查。
(第3實施例)本發(fā)明的第3實施例,具有根據源碼的信息自動生成用來輸入給模型檢查器執(zhí)行部的規(guī)格的機構。
下面,對第3實施例的源碼檢查器進行說明。圖8為含有本發(fā)明的第3實施例中的源碼檢查器的源碼檢查系統(tǒng)的方框圖。另外,給與圖1構成相同的部分標注同一符號,省略其說明。
本實施例中的源碼檢查系統(tǒng)600的特征在于,具有根據源碼輸入部102所接收到的源碼101的信息,自動生成輸入給模型檢查器執(zhí)行部106的規(guī)格的規(guī)格自動生成部601。源碼檢查器131,具有源碼輸入部102、路徑抽出部103、檢查內容決定部120、規(guī)格自動生成部601、控制部140、以及存儲介質150。
接下來,對規(guī)格自動生成部601的規(guī)格的自動生成法進行說明。
首先,規(guī)格自動生成部601讀取由源碼輸入部102所接收到的源碼101,并將一定要成對使用的命令句全部進行檢索。
例如,在處理通過C語言所描述的源碼的情況下,對應fopen的fclose、對應open的close、與malloc或calloc等將存儲器在堆棧區(qū)中確保的語句相對應的含有free的命令句等,均分別是一定要成對使用的命令句。
接下來,規(guī)格自動生成部601,對作為用上述順序所檢索出的結果檢測出的命令句之對A、B,在規(guī)格中添加以下式子“[](A-><>B)”。
上式是表示在出現(xiàn)了A的情況下,B一定會出現(xiàn)的這一制約的式子。
例如,在存在fp=fopen(fname,“w”)與fclose(fp)這一成對的命令句的情況下,規(guī)格自動生成部601在規(guī)格中添加下面的式子“[](“fp=fopen(fname,“w”)”-><>“fclose(fp)”)”。
規(guī)格自動生成部601,對所檢測出的所有語句重復以上處理。
另外,規(guī)格自動生成部601,在已經存在式子作為規(guī)格,并給其增加了新式子的情況下,使用運算符“&&”連接起來。運算符“&&”表示邏輯和,在新增加制約的情況下使用。
如上所述,通過第3實施例,與第1實施例不同,用戶不需要從規(guī)格輸入部107輸入規(guī)格108,能夠自動生成例如表示源碼所描述的應用程序不會非法使用存儲器的規(guī)格。也即,不需要煩雜且有時需要專業(yè)知識的規(guī)格108之輸入。
(第4實施例)本發(fā)明的第4實施例,對所抽出的可被執(zhí)行的命令串是否會非法使用存儲器進行判斷。
下面,使用圖9對本實施例中的源碼檢查器進行說明。圖9為表示本實施例中的源碼檢查器之構成的方框圖。另外,給與圖1的構成相同的標注同一符號,省略其說明。
第4實施例中的源碼檢查器700,具有源碼輸入部102、路徑抽出部103、檢查內容決定部122、控制部140、以及存儲介質150。檢查內容決定部122,具有檢驗程序生成部701與檢驗程序執(zhí)行部702。檢驗程序生成部701,接收由路徑抽出部103所抽出的可被執(zhí)行的命令串,并生成用來單獨對該命令串是否會非法使用了存儲器進行判斷的檢驗程序。檢驗程序執(zhí)行部702,執(zhí)行檢驗程序生成部701中所生成的檢驗程序。
接下來,對檢驗程序生成部701中的檢驗程序生成方法進行詳細說明。檢驗程序生成部701所生成的檢驗程序,是根據路徑抽出部103所抽出的可被執(zhí)行的命令串所生成的字符串。
使用圖10對檢驗程序生成部701生成該字符串的順序進行說明。圖10為表示本實施例中,根據圖5中所示的圖的左側的分支,通過檢驗程序生成部701中的處理所生成的程序之一例的圖。
首先,檢驗程序生成部701,將1001所示的部分“int main(){(1001)}”作為開始字符串。檢驗程序生成部701,通過給該開始字符串1001順次添加字符串,來構成檢驗程序的字符串。接下來,檢驗程序生成部701,將給路徑抽出部703所生成的命令串所對應的命令句添加分號得到的字符串,順次添加給上述開始字符串。
此時,在如圖5的500c所示,存在malloc函數,且如圖5的500d、500e所示,存在wz_malloc、free函數的情況下,檢驗程序生成部701,如圖10中的1002所示,將wz_malloc、free函數替換成wz_free。
另外,在命令串中含有的式子中有指針變量的情況下,檢驗程序生成部701,對各個該指針變量,將以該指針變量為參數的wz_check函數的調用語句插入到式子之前。
另外,在命令串的最后沒有return語句的情況下,檢驗程序生成部701添加“return 0;”,另外在有return的情況下,如圖10中的1003所示,添加“}”。
最后,檢驗程序生成部701添加如圖11~13所示的字符串。
如上所述,檢驗程序生成部701生成檢驗程序。并且,檢驗程序生成部701,將所生成的檢驗程序發(fā)送給檢驗程序執(zhí)行部702。
檢驗程序執(zhí)行部702中,對從檢驗程序生成部701所接收到的檢驗程序進行編譯、執(zhí)行。并將所執(zhí)行的結果作為檢查結果109顯示出來。這里,如果顯示出“Memory leak was detected.”,則意味著在執(zhí)行由路徑抽出部103所抽出的命令串的情況下,檢測出了存儲器發(fā)生泄漏。
另外,如果顯示出“Used non-active object.”,則意味著在執(zhí)行由路徑抽出部103所抽出的命令串的情況下,檢測出了要使用空指針。
如上所述,通過本實施例,由于檢驗程序生成部701自動生成表示程序不會非法使用存儲器的規(guī)格,因此不需要存儲器的非法使用的相關知識,就能夠進行關于存儲器的非法使用的源碼檢查。另外,不需要第1實施例中的規(guī)格輸入部107,就能夠進行關于程序是否非法使用存儲器的檢查。
另外,通過本實施例,通過輸出單獨進行源碼檢查的程序,可以不需要第1實施例中的模型檢查器執(zhí)行部106。也即不需要外部的模型檢查器,提高了可移動性與便利性。
如上所述,通過本發(fā)明,能夠進行源碼的檢查,而不會脫離源碼所表示的程序的動作。不會脫離成為檢查對象的源碼所表示的動作,而能夠更加正確地實現(xiàn)源碼的檢查。另外,本發(fā)明還能夠應用于軟件的適當性檢查等領域,應用可能性非常大。
權利要求
1.一種源碼檢查方法,其特征在于,具有路徑抽出步驟,通過模擬執(zhí)行由預先輸入的計算機用程序的源碼所描述的程序,來抽出實際執(zhí)行的命令串;以及,檢查內容決定步驟,根據上述路徑抽出步驟所抽出的命令串,決定上述源碼的檢查內容。
2.如權利要求1所述的源碼檢查方法,其特征在于上述檢查內容決定步驟,置于根據模型描述和表示檢查上述源碼的性質的規(guī)格來進行上述源碼的模型檢查的模型檢查執(zhí)行步驟之前,具有根據上述路徑抽出步驟所抽出的命令串構成模型圖的模型圖構成步驟;以及,根據上述模型圖構成步驟所構成的模型圖生成模型描述的模型描述生成步驟,根據上述模型描述生成部所生成的模型描述和預先輸入的規(guī)格,在上述模型檢查執(zhí)行步驟中進行上述源碼的檢查。
3.如權利要求1所述的源碼檢查方法,其特征在于上述路徑抽出步驟,通過將上述源碼變換成邏輯式并進行上述邏輯式的充分可能性判斷,來抽出上述實際執(zhí)行的命令串。
4.如權利要求2所述的源碼檢查方法,其特征在于還具有自動生成上述規(guī)格的規(guī)格自動生成步驟,上述預先輸入的規(guī)格,是上述規(guī)格自動生成步驟所生成的規(guī)格。
5.如權利要求4所述的源碼檢查方法,其特征在于上述規(guī)格自動生成步驟,自動生成表示由上述源碼所描述的程序不會非法使用存儲器這一意思的規(guī)格。
6.如權利要求1所述的源碼檢查方法,其特征在于上述檢查內容決定步驟,具有檢驗程序生成步驟,其生成用來對上述路徑抽出步驟所抽出的命令串是否會非法使用存儲器進行檢驗的檢驗程序;以及檢驗程序執(zhí)行步驟,執(zhí)行上述檢驗程序生成步驟所生成的檢驗程序。
7.一種用來在計算機中執(zhí)行源碼檢查方法的方法執(zhí)行程序,其特征在于,上述方法具有路徑抽出步驟,通過模擬執(zhí)行由預先輸入的計算機用程序的源碼所描述的程序,來抽出實際執(zhí)行的命令串;以及,檢查內容決定步驟,根據上述路徑抽出步驟所抽出的命令串,決定上述源碼的檢查內容。
8.一種存儲用來在計算機中執(zhí)行源碼檢查方法的方法執(zhí)行程序的存儲介質,其特征在于,上述方法具有路徑抽出步驟,通過模擬執(zhí)行由預先輸入的計算機用程序的源碼所描述的程序,來抽出實際執(zhí)行的命令串;以及,檢查內容決定步驟,根據上述路徑抽出步驟所抽出的命令串,決定上述源碼的檢查內容。
9.一種源碼檢查器,其特征在于,具有路徑抽出部,通過模擬執(zhí)行由預先輸入的計算機用程序的源碼所描述的程序,來抽出實際執(zhí)行的命令串;以及,檢查內容決定部,根據上述路徑抽出步驟所抽出的命令串,決定上述源碼的檢查內容。
10.如權利要求9所述的源碼檢查器,其特征在于上述檢查內容決定部,置于根據模型描述和表示檢查上述源碼的性質的規(guī)格來進行上述源碼的模型檢查的模型檢查執(zhí)行部之前,具有根據上述路徑抽出部所抽出的命令串構成模型圖的模型圖構成部;以及,根據上述模型圖構成部所構成的模型圖生成模型描述的模型描述生成部,根據上述模型描述生成部所生成的模型描述和預先輸入的規(guī)格,在上述模型檢查執(zhí)行部中進行上述源碼的檢查。
11.如權利要求9所述的源碼檢查器,其特征在于上述路徑抽出部,通過將上述源碼變換成邏輯式并進行上述邏輯式的充分可能性判斷,來抽出上述實際執(zhí)行的命令串。
12.如權利要求10所述的源碼檢查器,其特征在于還具有自動生成上述規(guī)格的規(guī)格自動生成部,上述預先輸入的規(guī)格,是上述規(guī)格自動生成部所生成的規(guī)格。
13.如權利要求12所述的源碼檢查器,其特征在于上述規(guī)格自動生成部,自動生成表示由上述源碼所描述的程序不會非法使用存儲器這一意思的規(guī)格。
14.如權利要求9所述的源碼檢查器,其特征在于上述檢查內容決定部,具有檢驗程序生成部,其生成用來對上述路徑抽出部所抽出的命令串是否會非法使用存儲器進行檢驗的檢驗程序;以及檢驗程序執(zhí)行部,執(zhí)行上述檢驗程序生成部所生成的檢驗程序。
全文摘要
本發(fā)明涉及一種對計算機程序的源碼所表示的程序動作相關的諸性質進行檢查的源碼檢查器以及源碼檢查方法、執(zhí)行該方法的程序、以及存儲該程序的存儲介質。該源碼檢查方法具有路徑抽出步驟、和檢查內容決定步驟。路徑抽出步驟,通過模擬執(zhí)行預先輸入的計算機用程序的源碼所描述的程序,來抽出實際執(zhí)行的命令串。檢查內容決定步驟,根據路徑抽出步驟所抽出的命令串,決定源碼的檢查內容。
文檔編號G06F9/44GK101036127SQ20058003390
公開日2007年9月12日 申請日期2005年8月29日 優(yōu)先權日2004年10月4日
發(fā)明者青島武伸, 伊藤智祥, 山口孝雄 申請人:松下電器產業(yè)株式會社