JPWO2006038394A1 - ソースコード検査器、方法、プログラム及び記憶媒体 - Google Patents

ソースコード検査器、方法、プログラム及び記憶媒体 Download PDF

Info

Publication number
JPWO2006038394A1
JPWO2006038394A1 JP2006539189A JP2006539189A JPWO2006038394A1 JP WO2006038394 A1 JPWO2006038394 A1 JP WO2006038394A1 JP 2006539189 A JP2006539189 A JP 2006539189A JP 2006539189 A JP2006539189 A JP 2006539189A JP WO2006038394 A1 JPWO2006038394 A1 JP WO2006038394A1
Authority
JP
Japan
Prior art keywords
source code
model
unit
program
path extraction
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2006539189A
Other languages
English (en)
Inventor
武伸 青島
武伸 青島
伊藤 智祥
智祥 伊藤
山口 孝雄
孝雄 山口
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Panasonic Corp
Panasonic Holdings Corp
Original Assignee
Panasonic Corp
Matsushita Electric Industrial Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Panasonic Corp, Matsushita Electric Industrial Co Ltd filed Critical Panasonic Corp
Publication of JPWO2006038394A1 publication Critical patent/JPWO2006038394A1/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

Abstract

計算機プログラムのソースコードが意味するプログラムの振る舞いに関する諸性質を検査するソースコード検査器及びソースコード検査方法、当該方法を実行させるプログラム、当該プログラムを格納する記憶媒体が開示されている。このソースコード検査方法は、パス抽出ステップと、検査内容決定ステップと、を含む。パス抽出ステップは、あらかじめ入力された計算機用プログラムのソースコードによって記述されたプログラムを模擬に実行することで実際に実行される命令列を抽出する。検査内容決定ステップは、パス抽出ステップで抽出した命令列に基づいてソースコードの検査内容を決定する。

Description

