(57)【要約】【課題】コンピュータプログラムの詳細な解析結果を得る技術を提供する。【解決手段】コンピュータプログラムのコードを取得し、取得した前記コードのうち、変数を含む部分のコードを解析対象とし、当該解析対象のコードが所定の静的解析条件を満たすか否かによってバグの可能性を判定し、前記バグの可能性があると判定された解析対象のコードに含まれる前記変数の値を取得する取得コードを前記プログラムに挿入し、前記プログラムを実行し、前記取得コードによって取得した値を前記変数に代入した場合に前記解析対象のコードが所定の動的解析条件を満たすか否かによってバグを判定する。【選択図】図１
2011133966.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータプログラムのコードを取得する取得部と、
取得した前記コードのうち、変数を含む部分のコードを解析対象とし、当該解析対象のコードが所定の静的解析条件を満たすか否かによってバグの可能性を判定する静的解析部と、
前記バグの可能性があると判定された解析対象のコードに含まれる前記変数の値を取得する取得コードを前記プログラムに挿入する挿入部と、
前記プログラムを実行し、前記取得コードによって取得した値を前記変数に代入した場合に前記解析対象のコードが所定の動的解析条件を満たすか否かによってバグを判定する動的解析部と、
を備えた解析装置。
【請求項２】
前記静的解析条件が、解析対象のコードに含まれる変数の値によって誤りが生じるか否かである請求項１に記載の解析装置。
【請求項３】
コンピュータプログラムのコードを取得するステップと、
取得した前記コードのうち、変数を含む部分のコードを解析対象とし、当該解析対象のコードが所定の静的解析条件を満たすか否かによってバグの可能性を判定するステップと、
前記バグの可能性があると判定された解析対象のコードに含まれる前記変数の値を取得する取得コードを前記プログラムに挿入するステップと、
前記プログラムを実行し、前記取得コードによって取得した値を前記変数に代入した場合に前記解析対象のコードが所定の動的解析条件を満たすか否かによってバグを判定するステップと、
をコンピュータが実行する解析方法。
【請求項４】
前記静的解析条件が、解析対象のコードに含まれる変数の値によって誤りが生じるか否かである請求項３に記載の解析方法。
【請求項５】
コンピュータプログラムのコードを取得するステップと、
取得した前記コードのうち、変数を含む部分のコードを解析対象とし、当該解析対象のコードが所定の静的解析条件を満たすか否かによってバグの可能性を判定するステップと、
前記バグの可能性があると判定された解析対象のコードに含まれる前記変数の値を取得する取得コードを前記プログラムに挿入するステップと、
前記プログラムを実行し、前記取得コードによって取得した値を前記変数に代入した場合に前記解析対象のコードが所定の動的解析条件を満たすか否かによってバグを判定するステップと、
をコンピュータに実行させるための解析プログラム。
【請求項６】
前記静的解析条件が、解析対象のコードに含まれる変数の値によって誤りが生じるか否かである請求項５に記載の解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本件は、プログラムを解析する技術に関する。
【背景技術】
【０００２】
プログラムのバグを検出するツールの一つとして、静的解析ツールがある。静的解析手法は、解析対象のコードを実行する必要がなく、また、テストケースを作成する必要が無い、大規模で複雑なコードの解析が可能といった利点がある。
【０００３】
また、先行技術としては、以下の特許文献が存在する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平９−２６８９７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
静的解析ツールは、ソースコードにバグとなる形式が含まれていれば、バグの可能性を指摘するが、実際にエラーとなるか否かは判断できない場合がある。
［例１］
char a[5];
char b[10]
strcpy(b, "123456789");
strcpy(a, b);
【０００６】
［例１］のプログラムでは、１行目で変数ａのサイズを５、２行目で変数ｂのサイズを１０と定義し、４行目で変数ｂの値を変数ａにコピーしているので、静的解析ツールは、以下のように指摘メッセージを出力する。
【０００７】
[指摘メッセージ]
pgr0532  strcpy(a, b) は領域 a を超えてコピーしてしまう可能性があります。(複写先 : a, 複写元 : b)
静的解析ツールは、strcpy関数のように、領域から領域にデータをコピーする関数について、コピー元の領域（変数ｂ）のサイズとコピー先（変数ａ）の領域のサイズを比較し、コピー先の領域のサイズの方が小さい場合に上記［指摘メッセージ］を出力する。
【０００８】
［例１］のプログラムでは、４行目で"123456789"を変数ｂにコピーしているので、５
行目のstrcpy(a, b)でコピーする値が変数Ａのサイズを超えるためバグとなる。
【０００９】
一方、［例２］のプログラムでは、４行目で"123"を変数ｂにコピーしているので、５
行目のstrcpy(a, b)でコピーする値が変数Ａのサイズを超えないためバグとならない。
【００１０】
［例２］
char a[5];
char b[10]
strcpy(b, "123");
strcpy(a, b);
【００１１】
静的解析ではプログラムを実際に動作させないので、実値を求めることはできず、静的解析ツールは、例１又は例２のケースで実際にバグとなるか否かまで解析することができない。
【００１２】
そこで、開示の一形態は、コンピュータプログラムの詳細な解析結果を得る技術を提供する。
【課題を解決するための手段】
【００１３】
開示の一実施形態としての解析装置は、
コンピュータプログラムのコードを取得する取得部と、
取得した前記コードのうち、変数を含む部分のコードを解析対象とし、当該解析対象のコードが所定の静的解析条件を満たすか否かによってバグの可能性を判定する静的解析部と、
前記バグの可能性があると判定された解析対象のコードに含まれる前記変数の値を取得する取得コードを前記プログラムに挿入する挿入部と、
前記プログラムを実行し、前記取得コードによって取得した値を前記変数に代入した場合に前記解析対象のコードが所定の動的解析条件を満たすか否かによってバグを判定する動的解析部と、を備えた。
【発明の効果】
【００１４】
開示の一実施形態は、コンピュータプログラムの詳細な解析結果を得る技術を提供する。
【図面の簡単な説明】
【００１５】
【図１】解析装置の構成図
【図２】解析方法の全体のフローを示す図
【図３】サンプルプログラムを示す図
【図４】静的解析処理の説明図
【図５】取得コードの挿入処理の説明図
【図６】動的解析処理の説明図
【図７】動的解析処理のテストケースの説明図
【図８】出力処理の説明図
【図９】解析結果を示す図
【図１０】解析結果を示す図
【図１１】挿入内容ＤＢの一例を示す図
【図１２】挿入内容ＤＢの一例を示す図
【図１３】挿入内容ＤＢの一例を示す図
【図１４】挿入内容ＤＢの一例を示す図
【図１５】挿入内容ＤＢの一例を示す図
【発明を実施するための形態】
【００１６】
以下、図面を参照して本発明を実施するための形態について説明する。以下の実施の形態の構成は例示であり、本発明は実施の形態の構成に限定されない。
【００１７】
＜装置構成の説明＞
本実施形態の解析装置は、コンピュータプログラムを静的解析し、その静的解析で検出したバグの可能性の真偽を、動的テストを実施することで証明する。図１は本発明のシステム構成図である。
【００１８】
解析装置１は、図１に示すように、データの演算処理を行うデータ処理部１１と、他の
装置との通信を行う通信処理部１２、演算処理の為のデータやソフトウェアを記憶する記憶部（ハードディスク）１３、入力部１４、出力部１５を備えたコンピュータである。
【００１９】
通信処理部１２は、ネットワークやケーブル等の回線を介して他のコンピュータとの通信を行う。
【００２０】
記憶部１３は、オペレーティングシステム（ＯＳ）やアプリケーションプログラム（解析プログラム）を記憶している。また、記憶部１３は、解析対象のプログラムや、解析処理に用いるデータベースも記憶している。
【００２１】
入力部１４は、データ処理部１１へ情報を入力する手段であり、キーボードやポインティングデバイスといったユーザインタフェースや、メモリカードやＣＤ−ＲＯＭ等の記憶媒体から情報を読み取るデバイスを有する。
【００２２】
出力部１５は、データ処理部１１の処理結果を出力する手段であり、処理結果等を表示する表示装置や、データを印刷するプリンターを有する。
【００２３】
データ処理部１１は、ＣＰＵやメインメモリを有し、前記ＯＳやアプリケーションプログラムを記憶部１３からメインメモリに読み出し、読み出したＯＳやアプリケーションプログラムに従ってＣＰＵが演算処理を行う。この演算処理により、ＣＰＵは、取得部２１や、静的解析部２２、挿入部２３、動的解析部２４、出力処理部２５、ビルド部２６としても機能する。
【００２４】
データ処理部１１のＣＰＵ、即ち取得部２１は、バグの解析を行う対象であるコンピュータプログラムのコードを取得する。
【００２５】
データ処理部１１のＣＰＵ、即ち静的解析部２２は、取得したコードのうち、変数を含む部分、例えば命令、ステップ、行といった所定単位のコードを解析対象とし、当該解析対象のコードが所定の静的解析条件を満たすか否かによってバグの可能性を判定する。静的解析条件は、記憶部１３内の静的条件データベース（ＤＢ）に記憶されており、解析対象のコードに応じた条件が適宜呼び出される。
【００２６】
静的解析条件は、例えば、解析対象のコードに含まれる関数に必須のパラメータが記述されているか、パラメータに設定されている変数の型が正しいかといった命令の構文が正しいか否かであっても良い。
【００２７】
また、静的解析条件は、独立行政法人 情報処理推進機構 ソフトウェア・エンジニアリング・センターによって策定された 「組み込みソフトウェア開発者向け コーディング作法ガイド」に適合しているかどうかであっても良い。更に、静的解析条件は、MISRA（Motor Industry Software Reliability Associationk）のガイドラインに適合しているかど
うかであっても良い。
【００２８】
特に本実施形態では、代入先の変数のサイズが代入元の変数のサイズよりも大きい、０となる可能性がある変数で除算しているか等、変数を用いた処理を行った際に、変数の値によって誤りや矛盾が生じるか否かが、静的解析条件として含まれる。この条件を満たさなければ、変数の値によって誤りや矛盾が発生する可能性があり、解析装置１は動的解析が必要と判定できる。
【００２９】
データ処理部１１のＣＰＵ、即ち挿入部２３は、バグの可能性があると判定された解析対象のコードに含まれる変数の値を取得する取得コードを前記プログラムに挿入する。
【００３０】
データ処理部１１のＣＰＵ、即ち動的解析部２４は、プログラムを実行し、取得コードによって取得した値を解析対象のコードの変数に代入した場合に当該コードが所定の動的解析条件を満たすか否かによってバグを判定する。
【００３１】
データ処理部１１のＣＰＵ、即ち出力処理部２５は、静的解析部２２や動的解析部２４の判定結果を取得し、この判定結果に基づいてメッセージや証明書を表示部やプリンター等の出力部１５から出力させる。
【００３２】
データ処理部１１のＣＰＵ、即ちビルド部２６は、コンピュータプログラムのコードのコンパイルやライブラリのリンクといった処理、所謂ビルドを行い、実行可能ファイルを作成する。
【００３３】
なお、本例の解析装置１の構成要素のうち、情報を処理する要素は、汎用のプロセッサがソフトウェアとしての解析プログラムを実行することによって、上記各機能を実現するものである。これら情報を処理する要素の一部或いは全部は、基本的な回路を組み合わせて各々の機能を実現したハードウェアであっても良い。
【００３４】
本例の解析装置１において、取得部２１や、静的解析部２２、挿入部２３、動的解析部２４、出力処理部２５、ビルド部２６が、前記情報を処理する要素である。
【００３５】
これら情報を処理する要素であるハードウェアは、例えば、ＦＰＧＡ［Field Programmable Gate Array］、ＡＳＩＣ［Application Specific Integrated Circuit］、ＬＳＩ［Large Scale Integration］といった基本的な回路を備えても良い。また、当該ハードウ
ェアは、ＩＣ［Integrated Circuit］、ゲートアレイ、論理回路、信号処理回路、アナログ回路といった基本的な回路を備えても良い。
【００３６】
論理回路としては、例えば、ＡＮＤ、ＯＲ、ＮＯＴ、ＮＡＮＤ、ＮＯＲ、フリップフロップ、カウンタ回路がある。信号処理回路には、信号値に対し、例えば、加算、乗算、除算、反転、積和演算、微分、積分を実行する回路が、含まれていてもよい。アナログ回路には、例えば、信号値に対して、増幅、加算、乗算、微分、積分を実行する回路が、含まれていてもよい。
【００３７】
＜解析方法の説明＞
図２は、本実施形態の解析装置１が解析プログラムに従って実行する解析方法の説明図である。
【００３８】
オペレータが解析対象のプログラムを指定し、解析プログラムの実行を指示すると、解析装置１の取得部２１は、解析対象であるプログラムのソースコードを取得する（Ｓ１）。例えば、解析対象であるプログラムが記憶部１３に記憶されている場合、取得部２１は記憶部１３から当該プログラムのコードを順次読み出し、メインメモリに展開する。また、解析対象であるプログラムがＣＤやＤＶＤ等の記憶媒体に記憶されている場合、取得部２１は入力部１４に挿入された記憶媒体から当該プログラムのコードを読み出しても良い。更に取得部２１は、通信処理部１２を介して他のコンピュータから解析対象であるプログラムのコードを取得（受信）しても良い。
【００３９】
静的解析部２２は、取得したコードのうち、変数を含む命令を解析対象とし、当該解析対象の命令が所定の静的解析条件を満たすか否かによってバグの可能性があるか否かを判定する（Ｓ２）。
【００４０】
バグの可能性があると判定された場合（Ｓ２，Ｙｅｓ）、挿入部２３は、解析対象のコードに含まれる変数の値を取得する取得コードを記憶部１３内の挿入内容データベース（ＤＢ）から読み出してプログラムのソースコードに挿入する（Ｓ３）。
【００４１】
ビルド部２６は、Ｓ３で取得コードを挿入したソースコードをビルドし、実行可能なファイル(実行モジュール)を作成する（Ｓ４)。
【００４２】
そして、動的解析部２５は、Ｓ４で作成した実行モジュールを実行し、取得コードによって取得した値が所定の動的解析条件を満たすか否かによってバグを判定する（Ｓ５）。
【００４３】
動的解析後、出力処理部２５は、Ｓ２における静的解析結果およびＳ５における動的解析結果を出力部１５から出力させる（Ｓ６）。
【００４４】
なお、静的解析ステップＳ２、取得コードの挿入ステップＳ３、動的解析ステップＳ５、解析結果の出力ステップＳ６は、以下で詳述される。
【００４５】
図３は、解析対象のプログラムの一例を示す図、図４は、静的解析ステップの説明図である。
【００４６】
静的解析部２２は、Ｓ１で取得したソースコードの各命令について、命令に応じた静的解析条件を記憶部１３或いはメモリから読み出し（Ｓ１１）、当該命令が静的解析条件を満たしているか否かを判定する（Ｓ１２）。
【００４７】
例えば、図３のプログラムでは、７行目がstrcpy(a,b)であり、必要な引数が記述され
ているか、複写元のサイズが複写先のサイズを超えていないか、といった静的解析条件に適合しているかを判定する。なお、静的解析条件は、命令毎に書式や処理の内容に応じた条件が設定され、記憶部１３或いはメモリに記憶されている。
【００４８】
strcpy(a,b)は、複写元の変数ｂの値を複写先の変数ａに複写する命令であるので、静
的解析部２２は、変数ｂのサイズが変数ａのサイズを超えていないかを判定する。図３では、１行目で変数ａの値が５、２行目で変数ｂの値が１０と設定されているので、静的解析部２２は、７行目のstrcpy(a,b)について、バグの可能性があると判定する。
【００４９】
バグの可能性があると判定した場合（Ｓ１２，Ｎｏ）、静的解析部２２は、当該バグに応じた指摘メッセージを記憶部１３から抽出し、静的解析の解析結果としてメモリに登録する（Ｓ１３）。図５は、７行目のstrcpy(a,b)に応じて抽出される指摘メッセージの例
を示している。図５において、メッセージは発生する可能性があるバグの内容であり、指摘ＩＤはメッセージを識別する情報である。
【００５０】
なお、静的解析部２２は、指摘ＩＤと静的解析条件とを対応づけて記憶しており、Ｓ１２で満たしていないと判定した静的解析条件に対応する指摘ＩＤで指摘メッセージを識別して記憶部１３から抽出する。ここで静的解析条件は、発生する可能性があるバグとも対応しているので、Ｓ１２で満たしていないと判定した静的解析条件に対応する指摘メッセージを抽出することで、発生する可能性があるバグに応じた静的解析条件が抽出できる。
【００５１】
図５は、図２における取得コードの挿入ステップＳ３の説明図である。
図２のＳ２で、バグの可能性があると判定された場合、挿入部２３は静的解析の結果、即ちＳ２で抽出した指摘メッセージと対応する取得コードについて記憶部１３の挿入内容ＤＢを検索する（Ｓ２１）。具体的には、挿入内容ＤＢの各取得コードに、対応する指摘メッセージの指摘ＩＤが付加されており、挿入部２３は、Ｓ２で抽出した指摘メッセージ
の指摘ＩＤと一致する指摘ＩＤが付加された取得コードを検索する。
【００５２】
検索の結果、ヒットした取得コードがあれば（Ｓ２２，Ｙｅｓ）、当該取得コードを挿入内容ＤＢから取得し、ソースコードに挿入する。図１５は、挿入内容ＤＢから抽出した取得コードを含む情報の一例を示す図である。図１５に示すように、挿入内容ＤＢから抽出した情報５０は、指摘ＩＤ５１や、取得コード(trace)の挿入位置５２、挿入内容５３
、バグとなる条件（動的解析条件）５４を含んでいる。挿入部２３は、抽出した情報５０の挿入位置５２及び挿入内容５３に基づき、バグの可能性が指摘された行(解析対象のコ
ード)の直前に取得コードを挿入する。また、取得コードの挿入位置は、解析対象のコー
ドの直前に限らず、直後であっても良い。取得コードの挿入位置は、取得コードと解析対象のコードとの間に当該解析対象のコードに含まれる変数の値を設定する命令が入らない位置であれば良い。
【００５３】
図５は、図３のプログラムに取得コードを挿入した状態を示す図である。
【００５４】
図５に示すように、挿入部２３は、strcpy(a,b)の直前の行に、取得コードとしてtrace()文を挿入し、変数ａのサイズと、変数ｂの値の長さをログに出力させる。
【００５５】
このように本実施形態では、静的解析の結果に基づいて動的解析に用いる取得コードを自動的に挿入しているので、容易に動的解析を行うことができる。
【００５６】
図６は、図２における動的解析のステップＳ５の説明図である。
【００５７】
動的解析部２５は、ビルド部２６によってビルドされた実行モジュールを実行し（Ｓ３１）、Ｓ３で挿入した取得コードによって、変数の値を出力した実行ログを生成する（Ｓ３２）。
【００５８】
実効モジュールを実行すると、データ処理部１１は、変数ａ，ｂのサイズを設定し（ソースコードの１，２行目に相当）、input.txtを読み取り専用で開き（ソースコードの３
行目に相当）、input.txtの文字を変数ｂに格納する。更に、データ処理部１１は、変数
ａのサイズと変数ｂの値の長さを実行ログに出力し（ソースコードの７行目に相当）、変数ｂの値を変数ａに複写する（ソースコードの８行目に相当）。そして、データ処理部１１は、input.txtの終端に達するまでソースコードの５〜１０行目に相当する処理を繰り
返す。
【００５９】
図７は、上記実行モジュールの実行によって作成された実行ログの例を示す図である。図７の例１は、input.txtの文字が、１，３，２のケースであり、例２は、input.txtの文字が、１，３，１０のケースである。
【００６０】
そして、動的解析部２５は、取得コードによって取得した変数の値が動的解析条件を満たしているか否かによってバグか否かを判定する（Ｓ３３）。そして、取得した変数の値が動的解析条件を満たしていない場合（Ｓ３３，Ｎｏ）、例えば変数ｂの値の長さが変数ａのサイズを超えていれば、バグである旨の解析結果をメモリに登録する（Ｓ３４）。一方、取得した変数の値が動的解析条件を満たしている場合（Ｓ３３，Ｙｅｓ）、例えば変数ｂの値の長さが変数ａのサイズを超えていなければ、バグでない旨の解析結果をメモリに登録する（Ｓ３５）。
【００６１】
図８は、図２の解析結果の出力ステップＳ６の説明図である。
【００６２】
動的解析Ｓ５の後、出力処理部２５は、静的解析Ｓ２の解析結果と動的解析Ｓ５の解析
結果をメモリから取得し（Ｓ４１）、Ｓ５の解析結果に基づきバグがあるか否かを判定する（Ｓ４２）。バグがある場合（Ｓ４２，Ｙｅｓ）、バグがある旨の結果証明書を生成して出力部１５の表示装置に表示させる（Ｓ４３）。
【００６３】
図９は、バグがある旨の結果証明書の例を示す図である。
【００６４】
図９において、結果証明書の表示欄３０は、静的解析の結果として行番号３１、指摘ＩＤ３２及びメッセージ３３を表示し、動的解析の結果としてバグの有無（バグ判定）３４を表示している。
【００６５】
図９では、ソースコードの７行目に指摘ＩＤ"pgr0532"のバグの可能性があり、テスト
ケースの動的解析でバグがあったことを示している。なお、図９において、表示欄３０は、ソースコードの７行目について示しているが、複数行の結果を一覧表示しても良い。
【００６６】
また、オペレータがバグ判定３４のＢｕｇをクリックすると、出力処理部２５は、リンクした表示欄４０を表示させる。
【００６７】
結果証明書の表示欄４０は、指摘ＩＤ４２の他、動的解析のテストケース番号４１、trace結果内容４３、バグの個別判定４４をテストケース毎に表示している。
【００６８】
図９では、テストケース１で複写元の値の長さを１、テストケース２で複写元の値の長さを３、テストケース３で複写元の値の長さを１０としている。テストケース１，２では、複写元の値の長さが複写先を超えず、個別判定４４がＯＫであるが、テストケース３では、複写元の値の長さが複写先を超えて、個別判定４４がＮＧとなったことが分かる。
【００６９】
一方、Ｓ４２しでバグがないと判定した場合（Ｓ４２，Ｎｏ）、出力処理部２５は、バグがない旨の結果証明書を生成して出力部１５の表示装置に表示させる（Ｓ４４）。
【００７０】
図１０は、バグがない旨の結果証明書の例を示す図である。
【００７１】
図１０では、ソースコードの７行目に指摘ＩＤ"pgr0532"のバグの可能性があり、テス
トケースの動的解析でバグがなかったことを示している。なお、図１０において、オペレータがバグ判定３４のＮｏｔ Ｂｕｇをクリックすると、出力処理部２５は、リンクした
表示欄４０を表示させる。
【００７２】
結果証明書の表示欄４０は、指摘ＩＤ４２の他、動的解析のテストケース番号４１、trace結果内容４３、バグの個別判定４４をテストケース毎に表示している。
【００７３】
図１０では、テストケース１で複写元の値の長さを１、テストケース２で複写元の値の長さを３、テストケース３で複写元の値の長さを２としている。テストケース１−３では、何れも複写元の値の長さが複写先を超えず、個別判定４４がＯＫであることが分かる。
【００７４】
以上のように、本実施形態の解析装置１は、静的解析によってバグの可能性がある部分のコード（命令）を特定し、当該コードに含まれる変数の値を取得するtraceコード（取
得コード）を自動挿入してプログラムを実行する。そして、解析装置１は、取得した値が動的解析条件を満たすか否かによってバグの有無を判定する。これにより、本実施形態の解析装置１は、オペレータが予めtraceコードを設定しなくても動的解析を行うことがで
きる。
また、本実施形態の解析装置１は、静的解析し、解析対象のコードに含まれる変数の値によって誤りが生じるか否かによって、バグの可能性があるコードを特定して変数の値を
取得する。このため本実施形態の解析装置１は、全ての変数の値を取得するよりも動的解析時間を短縮でき、また、バグの可能性のない値を含まない（ノイズの少ない）、適切な解析結果を得ることができる。
【実施例１】
【００７５】
1.    long data = 65535;
2.    data = ????;
3.    short x = data ;
本実施例１のプログラムについて、静的解析部２２は、静的解析を行った場合、３行目のshort x = dataにおいて、左辺のshort int型の変数 "x" より右辺のlong int型の初期値 "data" のサイズが大きいため、バグの可能性があると判定する。
【００７６】
３行目のshort x = dataのように、変数に値を代入する命令であって、左辺のサイズよりも右辺のサイズが大きい場合、静的解析部２２は、記憶部１３のメッセージＤＢから対応する指摘メッセージpgr0383のフォームを抽出する。そして静的解析部２２は、フォー
ム「pgr0383 @1 型の初期値 @2 は、 @3 型の @4 よりサイズが大きいため、正しい初期
値とならない可能性があります。」の置換用文字＠１〜＠４を取得したコードの値で置き換える。即ち、静的解析部２２は、「long int型の初期値 "data" は、short int型の "x" よりサイズが大きいため、正しい初期値とならない可能性があります。」のように指摘メッセージを生成する。
【００７７】
本実施例１の場合、２行目で代入されるdataの実際の値がshortの範囲ならば問題ない
が、dataの実際の値がshortの範囲を超えるとバグとなる。
【００７８】
このため、静的解析部２２によってバグの可能性を検出した場合、挿入部２３は、抽出した指摘メッセージと対応する取得コードを記憶部１３の挿入内容ＤＢから索出する。
【００７９】
図１１は、指摘ＩＤ(pgr0383)と対応する取得コード及び動的解析条件を示す図である
。
【００８０】
そして、挿入部２３は、索出した取得コードを次のようにソースコードに挿入する。
【００８１】
［挿入後のソースコード例］
1.    long data = 65535;
2.    data = ????;
3.    trace("pgr0383, data = %d\n" data);
4.    short x = data ;
動的解析部２４は、取得コードを挿入したプログラムを実行してdataの値を取得し、動的解析条件に基づき、dataの値がshort xのサイズを超えていればバグと判定し、dataの
値がshort xのサイズを超えていなければバグでないと判定する。
【実施例２】
【００８２】
20. fp = fopen( filename, "r" ) ;
21. size = fread( buf, sizeof(buf), 1, fp ) ;   //pgr0520を指摘
本実施例２のプログラムについて、静的解析部２２は、静的解析条件を満たしているか否かを判定した場合、２１行目のsize = fread( buf, sizeof(buf), 1, fp )において、
変数ｆｐが０番地を参照することがあるため、バグの可能性があると判定する。
【００８３】
２１行目のsize = fread( buf, sizeof(buf), 1, fp )のように、０番地を参照する可
能性がある場合、静的解析部２２は、記憶部１３のメッセージＤＢから対応する指摘メッ
セージpgr0520のフォームを抽出する。そして静的解析部２２は、フォーム「pgr0520 @1
行目で0番地を代入する可能性のある変数 @2 は0番地を参照している可能性があります。」の置換用文字＠１〜＠２を取得したコードの値で置き換える。即ち、静的解析部２２は、「20行目で0番地を代入する可能性のある変数"fp"は0番地を参照している可能性があります。」のように指摘メッセージを生成する。
【００８４】
本実施例２の場合、２０行目でfopenが正常に実行されれば問題ないが、失敗した場合
、fpがNULLの状態で、２１行目が実行されバグとなる。
【００８５】
このため、静的解析部２２によってバグの可能性を検出した場合、挿入部２３は、抽出した指摘メッセージと対応する取得コードを記憶部１３の挿入内容ＤＢから索出する。
【００８６】
図１２は、指摘ＩＤ(pgr0520)と対応する取得コード及び動的解析条件を示す図である
。
【００８７】
そして、挿入部２３は、索出した取得コードを次のようにソースコードに挿入する。
【００８８】
［挿入後のソースコード例］
20. fp = fopen( filename, "r" ) ;
21. trace("pgr0520, fp = %d\n" fp);
22. size = fread( buf, sizeof(buf), 1, fp ) ;   //pgr0520を指摘
動的解析部２４は、取得コードを挿入したプログラムを実行してfpの値を取得し、動的解析条件に基づき、fpの値がNullであればバグと判定し、fpの値がNullでなければバグでないと判定する。
【実施例３】
【００８９】
1.    int x = 0;
2.    if( data != 1 )
3.    [
4.      x = 2;
5.    ]
6.    return data/x;    //pgr0074
本実施例３のプログラムについて解析を開始し、静的解析部２２が、静的解析条件を満たしているか否かを判定した場合、６行目のreturn data/xにおいて、０の可能性がある
変数ｘで除算しているため、バグの可能性があると判定する。
【００９０】
６行目のreturn data/xのように、０の可能性がある変数ｘで除算している場合、静的
解析部２２は、記憶部１３のメッセージＤＢから対応する指摘メッセージpgr0074のフォ
ームを抽出する。そして静的解析部２２は、フォーム「pgr0074 ゼロの可能性のある変数
@1 で除算しています。」の置換用文字＠１を取得したコードの値で置き換える。即ち、静的解析部２２は、「ゼロの可能性のある変数"x"で除算しています」のように指摘メッ
セージを生成する。
【００９１】
本実施例３の場合、２行目のif文が真ならば、４行目でxに値が代入されるため問題な
いが、if文が偽であると、xが0のまま、6行目で除算が実行され、バグとなる。
【００９２】
このため、静的解析部２２によってバグの可能性を検出した場合、挿入部２３は、抽出した指摘メッセージと対応する取得コードを記憶部１３の挿入内容ＤＢから索出する。
【００９３】
図１２は、指摘ＩＤ(pgr0074)と対応する取得コード及び動的解析条件を示す図である
。
【００９４】
そして、挿入部２３は、索出した取得コードを次のようにソースコードに挿入する。
1.    int x = 0;
2.    if( data != 1 )
3.    [
4.      x = 2;
5.    ]
6.    trace("pgr0074, x = %d\n" x);
7.    return data/x;    //pgr0074
動的解析部２４は、取得コードを挿入したプログラムを実行してｘの値を取得し、動的解析条件に基づき、ｘの値が０であればバグと判定し、ｘの値が０でなければバグでないと判定する。
【実施例４】
【００９５】
1.    int data[10];
2.
3.    for(int i=0; i<=10; i++)
4.    [
5.        ※iが動的に変化するコード
6.
7.        data[i] = 0;  //pgr0013を指摘
8.    ]
本実施例４のプログラムについて解析を開始し、静的解析部２２が、静的解析条件を満たしているか否かを判定した場合、７行目のdata[i] = 0において、ｉに１０が入り、１
行目で宣言した範囲を超える可能性があるため、バグの可能性があると判定する。
【００９６】
７行目のdata[i]のように、宣言した範囲を超える可能性がある場合、静的解析部２２
は、記憶部１３のメッセージＤＢから対応する指摘メッセージpgr0013のフォームを抽出
する。そして静的解析部２２は、フォーム「pgr0013 @1 行目の for文で @2 には @3 が
はいるので、 @4 で配列の範囲を超えます。(配列宣言: @5 の @6 行目)」の置換用文字
＠１を取得したコードの値で置き換える。即ち、静的解析部２２は、「3 行目の for文で
"i" には "10" がはいるので、 "data[i]" で範囲を超えます。(配列宣言: "file.c" の
1 行目)」のように指摘メッセージを生成する。
【００９７】
本実施例４の場合、５行目でｉが１０未満に変化していれば問題ないが、５行目でｉが１０であると、data[10]=0となり宣言した範囲を超えるので、バグとなる。
【００９８】
このため、静的解析部２２によってバグの可能性を検出した場合、挿入部２３は、抽出した指摘メッセージと対応する取得コードを記憶部１３の挿入内容ＤＢから索出する。
【００９９】
図１３は、指摘ＩＤ(pgr0013)と対応する取得コード及び動的解析条件を示す図である
。
【０１００】
そして、挿入部２３は、索出した取得コードを次のようにソースコードに挿入する。
1.    int data[10];
2.
3.    for(int i=0; i<=10; i++)
4.    [
5.        ※iが動的に変化するコード
6.
7.       trace("pgr0013, 値=%d\n" i);
8.       data[i] = 0;   //pgr0013を指摘
9.    ]
【０１０１】
動的解析部２４は、取得コードを挿入したプログラムを実行してｉの値を取得し、動的解析条件に基づき、ｉの値が１０であればバグと判定し、ｉの値が１０未満であればバグでないと判定する。
【０１０２】
なお、本実施例４おいて、静的解析部２２は、１行目の変数data[10]を設定するコードと、３行目の変数ｉを設定するコードに基づいて、data[i] = 0で変数data[i]の範囲を超える可能性があると判断している。即ち、静的解析部２２は、５行目で動的に変数ｉの値が変わるので、実際にバグであるか否かを決定するのではなく、可能性があると指摘する。但し、変数iが動的に変化するコードとdata[i] = 0の間に、静的に変数ｉの値を決めるコードがあれば、静的解析部２２は、このコードを考慮しても良い。例えば、６行目に変数ｉが１０であれば他の処理へジャンプする命令を含むコードがあれば、data[i] = 0の
範囲を超えることがなくなり、バグの可能性がないと判定しても良い。
【０１０３】
〈その他〉
本発明は、上述の図示例にのみ限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々変更を加え得ることは勿論である。
【０１０４】
また、前述のプログラムは、コンピュータが読み取り可能な記録媒体に記録されたものでも良い。
【０１０５】
ここで、コンピュータが読み取り可能な記録媒体とは、データやプログラム等の情報を電気的、磁気的、光学的、機械的、または化学的作用によって蓄積し、コンピュータから読み取ることができる記録媒体をいう。このような記録媒体の内コンピュータから取り外し可能なものとしては、例えばフレキシブルディスク、光磁気ディスク、CD-ROM、CD-R/W、DVD、DAT、８mmテープ、メモリカード等がある。
【０１０６】
また、コンピュータに固定された記録媒体としてハードディスクやＲＯＭ（リードオンリーメモリ）等がある。
【符号の説明】
【０１０７】
１  解析装置
１４  入力部
１５  出力部
２１  取得部
２２  静的解析部
２３  挿入部
２４  動的解析部
２５  出力制御部
２６  ビルド部
【図１】
2011133966.tif 000003
【図２】
2011133966.tif 000004
【図３】
2011133966.tif 000005
【図４】
2011133966.tif 000006
【図５】
2011133966.tif 000007
【図６】
2011133966.tif 000008
【図７】
2011133966.tif 000009
【図８】
2011133966.tif 000010
【図９】
2011133966.tif 000011
【図１０】
2011133966.tif 000012
【図１１】
2011133966.tif 000013
【図１２】
2011133966.tif 000014
【図１３】
2011133966.tif 000015
【図１４】
2011133966.tif 000016
【図１５】
2011133966.tif 000017