本発明は、計算機プログラムのソースコードが意味するプログラムの振る舞いに関する諸性質を検査するソースコード検査器及びソースコード検査方法、当該方法を実行させるプログラム、当該プログラムを格納する記憶媒体に関する。
従来のソースコード検査器として、ソースコードが意味するプログラム(以下、応用プログラムとも記す)の振る舞いに関する諸性質を検査するソースコード分析器がある。ソースコード分析器の例としては、モデル検査技術を用いてソースコードを分析するソースコードモデル検査器がある。
ソースコードが意味する応用プログラムの振る舞いとは、ソースコードに記述された一連の命令に従う、プログラムの一連の動作を意味する。この振る舞いに関する諸性質の例として、メモリを動的に確保した場合は必ずそのメモリを解放する性質、プログラム中のある命令を実行した場合は必ずいつか対応する特定の命令を実行する性質などが挙げられる。
モデル検査とは、検査する性質を表す仕様と検査の対象となるモデルとを入力とし、モデルが仕様の表す性質を有するかどうかを判定することである。モデル検査を行う装置をモデル検査器と呼び、検査の対象となるモデルを記述したものをモデル記述と呼ぶ。モデルを記述するための言語は、モデル検査器によって様々に異なる。例えば、モデル検査器SPINの場合、モデルを記述するための言語はプロメラ(Promela)と呼ばれるものである。
モデル検査器SPINは、有限状態遷移系としてモデル化したシステムが線形時間論理式で記述された検査式を満たすかを全状態検索で網羅的に検査する検査器である。モデル検査器SPINは、例えば、Gerard J.Holzmann,’The model Checker Spin’,IEEE Trans,On Software Engineering,Vol.23,No.5,May 1997,pp.279−295に開示されている。
ソースコードモデル検査とは、ソースコードを検査の対象としたモデル検査を指し、論理回路などハードウェアを対象とするモデル検査であるハードウェアモデル検査との対比のため用いる語である。
従来のソースコード検査器としては、ソースコードをモデル検査器の入力言語に翻訳するための変換表を用いるものがある。この構成は、例えば、米国特許出願公開第2001/037492号、米国特許出願公開第2002/100022号に開示されている。図14は、米国特許出願公開第2001/037492号に記載された従来のソースコード検査器の構成を示すブロック図である。
図14に示す従来のソースコード検査器であるモデル検査器は、検査の対象となるソースコード1301をソースコード入力部1302から入力する。次に、このソースコード検査器は、ソースコード変換テーブル生成部1303において、ソースコード入力部1302によって受け入れたソースコード1301を基に制御フローグラフを構成する。そして、その制御フローグラフから検査の対象となるソースコード1301の各文について、対応するモデル記述言語、例えばプロメラの記述で書かれた対訳例を集めたソースコード変換テーブル1304を生成する。
次に、モデル記述生成部1305が、ソースコード変換テーブル1304に含まれる対訳例を用いてソースコード1301をモデル記述言語に変換する。また、仕様入力部1307は、入力された検査するソースコード1301の性質を表す仕様を記載した検査する仕様1308をモデル検査器実行部1306へ渡す。そして、モデル検査器実行部1306が、仕様入力部1307からの仕様1308と、モデル記述生成部1305において生成されたモデル記述とを用いてモデル検査を実行し、検査結果1309を出力する。
また、自動的に生成されたソースコード変換テーブル1304がソースコードモデル検査器の使用者の意に沿わない場合、使用者の修正手段1310がソースコード変換テーブル1304を適宜修正する必要がある。それは、例えば、検査の対象となるソースコード1301が、そのソースコード以外のもの、例えば外部モジュールとの通信など、を扱う場合などである。ソースコード変換テーブル生成部1303が適正な翻訳例を示すことができない場合も多く、これを使用者が補う必要がある。
ソースコードモデル検査で用いるプロメラなどのモデル記述言語と、ソースコードを記述している例えばC言語などのプログラミング言語とでは表現力が違う。具体的には、プログラミング言語では記述できて、モデル記述言語では記述できない遷移条件が存在する。このため、ソースコードの意味する振る舞いをモデル記述言語に正確に翻訳することが本質的に困難であり得、適切なソースコード変換テーブルを生成することが困難な場合が多い。よって、検査の対象となるソースコードの意味する振る舞いを正確に再現するモデル記述が得られず、不正確な検査になる場合が多いという問題があり得る。
詳細に説明すると、モデル検査は、モデルの記述を基にラベル付き有向グラフを生成し、このグラフが例えば線形時間論理式などで与えられる仕様の意味する制約を満たしているかどうかを判定する、という手順で行われる。線形時間論理式とは、命題論理式に時間の概念を追加して構成されるもので、状態遷移モデルを形式的に記述する際等で広く用いられている。
ラベル付き有向グラフとは、頂点と辺の集合からなる。各辺は2頂点間の関係を表し、頂点同士を結ぶ辺には向きが存在する。すなわち、ラベル付き有向グラフには、辺の起点、および終点に一つずつ対応する頂点が存在し、各頂点にはラベルが付記されている。
ラベル付き有向グラフの各頂点を状態とみなし、辺の向きに沿って頂点を移動することを状態遷移とみなすとき、ラベル付き有向グラフは状態遷移図とみなすことができる。各頂点のラベルは、各状態で生起されるイベントであるとみなすことができる。そして、モデル検査は、そのイベントの生起の列が与えられた仕様の制約を満たしているかどうかを判定する。
しかしながら、ラベル付き有向グラフは、遷移条件が存在しない。遷移条件とは、ある頂点を起点とした複数の辺があるとき、どの辺の終点の頂点に遷移するべきかを判断する条件である。遷移条件が存在しないということは、ある頂点を起点とした複数の辺があるとき、どちらの辺の頂点に対応する状態を次の状態とみなすかは任意に選択可能であるということを意味する。モデル検査は通常、検査する仕様の制約に違反しているかどうかを確認するため、任意に選択可能な遷移先については、常に最悪の場合を選択する。
しかしながら、ソースコードが意味する振る舞いを表す状態遷移図は、一般に遷移条件付きラベル付き有向グラフで表される。例えばif文などで表される条件節は、その条件式の真偽によって次状態が決定される。
以上の理由から、遷移条件のないラベル付き有向グラフによって意味づけられるモデル記述言語と、遷移条件付きラベル付き有向グラフによって意味づけられる一般のプログラミング言語との間を逐語訳で変換することは本質的な困難さを伴うという問題があり得る。また、従来の方法では、検査器の使用者がソースコード変換テーブルを修正することは困難であり得る。
詳細に説明すると、検査器の使用者はソースコード変換テーブルの修正を行う際、変換テーブルに記述されたモデル記述を理解する必要がある。さらに、ソースコードの意味する応用プログラムの振る舞いを正確に反映していない箇所を特定する必要があり、その箇所について代替となる翻訳を与える必要がある。また、検査の対象となるソースコード以外の部分について、モデル検査が適切に行われるように配慮しながら、その部分を補完するモデル記述を与える必要がある。これは使用者がモデル検査の専門家であったとしても、困難さや煩雑さを伴う作業となり得る。
本発明は、検査の対象となるソースコードの意味する振る舞いをより正確に検査するソースコード検査器及びソースコード検査方法、当該方法を実行させる方法実行プログラム、当該プログラムを格納する記憶媒体を提供する。
本発明は、あらかじめ入力された計算機用プログラムのソースコードによって記述された応用プログラムを模擬に実行することで実際に実行される命令列を抽出するパス抽出ステップと、パス抽出ステップで抽出した命令列に基づいてソースコードの検査内容を決定する検査内容決定ステップと、を含むようにした。本発明によれば、ソースコードの意味する振る舞いをより正確に検査することができる。
図1は本発明の第1実施例におけるソースコード検査器を含むソースコード検査システムのブロック図である。 図2は同実施例における検証の対象となるソースコードの例を示す図である。 図3は図2で示したソースコードを基に構成した制御フローグラフを示す図である。 図4は図2で示したソースコードをパス抽出用に改変したソースコードを示す図である。 図5は図2で示したソースコードからパスを抽出した結果を基に構成したモデルグラフを示す図である。 図6は図5のモデルグラフを基に生成したモデル記述を示す図である。 図7は本発明の第2実施例に係わり、図2で示したソースコードを、CBMCを用いたパス抽出用に改変したソースコードを示す図である。 図8は本発明の第3実施例におけるソースコード検査器を含むソースコード検査システムのブロック図である。 図9は本発明の第4実施例におけるソースコード検査器のブロック図である。 図10は同実施例における検証プログラムの例を示す図である。 図11は同実施例における、検証プログラムの一部を示す第1の図である。 図12は同実施例における、検証プログラムの一部を示す第2の図である。 図13は同実施例における、検証プログラムの一部を示す第3の図である。 図14は従来のソースコード検査器の構成を表すブロック図である。
符号の説明
100,600 ソースコード検査システム
102 ソースコード入力部
103 パス抽出部
104 モデルグラフ構成部
105 モデル記述生成部
106 モデル検査器実行部
107 仕様入力部
120,122 検査内容決定部
130,131,700 ソースコード検査器
140 制御部
150 記憶媒体
601 仕様自動生成部
701 検証プログラム生成部
702 検証プログラム実行部
本発明のソースコード検査方法は、パス抽出ステップと、検査内容決定ステップと、を含む。パス抽出ステップは、あらかじめ入力された計算機用プログラムのソースコードによって記述された応用プログラムを模擬に実行することで実際に実行される命令列を抽出する。検査内容決定ステップは、パス抽出ステップで抽出した命令列に基づいてソースコードの検査内容を決定する。
これにより、検査の対象とするソースコードの意味するプログラムの振る舞いを逸脱することなく、ソースコードの検査を行うことができる。
また、本発明のソースコード検査方法は、検査内容決定ステップが、モデル記述とソースコードを検査する性質を表す仕様とによりソースコードのモデル検査を行うモデル検査実行ステップに前置し、モデルグラフ構成ステップと、モデル記述生成ステップと、を含むようにしてもよい。モデルグラフ構成ステップは、パス抽出ステップで抽出した命令列からモデルグラフを構成する。モデル記述生成ステップは、モデルグラフ構成ステップで構成したモデルグラフからモデル記述を生成する。モデル記述生成部が生成したモデル記述とあらかじめ入力された仕様とによりモデル検査実行ステップでソースコードの検査を行うようにしてもよい。
この方法によれば、モデル検査手法を用いて、さらに検査の対象とするソースコードの意味するプログラムの振る舞いを逸脱するモデル記述が生成されることがなくなる。このため、検査の対象とするソースコードの意味するプログラムの振る舞いを逸脱した部分に対応するモデル記述によって引き起こされる、誤った異常な検出が行われなくなる。すなわち、本発明の方法では、ソースコードの振る舞いを逸脱するモデル記述が存在しない。このため、元々のソースコードの振る舞いでは検査対象の仕様の制約を満たしていたにもかかわらず、仕様を満たさないという誤った検査結果を報告されることがなくなる。また、モデル検査を行う前にモデルグラフを抽出しておくことで、モデルグラフを縮退させるなどの効率化手段を適用する余地を残すことが可能となる。
また、本発明のソースコード検査方法は、パス抽出ステップが、ソースコードを論理式に変換し、論理式の充足可能性判定を行うことでソースコードの実行される可能性のある命令列を抽出するようにしてもよい。
この方法によれば、さらに検査の対象とするソースコードで与えられるプログラムを模擬に、すなわち、条件文が成り立つか成り立たないかを充足可能性判定していくことにより、プログラムの振る舞いを抽出することができる。このように、検証の対象とするソースコードをコンパイル、リンクして実行可能にする必要がないため、例えばリンクなどができない、一連のソースコード群から一部のソースコードの集合だけを対象としたモデル検査を行うことが可能となる。
また、本発明のソースコード検査方法は、仕様を自動で生成する仕様自動生成ステップをさらに含み、あらかじめ入力された仕様は、仕様自動生成ステップで生成した仕様であるようにしてもよい。
この方法によれば、さらに仕様を手で入力する必要とがなくなる。つまり、煩わしく、ときに専門知識を要する仕様の手入力を必要としなくなる。
また、本発明のソースコード検査方法は、仕様自動生成ステップが、ソースコードによって記述されたプログラムがメモリの不正使用を行わないことを意味する仕様を自動生成するようにしてもよい。
この方法によれば、さらにメモリの不正使用に関する知識を必要とせず、メモリの不正使用に関するモデル検査を行うことが可能となる。また、仕様の手入力を必要とせず、プログラムのメモリの不正使用に関する検査を行うことができるようになる。
さらに、本発明のソースコード検査方法は、検査内容決定ステップが、検証プログラム生成ステップと、検証プログラム実行ステップと、を含むようにしてもよい。検証プログラム生成ステップは、抽出された命令列がメモリの不正使用を行わないかどうかを単独で判定するための検証プログラムを生成する。検証プログラム実行ステップは、生成された検証プログラムを実行する。
これにより、モデル検査実行ステップせずソースコードの検査を行うことができる。すなわち外部のモデル検査方法を用いる必要がなくなるため、可搬性、および利便性が向上する。
本発明の方法実行プログラムは、コンピュータに上記ソースコード検査方法を実行させるプログラムである。また、本発明の記憶媒体は、上記方法実行プログラムを格納する記憶媒体である。
以下、本発明の実施例について、図面を参照しながら説明する。
(第1実施例)
本発明の第1実施例にかかるソースコード検査器を含むソースコード検査システムについて、図1を用いて説明する。図1は、第1実施例におけるソースコード検査器を含むソースコード検査システムのブロック図である。
第1実施例にかかるソースコード検査システム100は、コンピュータシステムであって、ソースコード検査器130と、モデル検査器106と、仕様入力部107とを備える。ソースコード検査器130は、ソースコード入力部102と、パス抽出部103と、検査内容決定部120と、制御部140と、記憶媒体150とを備える。検査内容決定部120は、モデルグラフ構成部104と、モデル記述生成部105とを備える。
ソースコード入力部102は、計算機用のプログラムであるソースコード101を入力する。パス抽出部103は、ソースコード入力部102によって受け入れられたソースコード101の実行される可能性のある命令列を抽出し、抽出した命令列をモデルグラフ構成部104に送る。モデルグラフ構成部104は、パス抽出部103で抽出されたパスの情報をグラフとしてまとめ、まとめたグラフをモデル記述生成部105に送る。
モデル記述生成部105は、モデルグラフ構成部104において構成されたグラフを基にモデル記述を生成し、生成したモデル記述を、ソースコード検査器130の外部にあるモデル検査器実行部106に送る。
制御部140は、記憶媒体150に記憶されたソースコード検査方法を実行させる方法実行プログラムにより、ソースコード検査器130の各部を制御する。記憶媒体150は、ハードディスク記憶装置や半導体メモリ、CD−ROMなどで構成される。
モデル検査器実行部106は、仕様入力部107から受け入れた検査するソースコード101の性質を表す制約を記載した検査する仕様108と、モデル記述生成部105において生成されたモデル記述とを用いてモデル検査を実行し、検査結果109を出力する。上記制御部140は、記憶媒体150に記憶されたプログラムによって、モデル検査器実行部106を制御するようにしてもよい。ソースコード検査器の各部は、ランダムロジックを用いたハードウエアで構成しても、コンピュータに実行させるソフトウエアで構成しても、あるいはそれらの混成であってもよい。
次に、パス抽出部103について詳細に説明する。
パス抽出部103では、まず検査の対象となるソースコード101を基に、その制御フローグラフを構成する。
制御フローグラフとは、ソースコード101の制御構造を表現したものであり、処理ブロックノード、判定ノード、合流ノードの三つの基本要素から成るグラフである。処理ブロックノードとは、判定による分岐のない連続したソースコードの命令列に対応するグラフの頂点である。判定ノードとは、ある式の真偽値によって実行する命令列が分岐する点を意味するグラフの頂点である。合流ノードとは、複数の命令列が合流する点を意味するグラフの頂点である。
図2に本実施例におけるソースコードの例、図3に図2のソースコードに基づいて構成した制御フローグラフの例をそれぞれ示す。
図3は処理ブロックノード301、303、305、および306と、判定ノード302と、合流ノード304と、各ノードをつなぐ有向辺とからなる。
パス抽出部103は、このような制御フローグラフを生成する。
次に、パス抽出部103は、構成した制御フローグラフに基づいた実行されうる命令列の抽出、すなわち実行パス抽出する。ここではC言語に基づいた実行パス抽出例を示すが、C言語に限らず、C++やJava(登録商標)などの言語においても同様の方法によって命令列を抽出することができる。
パス抽出部103は、検査の対象となるソースコード101を改変し、改変されたソースコードをコンパイルし、実行することによって実行パス抽出を行う。パス抽出部103が行うソースコード101の改変は、実行される命令列を抽出するためのものであり、元のソースコード101が意味する振る舞いには影響を与えない。すなわちパス抽出部103は、ソースコード101を模擬に実行し、そこで実行された命令列を抽出する。
以下、パス抽出部103の処理について、図3および図4を用いて具体的に説明する。図4は図2に示したソースコードを実行パス抽出のために改変した例を示す図である。
401で示される文はフラグ変数を定義、初期化する文である。402で示される文は開始点を表すラベルと変数定義に含まれる初期化文である。403で示される文は不定値を持つ変数を改変する関数である。404で示される文は分岐命令に対応したフラグ変数に1を代入する文である。405で示される文はフラグ変数が全て1かどうかを判定する関数である。
まず、パス抽出部103は、制御フローグラフに含まれる判定ノードの数と同じ数のフラグ変数をグローバル変数定義領域に定義する。図4の例では、パス抽出部103は、int main(){から始まって、この{に対応する最後の}で終わる領域の外、つまり401のある所か、最後の}の下の領域に、グローバル変数定義領域を定義する。
フラグ変数は、それぞれ異なる名前を持ち、0で初期化され、0あるいは1の2値を格納する領域を持つグローバル変数であるとする。例えば、制御フローグラフに含まれる判定ノードが三つである場合、パス抽出部103は、改変するソースコードの冒頭のグローバル変数定義領域に、「int flag1=0,flag2=0,flag3=0;」と記述する。
次に、パス抽出部103は、制御フローグラフに含まれる判定ノード302のそれぞれについて、一つの分岐を選び、分岐先の処理ブロックノード303に対応する命令列(free(p);)の先頭に、フラグ変数に1を代入する命令文404を挿入する。
パス抽出部103は、一度使用したフラグ変数は用いずに、フラグ変数に1を代入する操作を繰り返す。また、パス抽出部103は、それぞれの判定ノードに対応する分岐命令文の直前に、不定値となっている変数を実行パス探索のために改変する関数403を挿入する。
不定値となる変数は、ソースコード記述範囲外からの入力、例えばプログラム使用者から入力、によって改変される値や乱数によって決定される値、そしてその値に依存して決定される値を持つ変数を意味する。データフロー解析によってそれぞれの変数が不定値を持つかどうかを判定することができる。
挿入する関数は、対応する分岐命令文に含まれる不定値となっている変数を引数にとり、それぞれの変数の値を改変する。またこの関数は、呼び出されるたびに異なる値の組み合わせを、引数で与えられたそれぞれの変数に代入する。
次に、パス抽出部103は、ソースコード101中の、変数定義文を除いて最初に実行される命令に対応する命令文(図4中の402で示される部分の直後にあるp=malloc(sizeof(char)))の前に、開始点を表すラベル(402で示される一行目、init_point)を挿入し、そのラベルを挿入した場所の直後に、変数定義文中に含まれる変数の初期化命令(402で示される部分の二行目、p=0;)を追加する。
次に、パス抽出部103は、ソースコード中に含まれるプログラム終了を意味する文の直前(405で示される部分の直後、return 0;)に、それぞれ上記手続きで挿入したフラグ変数の全てに1が代入されているかどうかを判定し、全てに1が代入されている場合は終了し、それ以外の場合は上記手続きで挿入したラベルに戻る関数(405で示されるcheck_point(flag1))を挿入する。
ここで終了した場合、パス抽出部103は、実行した命令列の情報をモデルグラフ構成部104に受け渡す。
このように、パス抽出部103は、図2に示すソースコードに401〜405で示される文を挿入する。
これにより、パス抽出部103が、全ての判定ノードの組み合わせにフラグ変数の代入を繰り返すことで、実行しうる命令列の全てを抽出することができる。
なお、ソースコードの規模が大きく、組み合わせの数が膨大になる場合は、使用できる計算機資源により適宜上記抽出を中止し、下記手続きに進むことが好ましい。
次に、検査内部決定部120に含まれるモデルグラフ構成部104について詳細に説明する。
パス抽出部103の実行によって、実行された命令列の集合がモデルグラフ構成部104に受け渡される。モデルグラフ構成部104は、この集合を基に、モデルグラフを構成する。ここで構成するモデルグラフは、頂点と辺の集合からなり、各頂点には対応する命令文がラベルとしてそれぞれ付記され、各辺は起点と終点にそれぞれグラフ中の頂点が一つずつ対応する有向辺である。
以下、モデルグラフ構成部104がモデルグラフを構成する方法について述べる。
まず、モデルグラフ構成部104は、命令列の集合から一つの命令列を取り出す。次に、モデルグラフ構成部104は、この列の命令の出現順に対応する命令文を表すラベルを付記した頂点を生成、1つ前に生成した頂点と新たに生成された頂点をそれぞれ起点、終点とする辺を生成する。この操作によって、一つの選ばれた命令列に対応する一列のモデルグラフが構成される。ここで最初に生成される頂点を開始頂点と呼ぶ。
次に、モデルグラフ構成部104は、(1)命令列の集合から一つの命令列を取り出し、上記と同様に一列のモデルグラフを構成する。
次に、モデルグラフ構成部104は、(2)すでに構成されているモデルグラフと、それぞれの開始頂点から比較し、異なる命令文に対応するラベルが付記されている頂点が出現した場合にグラフを枝分かれさせ、元のモデルグラフに残りの命令列に対応する新たなモデルグラフを付加する。
次に、モデルグラフ構成部104は、(3)命令列の集合の要素がなくなるまで(1)に戻る、の手続きを(1)から順に実行する。これによってモデルグラフを構成することができる。そして、モデルグラフ構成部104は、構成されたモデルグラフを、モデル記述生成部105に受け渡す。図5に示すグラフは、図2で示したソースコードからパスを抽出した結果を基に構成したモデルグラフである。
このように、モデルグラフ構成部104は、図5に示すように遷移条件付き、つまりソースコードの意味する振る舞いを正確に再現したモデルグラフを構成する。
次に、モデル記述生成部105について詳細を述べる。ここでは、モデルグラフ構成部104から受け渡された図5に示すモデルグラフを基に、モデル検査器SPIN用モデル記述言語のプロメラによるモデル記述(図6に図示)を生成する例を挙げる。ここで生成するモデル記述は文字列の列である。図6は、図5のモデルグラフを基に生成したプロメラによるモデル記述である。
まず、モデル記述生成部105は、プロメラで記述するモデルの開始点を生成する。ここで開始点の記述は、601で示される部分で、「proctype main(){」である。
次に、モデル記述生成部105は、モデルグラフの開始点から順に頂点を選び、以下を実行する。
まず、モデル記述生成部105は、(1)選んだ頂点の次が分岐になっていない場合(図5中の500a〜500iで示される部分)、その頂点に付記されているラベルをLとしたとき、図6中の602a〜602iに示すように、「L:skip;」をモデル記述に付加する。
次に、モデル記述生成部105は、続くモデルグラフ中の頂点を選び、(1)あるいは以下の(2)を実行する。
(2)、モデル記述生成部105は、選んだ頂点の次が分岐になっている場合(図5中の501で示される部分)、その頂点に付記されているラベルをLとしたとき、図6中の603で示される部分以降に示すように、「L:if::A::B fi;」をモデル記述に付加する。
次に、モデル記述生成部105は、それぞれの分岐先の頂点を選び、それぞれ(1)、(2)を実行し、上記A、Bを書き換える。この場合、Aは図6中の604で示される部分、Bは605で示される部分である。
そして、モデル記述生成部105は、以上をモデルグラフの頂点全てを選び実行するまで繰り返す。最後に、図6中の606で示される、「}」をモデル記述に加える。
モデル記述生成部105は、ここで得られたモデル記述をモデル検査器実行部106に受け渡す。
そして、モデル検査器実行部106では、上記モデル記述生成部から受け渡されたモデル記述と、仕様入力部107から受け取る仕様をモデル検査器に入力し、モデル検査の結果を検査結果109として出力する。
以上説明したように、第1実施例によれば、パス抽出部103がソースコードによって記述された応用プログラムを模擬に実行することで、実際に実行される命令列を抽出する。そして、検査内容決定部120に含まれるモデルグラフ構成部104が抽出した命令列からモデルグラフを構成し、モデル記述生成部105が構成したモデルグラフからモデル記述を生成するようにでき、ソースコードの検査を行うことができる。
このように、ソースコードを模擬に実行することにより、検査の対象とするソースコードの意味するプログラムの振る舞いを逸脱するモデル記述が生成されることがなくなる。このため、検査の対象とするソースコードの意味するプログラムの振る舞いを逸脱た部分に対応するモデル記述によって引き起こされる、誤った異常の検出が行われなくなる。すなわち、元々のソースコードの振る舞いでは検査対象の仕様の制約を満たしていたにもかかわらず、その振る舞いを逸脱したモデル記述が存在したために仕様の性質を満たさなくなった場合に検出される、仕様を満たさないという誤った検査結果を報告されることがなくなる。
また、モデル検査を行う前にモデルグラフを抽出しておくことで、モデルグラフを縮退させるなどの効率化手段を適用する余地を残すことが可能となる。
また、第1実施例によれば、従来必要だったソースコード変換テーブルをなくすことができるので、ソースコードを検査する人がソースコード変換テーブルを修正する必要がなくなる。
(第2実施例)
本発明の第2実施例について説明する。第2実施例では、パス抽出部103がプログラムを模擬に実行する方法として、ソースコードを論理式に変換し、その論理式の充足可能性判定を行うことで、実際に実行される命令列を抽出する。論理式の充足可能性判定とは、与えられた論理式全体を1、すなわち真とするような変数値の割り当てが存在するか否かを判定することである。
第2実施例におけるソースコード検査器を含むソースコード検査システムの構成は第1実施例と同様であるので、第1実施例におけるソースコード検査器について、図1を用いて説明する。
第2実施例におけるソースコード検査器130は、パス抽出部103において、ソースコード101を論理式に変換し、その論理式の充足可能性判定を行うことで、ソースコードの実行される命令列を抽出する。
ここでは、パス抽出部103は、ソースコード101を論理式に変換し、充足可能性判定を行うツールとして、モデル検査器CBMC(Bounded Model Checker for ANSI−C programs)を利用する。CBMCは、C言語のソースコードを入力とし、これを論理式に変換し、その論理式の充足可能性判定を行うことで入力されたソースコードの諸性質を検査するモデル検査器である。パス抽出部103は、パス抽出のため、アサート文を常に満たす、という性質を検査する機能を利用する。
パス抽出部103の処理について、図7を用いて具体的に説明する。図7は、本発明の第2実施例において、図2に示したソースコードを実行パス抽出のために改変した例を示す図である。
図7で示すソースコードは、図2に示すソースコードに対し、フラグ変数504、502および、アサート文503が挿入されている。
パス抽出部103は、検査の対象となるソースコード101を基に、その制御フローグラフを構成する。次に、パス抽出部103は、CBMCに入力するためのC言語のソースコードを、入力のソースコードを改変することによって生成する。
まず、パス抽出部103は、第1実施例と同様、フラグ変数504の定義の挿入、代入文503の挿入を行う。
次に、パス抽出部103は、ソースコード101中に含まれるプログラム終了を意味する文の直前に、それぞれ上記手続きで挿入したフラグ変数の全てに1が代入されているということはないという意味の宣言文、すなわちアサート(assert)文503を挿入する。例えば、フラグ変数がflag1、flag2、flag3の3つであったとするとき、挿入するアサート文は、「assert(flag1!=1||flag2!=1||flag3!=1)」となる。
次に、パス抽出部103は、上記手続きによって改変し、得られたソースコードをCBMCに入力する。
このとき、もしアサート文の宣言に違反する場合がCBMCによって指摘されれば、挿入したフラグ変数が全て1になる場合があることを意味する。すなわち、フラグ変数に1を代入した箇所を全て通過する実行可能パスが存在することを意味する。
よって、CBMCによるアサート文の違反の指摘は、CBMCに入力し、実行した結果に、「Failed assertion:」の文字列が含まれる場合であり、パス抽出部103は、出力の文字列を検索することにより、アサート文の違反を判定できる。
パス抽出部103は、実行可能パスと判定された場合、そのパスに対応する命令列の情報を検査内容決定部120に含まれるモデルグラフ構成部104に受け渡す。
パス抽出部103は、上記手続きをフラグ変数502に1を代入する箇所を変更しながら繰り返すことで、モデルグラフ構成部104に実行可能な命令列の情報を集積する。
このように、十分な情報が集積された後、第1実施例で挙げたモデルグラフ構成部104の実行、およびそれ以後の実行を同様に行うことで、ソースコードの検査を行うことができる。
以上説明したように、本実施例によれば、パス抽出部103において、ソースコード101を論理式に変換し、論理式の充足可能性判定を行うことで、ソースコード101の実行される可能性のある命令列を抽出できる。これにより、検査の対象とするソースコード101で与えられるプログラムを実際に実行することを必要とせずにプログラムの振る舞いを抽出することができる。このように、検証の対象とするソースコード101を実際にコンパイル、リンクして実行可能にする必要がないため、例えばリンクなどができない、一連のソースコード群から一部のソースコードの集合だけを対象としたモデル検査を行うことが可能となる。
(第3実施例)
本発明の第3実施例は、ソースコードの情報を基にモデル検査器実行部に入力する仕様を自動的に生成する手段を備えたものである。
以下、第3実施例にかかるソースコード検査器について説明する。図8は、本発明の第3実施例におけるソースコード検査器を含むソースコード検査システムのブロック図である。なお、図1の構成と同様の構成を有するものについては、同一符号を付しその説明を省略する。
本実施例におけるソースコード検査システム600は、ソースコード入力部102によって受け入れられたソースコード101の情報を基に、モデル検査器実行部106に入力する仕様を自動的に生成する仕様自動生成部601を備えた点が特徴である。ソースコード検査器131は、ソースコード入力部102と、パス抽出部103と、検査内容決定部120と、仕様自動生成部601と、制御部140と、記憶媒体150とを備える。
次に、仕様自動生成部601の仕様の自動生成法について述べる。
まず、仕様自動生成部601は、ソースコード入力部102によって受け入れられたソースコード101を読み込み、必ず対になって使われるべき命令文を全て検索する。
例えば、C言語で記述されたソースコードを扱う場合は、fopenに対するfclose、openに対するclose、mallocやcallocなどメモリをヒープ領域に確保する文に対するfreeを含む命令文などが、それぞれ必ず対になって使われるべき命令文である。
次に、仕様自動生成部601は、上記手続きで検索した結果として検出された命令文の対A、Bについて、仕様に以下の式、「[](A−><>B)」を加える。
上式は、Aが出現した場合に、必ずBが出現するという制約を表す式である。
例えばfp=fopen(fname,“w”)と、fclose(fp)という対になる命令文が存在した場合、仕様自動生成部601は、以下の式、「[](“fp=fopen(fname,“w”)”−><>“fclose(fp)”)」を仕様に加える。
仕様自動生成部601は、以上の処理を、全ての検出された文の対について繰り返す。
また、仕様自動生成部601は、すでに仕様として式が存在し、これに新たな式を加える場合は、演算子“&&”を用いて連結する。演算子“&&”は論理積を表し、制約を新たに追加する場合に用いられる。
以上説明したように、第3実施例によれば、第1実施例と違いユーザが仕様有力部107から仕様108を入力する必要がなくなり、例えばソースコードによって記述された応用プログラムがメモリの不正使用を行わないことを意味する仕様を自動生成できる。つまり、煩わしく、ときに専門知識を要する仕様108の入力を必要としなくなる。
(第4実施例)
本発明の第4実施例は、抽出された実行される可能性のある命令列がメモリの不正使用を行わないかどうかを判定するものである。
以下、本実施例におけるソースコード検査器について、図9を用いて説明する。図9は、本実施例におけるソースコード検査器の構成を示すブロック図である。なお、図1の構成と同様の構成を有するものについては、同一符号を付しその説明を省略する。
第4実施例におけるソースコード検査器700は、ソースコード入力部102と、パス抽出部103と、検査内容決定部122と、制御部140と、記憶媒体150とを備える。検査内容決定部122は、検証プログラム生成部701と、検証プログラム実行部702とを備える。検証プログラム生成部701は、パス抽出部103によって抽出された実行される可能性のある命令列を受け取り、その命令列がメモリの不正使用を行わないかどうかを単独で判定するための検証プログラムを生成する。検証プログラム実行部702は、検証プログラム生成部701で生成された検証プログラムを実行する。
次に、検証プログラム生成部701における、検証プログラム生成方法について、詳細を述べる。検証プログラム生成部701が、生成する検証プログラムは、パス抽出部103によって抽出された実行される可能性のある命令列を基に生成する文字列からなる。
検証プログラム生成部701が、この文字列を生成する手順について、図10を用いて説明する。図10は、本実施例において、図5に示すグラフの左側の分岐をもとに、検証プログラム生成部701での処理によって生成されたプログラムの例を示す図である。
まず、検証プログラム生成部701は、1001で示される部分、「int main(){(1001)」を開始文字列とする。検証プログラム生成部701は、この開始文字列1001に文字列を順に付加していくことで、検証プログラムの文字列を構成する。次に、検証プログラム生成部701は、パス抽出部103で生成された命令列に対応する命令文にセミコロンを付加した文字列を順に上記開始文字列に付加する。
このとき、図5の500cに示すようにmalloc関数が存在し、かつ、図5の500d、500eに示すようにwz_malloc、free関数が存在した場合、検証プログラム生成部701は、wz_malloc、free関数を図10中の1002に示すようにwz_freeと置き換える。
また、命令列に含まれる式中にポインタ変数が含まれる場合、検証プログラム生成部701は、そのポインタ変数のそれぞれについて、そのポインタ変数を引数としたwz_check関数の呼び出し文を式の前に挿入する。
また、命令列の最後がreturn文でなかった場合は、検証プログラム生成部701は、「return 0;}」を、また、returnであった場合は、図10中1003に示すように、「}」を付加する。
最後に、検証プログラム生成部701は、図11〜図13に示す文字列を付加する。
以上のように、検証プログラム生成部701は、検証プログラムを生成する。そして、検証プログラム生成部701は、生成した検証プログラムを検証プログラム実行部702に受け渡す。
検証プログラム実行部702では、検証プログラム生成部701から受け渡された検証プログラムをコンパイルし、実行する。実行した結果を検査結果109として表示する。ここで、「Memory leak was detected.」と表示されると、パス抽出部103によって抽出された命令列が実行された場合に、メモリリークが発生することを検出したことを意味する。
また、「Used non−active object.」と表示されると、パス抽出部103によって抽出された命令列が実行された場合に、ヌルポインタを使用しようとすることを検出したことを意味する。
以上説明したように、本実施例によれば、検証プログラム生成部701で、プログラムがメモリの不正使用を行わないことを意味する仕様を自動的に生成するので、メモリの不正使用に関する知識を必要とせず、メモリの不正使用に関するソースコード検査を行うことが可能となる。また、第1実施例における仕様入力部107を必要とせず、プログラムのメモリの不正使用に関する検査を行うことができるようになる。
また、本実施例によれば、単独でソースコード検査を行えるプログラムを出力することにより、第1実施例におけるモデル検査器実行部106を不要とすることができる。すなわち外部のモデル検査器を用いる必要がなくなるため、可搬性、および利便性が向上する。
以上のように、本発明によれば、ソースコードの意味するプログラムの振る舞いを逸脱することなく、ソースコードの検査を行うことができる。検査の対象とするソースコードの意味する振る舞いを逸脱することなく、より正確にソースコードの検査を実現することができる。また、本発明は、ソフトウェアの正当性検査等の分野に適用でき、その利用可能性は大きい。
本発明は、計算機プログラムのソースコードが意味するプログラムの振る舞いに関する諸性質を検査するソースコード検査器及びソースコード検査方法、当該方法を実行させるプログラム、当該プログラムを格納する記憶媒体に関する。
従来のソースコード検査器として、ソースコードが意味するプログラム(以下、応用プログラムとも記す)の振る舞いに関する諸性質を検査するソースコード分析器がある。ソースコード分析器の例としては、モデル検査技術を用いてソースコードを分析するソースコードモデル検査器がある。
ソースコードが意味する応用プログラムの振る舞いとは、ソースコードに記述された一連の命令に従う、プログラムの一連の動作を意味する。この振る舞いに関する諸性質の例として、メモリを動的に確保した場合は必ずそのメモリを解放する性質、プログラム中のある命令を実行した場合は必ずいつか対応する特定の命令を実行する性質などが挙げられる。
モデル検査とは、検査する性質を表す仕様と検査の対象となるモデルとを入力とし、モデルが仕様の表す性質を有するかどうかを判定することである。モデル検査を行う装置をモデル検査器と呼び、検査の対象となるモデルを記述したものをモデル記述と呼ぶ。モデルを記述するための言語は、モデル検査器によって様々に異なる。例えば、モデル検査器SPINの場合、モデルを記述するための言語はプロメラ(Promela)と呼ばれるものである。
モデル検査器SPINは、有限状態遷移系としてモデル化したシステムが線形時間論理式で記述された検査式を満たすかを全状態検索で網羅的に検査する検査器である。モデル検査器SPINは、例えば、Gerard J.Holzmann,’The model Checker Spin’,IEEE Trans,On Software Engineering,Vol.23,No.5,May 1997,pp.279−295に開示されている。
ソースコードモデル検査とは、ソースコードを検査の対象としたモデル検査を指し、論理回路などハードウェアを対象とするモデル検査であるハードウェアモデル検査との対比のため用いる語である。
従来のソースコード検査器としては、ソースコードをモデル検査器の入力言語に翻訳するための変換表を用いるものがある。この構成は、例えば、米国特許出願公開第2001/037492号、米国特許出願公開第2002/100022号に開示されている。図14は、米国特許出願公開第2001/037492号に記載された従来のソースコード検査器の構成を示すブロック図である。
図14に示す従来のソースコード検査器であるモデル検査器は、検査の対象となるソースコード1301をソースコード入力部1302から入力する。次に、このソースコード検査器は、ソースコード変換テーブル生成部1303において、ソースコード入力部1302によって受け入れたソースコード1301を基に制御フローグラフを構成する。そして、その制御フローグラフから検査の対象となるソースコード1301の各文について、対応するモデル記述言語、例えばプロメラの記述で書かれた対訳例を集めたソースコード変換テーブル1304を生成する。
次に、モデル記述生成部1305が、ソースコード変換テーブル1304に含まれる対訳例を用いてソースコード1301をモデル記述言語に変換する。また、仕様入力部1307は、入力された検査するソースコード1301の性質を表す仕様を記載した検査する仕様1308をモデル検査器実行部1306へ渡す。そして、モデル検査器実行部1306が、仕様入力部1307からの仕様1308と、モデル記述生成部1305において生成されたモデル記述とを用いてモデル検査を実行し、検査結果1309を出力する。
また、自動的に生成されたソースコード変換テーブル1304がソースコードモデル検査器の使用者の意に沿わない場合、使用者の修正手段1310がソースコード変換テーブル1304を適宜修正する必要がある。それは、例えば、検査の対象となるソースコード1301が、そのソースコード以外のもの、例えば外部モジュールとの通信など、を扱う場合などである。ソースコード変換テーブル生成部1303が適正な翻訳例を示すことができない場合も多く、これを使用者が補う必要がある。
ソースコードモデル検査で用いるプロメラなどのモデル記述言語と、ソースコードを記述している例えばC言語などのプログラミング言語とでは表現力が違う。具体的には、プログラミング言語では記述できて、モデル記述言語では記述できない遷移条件が存在する。このため、ソースコードの意味する振る舞いをモデル記述言語に正確に翻訳することが本質的に困難であり得、適切なソースコード変換テーブルを生成することが困難な場合が多い。よって、検査の対象となるソースコードの意味する振る舞いを正確に再現するモデル記述が得られず、不正確な検査になる場合が多いという問題があり得る。
詳細に説明すると、モデル検査は、モデルの記述を基にラベル付き有向グラフを生成し、このグラフが例えば線形時間論理式などで与えられる仕様の意味する制約を満たしているかどうかを判定する、という手順で行われる。線形時間論理式とは、命題論理式に時間の概念を追加して構成されるもので、状態遷移モデルを形式的に記述する際等で広く用いられている。
ラベル付き有向グラフとは、頂点と辺の集合からなる。各辺は2頂点間の関係を表し、頂点同士を結ぶ辺には向きが存在する。すなわち、ラベル付き有向グラフには、辺の起点、および終点に一つずつ対応する頂点が存在し、各頂点にはラベルが付記されている。
ラベル付き有向グラフの各頂点を状態とみなし、辺の向きに沿って頂点を移動することを状態遷移とみなすとき、ラベル付き有向グラフは状態遷移図とみなすことができる。各頂点のラベルは、各状態で生起されるイベントであるとみなすことができる。そして、モデル検査は、そのイベントの生起の列が与えられた仕様の制約を満たしているかどうかを判定する。
しかしながら、ラベル付き有向グラフは、遷移条件が存在しない。遷移条件とは、ある頂点を起点とした複数の辺があるとき、どの辺の終点の頂点に遷移するべきかを判断する条件である。遷移条件が存在しないということは、ある頂点を起点とした複数の辺があるとき、どちらの辺の頂点に対応する状態を次の状態とみなすかは任意に選択可能であるということを意味する。モデル検査は通常、検査する仕様の制約に違反しているかどうかを確認するため、任意に選択可能な遷移先については、常に最悪の場合を選択する。
しかしながら、ソースコードが意味する振る舞いを表す状態遷移図は、一般に遷移条件付きラベル付き有向グラフで表される。例えばif文などで表される条件節は、その条件式の真偽によって次状態が決定される。
以上の理由から、遷移条件のないラベル付き有向グラフによって意味づけられるモデル記述言語と、遷移条件付きラベル付き有向グラフによって意味づけられる一般のプログラミング言語との間を逐語訳で変換することは本質的な困難さを伴うという問題があり得る。また、従来の方法では、検査器の使用者がソースコード変換テーブルを修正することは困難であり得る。
詳細に説明すると、検査器の使用者はソースコード変換テーブルの修正を行う際、変換テーブルに記述されたモデル記述を理解する必要がある。さらに、ソースコードの意味する応用プログラムの振る舞いを正確に反映していない箇所を特定する必要があり、その箇所について代替となる翻訳を与える必要がある。また、検査の対象となるソースコード以外の部分について、モデル検査が適切に行われるように配慮しながら、その部分を補完するモデル記述を与える必要がある。これは使用者がモデル検査の専門家であったとしても、困難さや煩雑さを伴う作業となり得る。
本発明は、検査の対象となるソースコードの意味する振る舞いをより正確に検査するソースコード検査器及びソースコード検査方法、当該方法を実行させる方法実行プログラム、当該プログラムを格納する記憶媒体を提供する。
本発明は、あらかじめ入力された計算機用プログラムのソースコードによって記述された応用プログラムを模擬に実行することで実際に実行される命令列を抽出するパス抽出ステップと、パス抽出ステップで抽出した命令列に基づいてソースコードの検査内容を決定する検査内容決定ステップと、を含むようにした。本発明によれば、ソースコードの意味する振る舞いをより正確に検査することができる。
本発明のソースコード検査方法は、パス抽出ステップと、検査内容決定ステップと、を含む。パス抽出ステップは、あらかじめ入力された計算機用プログラムのソースコードによって記述された応用プログラムを模擬に実行することで実際に実行される命令列を抽出する。検査内容決定ステップは、パス抽出ステップで抽出した命令列に基づいてソースコードの検査内容を決定する。
これにより、検査の対象とするソースコードの意味するプログラムの振る舞いを逸脱することなく、ソースコードの検査を行うことができる。
また、本発明のソースコード検査方法は、検査内容決定ステップが、モデル記述とソースコードを検査する性質を表す仕様とによりソースコードのモデル検査を行うモデル検査実行ステップに前置し、モデルグラフ構成ステップと、モデル記述生成ステップと、を含むようにしてもよい。モデルグラフ構成ステップは、パス抽出ステップで抽出した命令列からモデルグラフを構成する。モデル記述生成ステップは、モデルグラフ構成ステップで構成したモデルグラフからモデル記述を生成する。モデル記述生成部が生成したモデル記述とあらかじめ入力された仕様とによりモデル検査実行ステップでソースコードの検査を行うようにしてもよい。
この方法によれば、モデル検査手法を用いて、さらに検査の対象とするソースコードの意味するプログラムの振る舞いを逸脱するモデル記述が生成されることがなくなる。このため、検査の対象とするソースコードの意味するプログラムの振る舞いを逸脱した部分に対応するモデル記述によって引き起こされる、誤った異常な検出が行われなくなる。すなわち、本発明の方法では、ソースコードの振る舞いを逸脱するモデル記述が存在しない。このため、元々のソースコードの振る舞いでは検査対象の仕様の制約を満たしていたにもかかわらず、仕様を満たさないという誤った検査結果を報告されることがなくなる。また、モデル検査を行う前にモデルグラフを抽出しておくことで、モデルグラフを縮退させるなどの効率化手段を適用する余地を残すことが可能となる。
また、本発明のソースコード検査方法は、パス抽出ステップが、ソースコードを論理式に変換し、論理式の充足可能性判定を行うことでソースコードの実行される可能性のある命令列を抽出するようにしてもよい。
この方法によれば、さらに検査の対象とするソースコードで与えられるプログラムを模擬に、すなわち、条件文が成り立つか成り立たないかを充足可能性判定していくことにより、プログラムの振る舞いを抽出することができる。このように、検証の対象とするソースコードをコンパイル、リンクして実行可能にする必要がないため、例えばリンクなどができない、一連のソースコード群から一部のソースコードの集合だけを対象としたモデル検査を行うことが可能となる。
また、本発明のソースコード検査方法は、仕様を自動で生成する仕様自動生成ステップをさらに含み、あらかじめ入力された仕様は、仕様自動生成ステップで生成した仕様であるようにしてもよい。
この方法によれば、さらに仕様を手で入力する必要とがなくなる。つまり、煩わしく、ときに専門知識を要する仕様の手入力を必要としなくなる。
また、本発明のソースコード検査方法は、仕様自動生成ステップが、ソースコードによって記述されたプログラムがメモリの不正使用を行わないことを意味する仕様を自動生成するようにしてもよい。
この方法によれば、さらにメモリの不正使用に関する知識を必要とせず、メモリの不正使用に関するモデル検査を行うことが可能となる。また、仕様の手入力を必要とせず、プログラムのメモリの不正使用に関する検査を行うことができるようになる。
さらに、本発明のソースコード検査方法は、検査内容決定ステップが、検証プログラム生成ステップと、検証プログラム実行ステップと、を含むようにしてもよい。検証プログラム生成ステップは、抽出された命令列がメモリの不正使用を行わないかどうかを単独で判定するための検証プログラムを生成する。検証プログラム実行ステップは、生成された検証プログラムを実行する。
これにより、モデル検査実行ステップせずソースコードの検査を行うことができる。すなわち外部のモデル検査方法を用いる必要がなくなるため、可搬性、および利便性が向上する。
本発明の方法実行プログラムは、コンピュータに上記ソースコード検査方法を実行させるプログラムである。また、本発明の記憶媒体は、上記方法実行プログラムを格納する記憶媒体である。
以下、本発明の実施例について、図面を参照しながら説明する。
(第1実施例)
本発明の第1実施例にかかるソースコード検査器を含むソースコード検査システムについて、図1を用いて説明する。図1は、第1実施例におけるソースコード検査器を含むソースコード検査システムのブロック図である。
第1実施例にかかるソースコード検査システム100は、コンピュータシステムであって、ソースコード検査器130と、モデル検査器106と、仕様入力部107とを備える。ソースコード検査器130は、ソースコード入力部102と、パス抽出部103と、検査内容決定部120と、制御部140と、記憶媒体150とを備える。検査内容決定部120は、モデルグラフ構成部104と、モデル記述生成部105とを備える。
ソースコード入力部102は、計算機用のプログラムであるソースコード101を入力する。パス抽出部103は、ソースコード入力部102によって受け入れられたソースコード101の実行される可能性のある命令列を抽出し、抽出した命令列をモデルグラフ構成部104に送る。モデルグラフ構成部104は、パス抽出部103で抽出されたパスの情報をグラフとしてまとめ、まとめたグラフをモデル記述生成部105に送る。
モデル記述生成部105は、モデルグラフ構成部104において構成されたグラフを基にモデル記述を生成し、生成したモデル記述を、ソースコード検査器130の外部にあるモデル検査器実行部106に送る。
制御部140は、記憶媒体150に記憶されたソースコード検査方法を実行させる方法実行プログラムにより、ソースコード検査器130の各部を制御する。記憶媒体150は、ハードディスク記憶装置や半導体メモリ、CD−ROMなどで構成される。
モデル検査器実行部106は、仕様入力部107から受け入れた検査するソースコード101の性質を表す制約を記載した検査する仕様108と、モデル記述生成部105において生成されたモデル記述とを用いてモデル検査を実行し、検査結果109を出力する。上記制御部140は、記憶媒体150に記憶されたプログラムによって、モデル検査器実行部106を制御するようにしてもよい。ソースコード検査器の各部は、ランダムロジックを用いたハードウエアで構成しても、コンピュータに実行させるソフトウエアで構成しても、あるいはそれらの混成であってもよい。
次に、パス抽出部103について詳細に説明する。
パス抽出部103では、まず検査の対象となるソースコード101を基に、その制御フローグラフを構成する。
制御フローグラフとは、ソースコード101の制御構造を表現したものであり、処理ブロックノード、判定ノード、合流ノードの三つの基本要素から成るグラフである。処理ブロックノードとは、判定による分岐のない連続したソースコードの命令列に対応するグラフの頂点である。判定ノードとは、ある式の真偽値によって実行する命令列が分岐する点を意味するグラフの頂点である。合流ノードとは、複数の命令列が合流する点を意味するグラフの頂点である。
図2に本実施例におけるソースコードの例、図3に図2のソースコードに基づいて構成した制御フローグラフの例をそれぞれ示す。
図3は処理ブロックノード301、303、305、および306と、判定ノード302と、合流ノード304と、各ノードをつなぐ有向辺とからなる。
パス抽出部103は、このような制御フローグラフを生成する。
次に、パス抽出部103は、構成した制御フローグラフに基づいた実行されうる命令列の抽出、すなわち実行パス抽出する。ここではC言語に基づいた実行パス抽出例を示すが、C言語に限らず、C++やJava(登録商標)などの言語においても同様の方法によって命令列を抽出することができる。
パス抽出部103は、検査の対象となるソースコード101を改変し、改変されたソースコードをコンパイルし、実行することによって実行パス抽出を行う。パス抽出部103が行うソースコード101の改変は、実行される命令列を抽出するためのものであり、元のソースコード101が意味する振る舞いには影響を与えない。すなわちパス抽出部103は、ソースコード101を模擬に実行し、そこで実行された命令列を抽出する。
以下、パス抽出部103の処理について、図3および図4を用いて具体的に説明する。図4は図2に示したソースコードを実行パス抽出のために改変した例を示す図である。
401で示される文はフラグ変数を定義、初期化する文である。402で示される文は開始点を表すラベルと変数定義に含まれる初期化文である。403で示される文は不定値を持つ変数を改変する関数である。404で示される文は分岐命令に対応したフラグ変数に1を代入する文である。405で示される文はフラグ変数が全て1かどうかを判定する関数である。
まず、パス抽出部103は、制御フローグラフに含まれる判定ノードの数と同じ数のフラグ変数をグローバル変数定義領域に定義する。図4の例では、パス抽出部103は、int main(){から始まって、この{に対応する最後の}で終わる領域の外、つまり401のある所か、最後の}の下の領域に、グローバル変数定義領域を定義する。
フラグ変数は、それぞれ異なる名前を持ち、0で初期化され、0あるいは1の2値を格納する領域を持つグローバル変数であるとする。例えば、制御フローグラフに含まれる判定ノードが三つである場合、パス抽出部103は、改変するソースコードの冒頭のグローバル変数定義領域に、「int flag1=0,flag2=0,flag3=0;」と記述する。
次に、パス抽出部103は、制御フローグラフに含まれる判定ノード302のそれぞれについて、一つの分岐を選び、分岐先の処理ブロックノード303に対応する命令列(free(p);)の先頭に、フラグ変数に1を代入する命令文404を挿入する。
パス抽出部103は、一度使用したフラグ変数は用いずに、フラグ変数に1を代入する操作を繰り返す。また、パス抽出部103は、それぞれの判定ノードに対応する分岐命令文の直前に、不定値となっている変数を実行パス探索のために改変する関数403を挿入する。
不定値となる変数は、ソースコード記述範囲外からの入力、例えばプログラム使用者から入力、によって改変される値や乱数によって決定される値、そしてその値に依存して決定される値を持つ変数を意味する。データフロー解析によってそれぞれの変数が不定値を持つかどうかを判定することができる。
挿入する関数は、対応する分岐命令文に含まれる不定値となっている変数を引数にとり、それぞれの変数の値を改変する。またこの関数は、呼び出されるたびに異なる値の組み合わせを、引数で与えられたそれぞれの変数に代入する。
次に、パス抽出部103は、ソースコード101中の、変数定義文を除いて最初に実行される命令に対応する命令文(図4中の402で示される部分の直後にあるp=malloc(sizeof(char)))の前に、開始点を表すラベル(402で示される一行目、init_point)を挿入し、そのラベルを挿入した場所の直後に、変数定義文中に含まれる変数の初期化命令(402で示される部分の二行目、p=0;)を追加する。
次に、パス抽出部103は、ソースコード中に含まれるプログラム終了を意味する文の直前(405で示される部分の直後、return 0;)に、それぞれ上記手続きで挿入したフラグ変数の全てに1が代入されているかどうかを判定し、全てに1が代入されている場合は終了し、それ以外の場合は上記手続きで挿入したラベルに戻る関数(405で示されるcheck_point(flag1))を挿入する。
ここで終了した場合、パス抽出部103は、実行した命令列の情報をモデルグラフ構成部104に受け渡す。
このように、パス抽出部103は、図2に示すソースコードに401〜405で示される文を挿入する。
これにより、パス抽出部103が、全ての判定ノードの組み合わせにフラグ変数の代入を繰り返すことで、実行しうる命令列の全てを抽出することができる。
なお、ソースコードの規模が大きく、組み合わせの数が膨大になる場合は、使用できる計算機資源により適宜上記抽出を中止し、下記手続きに進むことが好ましい。
次に、検査内部決定部120に含まれるモデルグラフ構成部104について詳細に説明する。
パス抽出部103の実行によって、実行された命令列の集合がモデルグラフ構成部104に受け渡される。モデルグラフ構成部104は、この集合を基に、モデルグラフを構成する。ここで構成するモデルグラフは、頂点と辺の集合からなり、各頂点には対応する命令文がラベルとしてそれぞれ付記され、各辺は起点と終点にそれぞれグラフ中の頂点が一つずつ対応する有向辺である。
以下、モデルグラフ構成部104がモデルグラフを構成する方法について述べる。
まず、モデルグラフ構成部104は、命令列の集合から一つの命令列を取り出す。次に、モデルグラフ構成部104は、この列の命令の出現順に対応する命令文を表すラベルを付記した頂点を生成、1つ前に生成した頂点と新たに生成された頂点をそれぞれ起点、終点とする辺を生成する。この操作によって、一つの選ばれた命令列に対応する一列のモデルグラフが構成される。ここで最初に生成される頂点を開始頂点と呼ぶ。
次に、モデルグラフ構成部104は、(1)命令列の集合から一つの命令列を取り出し、上記と同様に一列のモデルグラフを構成する。
次に、モデルグラフ構成部104は、(2)すでに構成されているモデルグラフと、それぞれの開始頂点から比較し、異なる命令文に対応するラベルが付記されている頂点が出現した場合にグラフを枝分かれさせ、元のモデルグラフに残りの命令列に対応する新たなモデルグラフを付加する。
次に、モデルグラフ構成部104は、(3)命令列の集合の要素がなくなるまで(1)に戻る、の手続きを(1)から順に実行する。これによってモデルグラフを構成することができる。そして、モデルグラフ構成部104は、構成されたモデルグラフを、モデル記述生成部105に受け渡す。図5に示すグラフは、図2で示したソースコードからパスを抽出した結果を基に構成したモデルグラフである。
このように、モデルグラフ構成部104は、図5に示すように遷移条件付き、つまりソースコードの意味する振る舞いを正確に再現したモデルグラフを構成する。
次に、モデル記述生成部105について詳細を述べる。ここでは、モデルグラフ構成部104から受け渡された図5に示すモデルグラフを基に、モデル検査器SPIN用モデル記述言語のプロメラによるモデル記述(図6に図示)を生成する例を挙げる。ここで生成するモデル記述は文字列の列である。図6は、図5のモデルグラフを基に生成したプロメラによるモデル記述である。
まず、モデル記述生成部105は、プロメラで記述するモデルの開始点を生成する。ここで開始点の記述は、601で示される部分で、「proctype main(){」である。
次に、モデル記述生成部105は、モデルグラフの開始点から順に頂点を選び、以下を実行する。
まず、モデル記述生成部105は、(1)選んだ頂点の次が分岐になっていない場合(図5中の500a〜500iで示される部分)、その頂点に付記されているラベルをLとしたとき、図6中の602a〜602iに示すように、「L:skip;」をモデル記述に付加する。
次に、モデル記述生成部105は、続くモデルグラフ中の頂点を選び、(1)あるいは以下の(2)を実行する。
(2)、モデル記述生成部105は、選んだ頂点の次が分岐になっている場合(図5中の501で示される部分)、その頂点に付記されているラベルをLとしたとき、図6中の603で示される部分以降に示すように、「L: if ::A ::B fi;」をモデル記述に付加する。
次に、モデル記述生成部105は、それぞれの分岐先の頂点を選び、それぞれ(1)、(2)を実行し、上記A、Bを書き換える。この場合、Aは図6中の604で示される部分、Bは605で示される部分である。
そして、モデル記述生成部105は、以上をモデルグラフの頂点全てを選び実行するまで繰り返す。最後に、図6中の606で示される、「}」をモデル記述に加える。
モデル記述生成部105は、ここで得られたモデル記述をモデル検査器実行部106に受け渡す。
そして、モデル検査器実行部106では、上記モデル記述生成部から受け渡されたモデル記述と、仕様入力部107から受け取る仕様をモデル検査器に入力し、モデル検査の結果を検査結果109として出力する。
以上説明したように、第1実施例によれば、パス抽出部103がソースコードによって記述された応用プログラムを模擬に実行することで、実際に実行される命令列を抽出する。そして、検査内容決定部120に含まれるモデルグラフ構成部104が抽出した命令列からモデルグラフを構成し、モデル記述生成部105が構成したモデルグラフからモデル記述を生成するようにでき、ソースコードの検査を行うことができる。
このように、ソースコードを模擬に実行することにより、検査の対象とするソースコードの意味するプログラムの振る舞いを逸脱するモデル記述が生成されることがなくなる。このため、検査の対象とするソースコードの意味するプログラムの振る舞いを逸脱した部分に対応するモデル記述によって引き起こされる、誤った異常の検出が行われなくなる。すなわち、元々のソースコードの振る舞いでは検査対象の仕様の制約を満たしていたにもかかわらず、その振る舞いを逸脱したモデル記述が存在したために仕様の性質を満たさなくなった場合に検出される、仕様を満たさないという誤った検査結果を報告されることがなくなる。
また、モデル検査を行う前にモデルグラフを抽出しておくことで、モデルグラフを縮退させるなどの効率化手段を適用する余地を残すことが可能となる。
また、第1実施例によれば、従来必要だったソースコード変換テーブルをなくすことができるので、ソースコードを検査する人がソースコード変換テーブルを修正する必要がなくなる。
(第2実施例)
本発明の第2実施例について説明する。第2実施例では、パス抽出部103がプログラムを模擬に実行する方法として、ソースコードを論理式に変換し、その論理式の充足可能性判定を行うことで、実際に実行される命令列を抽出する。論理式の充足可能性判定とは、与えられた論理式全体を1、すなわち真とするような変数値の割り当てが存在するか否かを判定することである。
第2実施例におけるソースコード検査器を含むソースコード検査システムの構成は第1実施例と同様であるので、第1実施例におけるソースコード検査器について、図1を用いて説明する。
第2実施例におけるソースコード検査器130は、パス抽出部103において、ソースコード101を論理式に変換し、その論理式の充足可能性判定を行うことで、ソースコードの実行される命令列を抽出する。
ここでは、パス抽出部103は、ソースコード101を論理式に変換し、充足可能性判定を行うツールとして、モデル検査器CBMC(Bounded Model Checker for ANSI−C programs)を利用する。CBMCは、C言語のソースコードを入力とし、これを論理式に変換し、その論理式の充足可能性判定を行うことで入力されたソースコードの諸性質を検査するモデル検査器である。パス抽出部103は、パス抽出のため、アサート文を常に満たす、という性質を検査する機能を利用する。
パス抽出部103の処理について、図7を用いて具体的に説明する。図7は、本発明の第2実施例において、図2に示したソースコードを実行パス抽出のために改変した例を示す図である。
図7で示すソースコードは、図2に示すソースコードに対し、フラグ変数504、502および、アサート文503が挿入されている。
パス抽出部103は、検査の対象となるソースコード101を基に、その制御フローグラフを構成する。次に、パス抽出部103は、CBMCに入力するためのC言語のソースコードを、入力のソースコードを改変することによって生成する。
まず、パス抽出部103は、第1実施例と同様、フラグ変数504の定義の挿入、代入文503の挿入を行う。
次に、パス抽出部103は、ソースコード101中に含まれるプログラム終了を意味する文の直前に、それぞれ上記手続きで挿入したフラグ変数の全てに1が代入されているということはないという意味の宣言文、すなわちアサート(assert)文503を挿入する。例えば、フラグ変数がflag1、flag2、flag3の3つであったとするとき、挿入するアサート文は、「assert(flag1!=1||flag2!=1||flag3!=1)」となる。
次に、パス抽出部103は、上記手続きによって改変し、得られたソースコードをCBMCに入力する。
このとき、もしアサート文の宣言に違反する場合がCBMCによって指摘されれば、挿入したフラグ変数が全て1になる場合があることを意味する。すなわち、フラグ変数に1を代入した箇所を全て通過する実行可能パスが存在することを意味する。
よって、CBMCによるアサート文の違反の指摘は、CBMCに入力し、実行した結果に、「Failed assertion:」の文字列が含まれる場合であり、パス抽出部103は、出力の文字列を検索することにより、アサート文の違反を判定できる。
パス抽出部103は、実行可能パスと判定された場合、そのパスに対応する命令列の情報を検査内容決定部120に含まれるモデルグラフ構成部104に受け渡す。
パス抽出部103は、上記手続きをフラグ変数502に1を代入する箇所を変更しながら繰り返すことで、モデルグラフ構成部104に実行可能な命令列の情報を集積する。
このように、十分な情報が集積された後、第1実施例で挙げたモデルグラフ構成部104の実行、およびそれ以後の実行を同様に行うことで、ソースコードの検査を行うことができる。
以上説明したように、本実施例によれば、パス抽出部103において、ソースコード101を論理式に変換し、論理式の充足可能性判定を行うことで、ソースコード101の実行される可能性のある命令列を抽出できる。これにより、検査の対象とするソースコード101で与えられるプログラムを実際に実行することを必要とせずにプログラムの振る舞いを抽出することができる。このように、検証の対象とするソースコード101を実際にコンパイル、リンクして実行可能にする必要がないため、例えばリンクなどができない、一連のソースコード群から一部のソースコードの集合だけを対象としたモデル検査を行うことが可能となる。
(第3実施例)
本発明の第3実施例は、ソースコードの情報を基にモデル検査器実行部に入力する仕様を自動的に生成する手段を備えたものである。
以下、第3実施例にかかるソースコード検査器について説明する。図8は、本発明の第3実施例におけるソースコード検査器を含むソースコード検査システムのブロック図である。なお、図1の構成と同様の構成を有するものについては、同一符号を付しその説明を省略する。
本実施例におけるソースコード検査システム600は、ソースコード入力部102によって受け入れられたソースコード101の情報を基に、モデル検査器実行部106に入力する仕様を自動的に生成する仕様自動生成部601を備えた点が特徴である。ソースコード検査器131は、ソースコード入力部102と、パス抽出部103と、検査内容決定部120と、仕様自動生成部601と、制御部140と、記憶媒体150とを備える。
次に、仕様自動生成部601の仕様の自動生成法について述べる。
まず、仕様自動生成部601は、ソースコード入力部102によって受け入れられたソースコード101を読み込み、必ず対になって使われるべき命令文を全て検索する。
例えば、C言語で記述されたソースコードを扱う場合は、fopenに対するfclose、openに対するclose、mallocやcallocなどメモリをヒープ領域に確保する文に対するfreeを含む命令文などが、それぞれ必ず対になって使われるべき命令文である。
次に、仕様自動生成部601は、上記手続きで検索した結果として検出された命令文の対A、Bについて、仕様に以下の式、「[](A−><>B)」を加える。
上式は、Aが出現した場合に、必ずBが出現するという制約を表す式である。
例えばfp=fopen(fname,“w”)と、fclose(fp)という対になる命令文が存在した場合、仕様自動生成部601は、以下の式、「[](“fp=fopen(fname,“w”)”−><>“fclose(fp)”)」を仕様に加える。
仕様自動生成部601は、以上の処理を、全ての検出された文の対について繰り返す。
また、仕様自動生成部601は、すでに仕様として式が存在し、これに新たな式を加える場合は、演算子“&&”を用いて連結する。演算子“&&”は論理積を表し、制約を新たに追加する場合に用いられる。
以上説明したように、第3実施例によれば、第1実施例と違いユーザが仕様有力部107から仕様108を入力する必要がなくなり、例えばソースコードによって記述された応用プログラムがメモリの不正使用を行わないことを意味する仕様を自動生成できる。つまり、煩わしく、ときに専門知識を要する仕様108の入力を必要としなくなる。
(第4実施例)
本発明の第4実施例は、抽出された実行される可能性のある命令列がメモリの不正使用を行わないかどうかを判定するものである。
以下、本実施例におけるソースコード検査器について、図9を用いて説明する。図9は、本実施例におけるソースコード検査器の構成を示すブロック図である。なお、図1の構成と同様の構成を有するものについては、同一符号を付しその説明を省略する。
第4実施例におけるソースコード検査器700は、ソースコード入力部102と、パス抽出部103と、検査内容決定部122と、制御部140と、記憶媒体150とを備える。検査内容決定部122は、検証プログラム生成部701と、検証プログラム実行部702とを備える。検証プログラム生成部701は、パス抽出部103によって抽出された実行される可能性のある命令列を受け取り、その命令列がメモリの不正使用を行わないかどうかを単独で判定するための検証プログラムを生成する。検証プログラム実行部702は、検証プログラム生成部701で生成された検証プログラムを実行する。
次に、検証プログラム生成部701における、検証プログラム生成方法について、詳細を述べる。検証プログラム生成部701が、生成する検証プログラムは、パス抽出部103によって抽出された実行される可能性のある命令列を基に生成する文字列からなる。
検証プログラム生成部701が、この文字列を生成する手順について、図10を用いて説明する。図10は、本実施例において、図5に示すグラフの左側の分岐をもとに、検証プログラム生成部701での処理によって生成されたプログラムの例を示す図である。
まず、検証プログラム生成部701は、1001で示される部分、「int main(){ (1001)」を開始文字列とする。検証プログラム生成部701は、この開始文字列1001に文字列を順に付加していくことで、検証プログラムの文字列を構成する。次に、検証プログラム生成部701は、パス抽出部103で生成された命令列に対応する命令文にセミコロンを付加した文字列を順に上記開始文字列に付加する。
このとき、図5の500cに示すようにmalloc関数が存在し、かつ、図5の500d、500eに示すようにwz_malloc、free関数が存在した場合、検証プログラム生成部701は、wz_malloc、free関数を図10中の1002に示すようにwz_freeと置き換える。
また、命令列に含まれる式中にポインタ変数が含まれる場合、検証プログラム生成部701は、そのポインタ変数のそれぞれについて、そのポインタ変数を引数としたwz_check関数の呼び出し文を式の前に挿入する。
また、命令列の最後がreturn文でなかった場合は、検証プログラム生成部701は、「return 0;}」を、また、returnであった場合は、図10中1003に示すように、「}」を付加する。
最後に、検証プログラム生成部701は、図11〜図13に示す文字列を付加する。
以上のように、検証プログラム生成部701は、検証プログラムを生成する。そして、検証プログラム生成部701は、生成した検証プログラムを検証プログラム実行部702に受け渡す。
検証プログラム実行部702では、検証プログラム生成部701から受け渡された検証プログラムをコンパイルし、実行する。実行した結果を検査結果109として表示する。ここで、「Memory leak was detected.」と表示されると、パス抽出部103によって抽出された命令列が実行された場合に、メモリリークが発生することを検出したことを意味する。
また、「Used non−active object.」と表示されると、パス抽出部103によって抽出された命令列が実行された場合に、ヌルポインタを使用しようとすることを検出したことを意味する。
以上説明したように、本実施例によれば、検証プログラム生成部701で、プログラムがメモリの不正使用を行わないことを意味する仕様を自動的に生成するので、メモリの不正使用に関する知識を必要とせず、メモリの不正使用に関するソースコード検査を行うことが可能となる。また、第1実施例における仕様入力部107を必要とせず、プログラムのメモリの不正使用に関する検査を行うことができるようになる。
また、本実施例によれば、単独でソースコード検査を行えるプログラムを出力することにより、第1実施例におけるモデル検査器実行部106を不要とすることができる。すなわち外部のモデル検査器を用いる必要がなくなるため、可搬性、および利便性が向上する。
以上のように、本発明によれば、ソースコードの意味するプログラムの振る舞いを逸脱することなく、ソースコードの検査を行うことができる。検査の対象とするソースコードの意味する振る舞いを逸脱することなく、より正確にソースコードの検査を実現することができる。また、本発明は、ソフトウェアの正当性検査等の分野に適用でき、その利用可能性は大きい。
本発明の第1実施例におけるソースコード検査器を含むソースコード検査システムのブロック図 同実施例における検証の対象となるソースコードの例を示す図 図2で示したソースコードを基に構成した制御フローグラフを示す図 図2で示したソースコードをパス抽出用に改変したソースコードを示す図 図2で示したソースコードからパスを抽出した結果を基に構成したモデルグラフを示す図 図5のモデルグラフを基に生成したモデル記述を示す図 本発明の第2実施例に係わり、図2で示したソースコードを、CBMCを用いたパス抽出用に改変したソースコードを示す図 本発明の第3実施例におけるソースコード検査器を含むソースコード検査システムのブロック図 本発明の第4実施例におけるソースコード検査器のブロック図 同実施例における検証プログラムの例を示す図 同実施例における、検証プログラムの一部を示す第1の図 同実施例における、検証プログラムの一部を示す第2の図 同実施例における、検証プログラムの一部を示す第3の図 従来のソースコード検査器の構成を表すブロック図
符号の説明
100,600 ソースコード検査システム
102 ソースコード入力部
103 パス抽出部
104 モデルグラフ構成部
105 モデル記述生成部
106 モデル検査器実行部
107 仕様入力部
120,122 検査内容決定部
130,131,700 ソースコード検査器
140 制御部
150 記憶媒体
601 仕様自動生成部
701 検証プログラム生成部
702 検証プログラム実行部

Claims (14)

  1. あらかじめ入力された計算機用プログラムのソースコードによって記述されたプログラムを模擬に実行することで実際に実行される命令列を抽出するパス抽出ステップと、前記パス抽出ステップで抽出した命令列に基づいて前記ソースコードの検査内容を決定する検査内容決定ステップと、を含むソースコード検査方法。
  2. 前記検査内容決定ステップは、モデル記述と前記ソースコードを検査する性質を表す仕様とにより前記ソースコードのモデル検査を行うモデル検査実行ステップに前置し、前記パス抽出ステップで抽出した命令列からモデルグラフを構成するモデルグラフ構成ステップと、前記モデルグラフ構成ステップで構成したモデルグラフからモデル記述を生成するモデル記述生成ステップと、を備え、前記モデル記述生成部が生成したモデル記述とあらかじめ入力された仕様とにより前記モデル検査実行ステップで前記ソースコードの検査を行う請求項1記載のソースコード検査方法。
  3. 前記パス抽出ステップは、前記ソースコードを論理式に変換し前記論理式の充足可能性判定を行うことで前記実際実行される命令列を抽出する請求項1記載のソースコード検査方法。
  4. 前記仕様を自動で生成する仕様自動生成ステップをさらに含み、前記あらかじめ入力された仕様は、前記仕様自動生成ステップで生成した仕様である請求項2記載のソースコード検査方法。
  5. 前記仕様自動生成ステップは、前記ソースコードによって記述されたプログラムがメモリの不正使用を行わないことを意味する仕様を自動生成する請求項4記載のソースコード検査方法。
  6. 前記検査内容決定ステップは、前記パス抽出ステップで抽出した命令列がメモリの不正使用を行わないかどうかを検証するための検証プログラムを生成する検証プログラム生成ステップと、前記検証プログラム生成ステップで生成した検証プログラムを実行する検証プログラム実行ステップと、を含む請求項1記載のソースコード検査方法。
  7. コンピュータにソースコード検査方法を実行させる方法実行プログラムであって、前記方法は、
    あらかじめ入力された計算機用プログラムのソースコードによって記述された応用プログラムを模擬に実行することで実際に実行される命令列を抽出するパス抽出ステップと、前記パス抽出ステップで抽出した命令列に基づいて前記ソースコードの検査内容を決定する検査内容決定ステップと、を有する。
  8. コンピュータにソースコード検査方法を実行させる方法実行プログラムを格納する記憶媒体であって、前記方法は、
    あらかじめ入力された計算機用プログラムのソースコードによって記述された応用プログラムを模擬に実行することで実際に実行される命令列を抽出するパス抽出ステップと、前記パス抽出ステップで抽出した命令列に基づいて前記ソースコードの検査内容を決定する検査内容決定ステップと、を有する。
  9. あらかじめ入力された計算機用プログラムのソースコードによって記述されたプログラムを模擬に実行することで実際に実行される命令列を抽出するパス抽出部と、前記パス抽出部が抽出した命令列に基づいて前記ソースコードの検査内容を決定する検査内容決定部と、を備えるソースコード検査器。
  10. 前記検査内容決定部は、モデル記述と前記ソースコードを検査する性質を表す仕様とにより前記ソースコードのモデル検査を行うモデル検査器実行部に前置し、
    前記パス抽出部が抽出した命令列からモデルグラフを構成するモデルグラフ構成部と、前記モデルグラフ構成部が構成したモデルグラフからモデル記述を生成するモデル記述生成部と、を備え、前記モデル記述生成部が生成したモデル記述とあらかじめ入力された仕様とにより前記モデル検査器実行部で前記ソースコードの検査を行う請求項9記載のソースコード検査器。
  11. 前記パス抽出部は、前記ソースコードを論理式に変換し前記論理式の充足可能性判定を行うことで前記実際に実行される命令列を抽出する請求項9記載のソースコード検査器。
  12. 前記仕様を自動で生成する仕様自動生成部をさらに備え、前記あらかじめ入力された仕様は、前記仕様自動生成部が生成した仕様である請求項10記載のソースコード検査器。
  13. 前記仕様自動生成部は、前記ソースコードによって記述されたプログラムがメモリの不正使用を行わないことを意味する仕様を自動生成する請求項12記載のソースコード検査器。
  14. 前記検査内容決定部は、前記パス抽出部で抽出した命令列がメモリの不正使用を行わないかどうかを検証するための検証プログラムを生成する検証プログラム生成部と、前記検証プログラム生成部が生成した検証プログラムを実行する検証プログラム実行部と、を備えた請求項9記載のソースコード検査器。
JP2006539189A 2004-10-04 2005-08-29 ソースコード検査器、方法、プログラム及び記憶媒体 Pending JPWO2006038394A1 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
JP2004291987 2004-10-04
JP2004291987 2004-10-04
PCT/JP2005/015625 WO2006038394A1 (ja) 2004-10-04 2005-08-29 ソースコード検査器、方法、プログラム及び記憶媒体

Publications (1)

Publication Number Publication Date
JPWO2006038394A1 true JPWO2006038394A1 (ja) 2008-05-15

Family

ID=36142479

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006539189A Pending JPWO2006038394A1 (ja) 2004-10-04 2005-08-29 ソースコード検査器、方法、プログラム及び記憶媒体

Country Status (4)

Country Link
US (1) US8020153B2 (ja)
JP (1) JPWO2006038394A1 (ja)
CN (1) CN101036127A (ja)
WO (1) WO2006038394A1 (ja)

Families Citing this family (34)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8713513B2 (en) * 2006-12-13 2014-04-29 Infosys Limited Evaluating programmer efficiency in maintaining software systems
JP4679540B2 (ja) * 2007-03-16 2011-04-27 株式会社日立情報システムズ プログラム検証方法とシステムおよびプログラム
JP2008257390A (ja) * 2007-04-03 2008-10-23 Toshiba Information Systems (Japan) Corp プログラム検査装置及びプログラム検査用プログラム
JP4924188B2 (ja) * 2007-04-27 2012-04-25 トヨタ自動車株式会社 クロス検証装置
US8997054B2 (en) * 2007-11-30 2015-03-31 Red Hat, Inc. Software application certification service
US8397216B2 (en) * 2008-02-29 2013-03-12 International Business Machines Corporation Compiler for a declarative event-driven programming model
US8627299B2 (en) 2008-02-29 2014-01-07 International Business Machines Corporation Virtual machine and programming language for event processing
US8365149B2 (en) * 2008-02-29 2013-01-29 International Business Machines Corporation Debugger for a declarative event-driven programming model
JP2009211503A (ja) * 2008-03-05 2009-09-17 Nec Corp ソースコード検証装置、及びソースコード検証方法
US8402440B2 (en) * 2008-07-07 2013-03-19 Nec Laboratories America, Inc. Program verification through symbolic enumeration of control path programs
JP5396930B2 (ja) * 2009-03-10 2014-01-22 日本電気株式会社 検証対象関数自動選択装置、検証対象関数自動選択方法、及び検証対象関数自動選択用プログラム
US8412668B2 (en) * 2009-10-14 2013-04-02 GM Global Technology Operations LLC Offline formal verification of executable models
US20110302559A1 (en) * 2010-06-04 2011-12-08 Mayur Naik Method and apparatus for leveraging path-program analysis for effective static whole-program analysis
JP5463226B2 (ja) * 2010-07-15 2014-04-09 株式会社日立製作所 ソースコード検査方法およびソースコード検査装置
JP2012059026A (ja) * 2010-09-09 2012-03-22 Hitachi Ltd ソースコード変換方法およびソースコード変換プログラム
US9027002B2 (en) * 2010-10-27 2015-05-05 Hitachi, Ltd. Method of converting source code and source code conversion program
JP5643971B2 (ja) * 2011-12-01 2014-12-24 株式会社日立製作所 ソースコード変換方法及びソースコード変換プログラム
US8819772B2 (en) * 2012-06-25 2014-08-26 Appthority, Inc. In-line filtering of insecure or unwanted mobile device software components or communications
US10133557B1 (en) * 2013-01-11 2018-11-20 Mentor Graphics Corporation Modifying code to reduce redundant or unnecessary power usage
WO2014189553A1 (en) * 2013-05-21 2014-11-27 Concurix Corporation Graph for navigating application code
US9734040B2 (en) 2013-05-21 2017-08-15 Microsoft Technology Licensing, Llc Animated highlights in a graph representing an application
US8990777B2 (en) 2013-05-21 2015-03-24 Concurix Corporation Interactive graph for navigating and monitoring execution of application code
US9280841B2 (en) 2013-07-24 2016-03-08 Microsoft Technology Licensing, Llc Event chain visualization of performance data
US9292415B2 (en) 2013-09-04 2016-03-22 Microsoft Technology Licensing, Llc Module specific tracing in a shared module environment
EP3069267A4 (en) 2013-11-13 2017-09-27 Microsoft Technology Licensing, LLC Software component recommendation based on multiple trace runs
US10929108B2 (en) 2017-02-01 2021-02-23 Siemens Industry Software Nv Methods and systems for verifying a software program
CN106980506A (zh) * 2017-03-31 2017-07-25 山东超越数控电子有限公司 一种php源码保护方法
US10740470B2 (en) * 2017-05-31 2020-08-11 Shiftleft Inc. System and method for application security profiling
US10956574B2 (en) 2017-10-07 2021-03-23 Shiftleft Inc. System and method for securing applications through an application-aware runtime agent
EP3493051A1 (en) * 2017-11-30 2019-06-05 The MathWorks, Inc. System and methods for evaluating compliance of implementation code with a software architecture specification
US11074362B2 (en) 2017-12-04 2021-07-27 ShiftLeft, Inc. System and method for code-based protection of sensitive data
DE102018003142A1 (de) 2017-12-13 2019-06-13 The Mathworks, Inc. Automatische Einstellung von Multitasking-Konfigurationen für ein Codeprüfsystem
CN109271507B (zh) * 2018-09-21 2022-02-08 长沙学院 处理子串信息的方法、计算机数据管理系统、舆情分析系统、社会网络分析系统
US11514172B2 (en) 2018-11-15 2022-11-29 Grabango Co. System and method for information flow analysis of application code

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS6415836A (en) 1987-07-10 1989-01-19 Mitsubishi Electric Corp Detection system for comprehensiveness of software test
JPH01237737A (ja) 1988-03-17 1989-09-22 Fujitsu Ltd フラグ識別支援方式
US5781753A (en) * 1989-02-24 1998-07-14 Advanced Micro Devices, Inc. Semi-autonomous RISC pipelines for overlapped execution of RISC-like instructions within the multiple superscalar execution units of a processor having distributed pipeline control for speculative and out-of-order execution of complex instructions
JPH04289928A (ja) 1991-03-19 1992-10-14 Hitachi Ltd マイクロプログラム検証方式
US5854929A (en) * 1996-03-08 1998-12-29 Interuniversitair Micro-Elektronica Centrum (Imec Vzw) Method of generating code for programmable processors, code generator and application thereof
EP1018684A2 (en) 1998-12-15 2000-07-12 Lucent Technologies Inc. Method and apparatus for developing event driven software
JP4098448B2 (ja) 1999-10-07 2008-06-11 富士通株式会社 プログラム検証方法及び装置
US7490292B2 (en) * 1999-12-17 2009-02-10 International Business Machines Corporation Web-based instruction
US7024661B2 (en) * 2000-01-07 2006-04-04 Hewlett-Packard Development Company, L.P. System and method for verifying computer program correctness and providing recoverable execution trace information
US20010047397A1 (en) * 2000-02-18 2001-11-29 Jameson David H. Method and system for using pervasive device to access webpages
US20010037492A1 (en) * 2000-03-16 2001-11-01 Holzmann Gerard J. Method and apparatus for automatically extracting verification models
US20020100022A1 (en) * 2000-05-08 2002-07-25 Holzmann Gerard J. Method and apparatus for automatic verification of properties of a concurrent software system
US7146605B2 (en) * 2001-01-15 2006-12-05 International Business Machines Corporation Automatic abstraction of software source
JP2002288004A (ja) 2001-03-27 2002-10-04 Canon Inc プログラムソース処理装置、プログラムソース処理方法、およびプログラムソース処理プログラム
US7421680B2 (en) * 2003-09-22 2008-09-02 Microsoft Corporation Persisted specifications of method pre-and post-conditions for static checking
US20050223361A1 (en) * 2004-04-01 2005-10-06 Belbute John L Software testing based on changes in execution paths
GB0407657D0 (en) * 2004-04-03 2004-05-05 Ibm Symbolic model checking of software

Also Published As

Publication number Publication date
CN101036127A (zh) 2007-09-12
US8020153B2 (en) 2011-09-13
WO2006038394A1 (ja) 2006-04-13
US20080256518A1 (en) 2008-10-16

Similar Documents

Publication Publication Date Title
JPWO2006038394A1 (ja) ソースコード検査器、方法、プログラム及び記憶媒体
CN104899147B (zh) 一种面向安全检查的代码静态分析方法
BR102016018127A2 (pt) método para projeto com base em modelo de software de segurança crítica
US20110314337A1 (en) Method and Apparatus for Locating Input-Model Faults Using Dynamic Tainting
US8719771B2 (en) Method and system for test reduction and analysis
Selim et al. Model transformation testing: The state of the art
Brown et al. Software testing
US7539977B1 (en) Automatic bug isolation in computer programming languages
Ratiu et al. Automated testing of DSL implementations: experiences from building mbeddr
US10824402B2 (en) Bytecode generation from UML models
Delmas et al. Supporting model based design
JP5464031B2 (ja) プログラム検証装置、方法及びプログラム
Brun et al. Equation-directed axiomatization of lustre semantics to enable optimized code validation
Lai et al. Defining and verifying behaviour of domain specific language with fUML
Parizi et al. A survey on aspect-oriented testing approaches
Sampath et al. Testing model-processing tools for embedded systems
Xie et al. Translating software designs for model checking
Miyazaki et al. Synthesis and refinement check of sequence diagrams
JP5736588B2 (ja) ソースコード変換方法及びソースコード変換プログラム
Tahat et al. Scalable Translation Validation of Unverified Legacy OS Code
Akhtar et al. A Systematic Literature Review on Software-refactoring Techniques, Challenges, and Practices
Wijendra et al. Software Complexity Reduction through the Process Automation in Software Development Life Cycle
Nguyen et al. A Graph Analysis Based Approach for Specification-Driven Testing of Model Transformations
Dutta Localizing Faults Using Verification Technique
Dutta Localizing faults using verification technique