(57)【要約】【課題】前提条件の変更を検知して、前提条件の変更が影響するソースコード範囲のみを検証することができるようにする。【解決手段】参照情報生成部１は、入力されるソースコード５における参照関係を示す参照情報７を生成する。変更検知部２は、ソースコード５についての前提条件６が変更されたかどうかを検知するとともに、どの条件が変更されたかを検出する。影響分析部３は、変更検知部２によって検出される前提条件６の変更箇所と、参照情報生成部１によって生成される参照情報７とから、その前提条件６の変更によって影響を受ける関数群を検出し検証対象に特定する。影響分析部３は、前提条件の変更を直接受ける関数およびその関数を直接呼び出す関数を基点関数として検出し、各基点関数について、その基点関数以下の関数呼び出し階層に位置する関数群を、その前提条件の変更によって影響を受ける関数群として検出する。【選択図】図１
2008191963.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードを実際に動作させずに解析する静的解析ツールを用いてソースコードを検証するソースコード検証システムであって、
前記ソースコードが仕様を満たすための前提条件として、少なくとも関数に対する条件、変数に対する条件のいずれかが入力され、
前記ソースコードにおける関数間の呼び出し関係または関数における変数への参照関係を示す情報である参照情報を生成する参照情報生成手段と、
前記前提条件が変更されたことを検知する前提条件変更検知手段と、
前記条件変更検知手段によって前提条件が変更されたことが検知された場合に、前記参照情報に基づいて、少なくとも変更された条件を直接うける関数および前記関数を直接呼び出している関数を、前記前提条件の変更によって検証が必要な関数群における基点関数として検出する検証対象検出手段とを備えた
ことを特徴とするソースコード検証システム。
【請求項２】
前提条件を示す情報を記憶する前提条件記憶手段を備え、
前提条件変更検知手段は、過去に入力された前提条件のうち少なくとも１バージョンを前記前提条件記憶手段に記憶させるとともに、所定のタイミングで、前提条件記憶手段に記憶されている前提条件と、現在の前提条件とを比較することによって、前提条件の変更を検知する
請求項１に記載のソースコード検証システム。
【請求項３】
参照情報として、少なくとも他の関数または変数を参照している関数を示す情報と、前記関数の参照先である関数または変数を示す情報とを対応づけて記憶する参照情報記憶手段を備え、
前提条件記憶手段は、前提条件を示す情報として、少なくとも前提条件として与えられた条件と、当該条件の対象要素である関数または変数を示す情報とを対応づけて記憶し、
検証対象検出手段は、条件変更検知手段によって前提条件が変更されたことが検知された場合に、変更された条件の対象要素である関数、または変更された条件の対象要素である変数を参照している関数と、前記関数を参照している関数とを基点関数として検出する
請求項１または請求項２に記載のソースコード検証システム
【請求項４】
参照情報生成手段は、参照情報を生成するとともに、各関数および各外部変数がどのソースファイルに記述されているかを示す格納ファイル情報を生成し、
検証対象検出手段は、前記参照情報生成手段によって生成される参照情報および格納ファイル情報に基づいて、各基点関数以下の関数呼び出し階層に位置する各関数を記述しているソースファイルを、各基点関数の検証に必要なソースコードの範囲として検出する
請求項１から請求項３のうちのいずれか１項に記載のソースコード検証システム
【請求項５】
ソースコードを実際に動作させずに解析する静的解析ツールを用いてソースコードを検証するソースコード検証方法であって、
前記ソースコードが仕様を満たすための前提条件として、少なくとも関数に対する条件、変数に対する条件のいずれかを入力し、
前記ソースコードにおける関数間の呼び出し関係または関数における変数への参照関係を示す情報である参照情報を生成し、
前記前提条件が変更されたことを検知し、
前提条件が変更されたことが検知された場合に、前記参照情報に基づいて、少なくとも変更された条件を直接うける関数および前記関数を直接呼び出している関数を、前記前提条件の変更によって検証が必要な関数群における基点関数として検出する
ことを特徴とするソースコード検証方法。
【請求項６】
ソースコードを実際に動作させずに解析する静的解析ツールを用いてソースコードを検証するためのソースコード検証用プログラムであって、
前記ソースコードが仕様を満たすための前提条件として、少なくとも関数に対する条件、変数に対する条件のいずれかが入力されるコンピュータに、
前記ソースコードにおける関数間の呼び出し関係または関数における変数への参照関係を示す情報である参照情報を生成する処理、
前記前提条件が変更されたことを検知する処理、および
前提条件が変更されたことが検知された場合に、前記参照情報に基づいて、少なくとも変更された条件を直接うける関数および前記関数を直接呼び出している関数を、前記前提条件の変更によって検証が必要な関数群における基点関数として検出する処理
を実行させるためのソースコード検証用プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコードを実際に動作させずに解析する静的解析ツールを用いてソースコードを検証するソースコード検証システム、ソースコード検証方法、およびソースコード検証用プログラムに関し、特に、ソースコードに対し与えられた前提条件に基づいてソースコードに対し検証を行うソースコード検証システム、ソースコード検証方法、およびソースコード検証用プログラムに関する。
【背景技術】
【０００２】
従来のソースコード検証システムの一例が特許文献１に記載されている。特許文献１には、変更前後のソースコードの静的解析結果から、変更部分のみに対する警告文の出力を行い、不要な警告文を抑制する方法が記載されている。また、特許文献２には、データ名称、属性が変更されたプログラムのテスト必要箇所を検出する方法が記載されている。
【０００３】
上記で示した方法は、いずれもソースコードの変更箇所を検出してプログラム変更作業におけるテストを効率化するための方法である。しかしながら、ソースコードの検証は、ソースコード自体の誤りを検出するだけでなく、そのソースコードが仕様を満たしているかについても検証できることが好ましい。
【０００４】
一般に公開されている静的解析ツールの中には、仕様を満たすための条件を前提条件として入力することにより、その前提条件に基づいてソースコードの検証を行う静的解析ツールがある。例えば、”ＥＳＣ／Ｊａｖａ２”という静的解析ツールでは、Ｊａｖａ（登録商標）のコード自体の誤りだけでなく、ＪＭＬ（Java Modeling Language，仕様記述言語）による記述との整合性を検査し、前提条件違反となりうるコードを検出する。
【０００５】
図１１は、静的解析ツールにおける前提条件、およびその静的解析ツールの検証結果の例を示す説明図である。図１１に示す例は、オブジェクト指向言語Ｊａｖａによるソースコードに対し解析を行う静的解析ツールにおける前提条件、および検証結果の例である。図１１では、ソースコード１１１を検証対象として、前提条件１１２に関して検証を行った際の検証結果１１３を示すとともに、前提条件１１２を前提条件１１４に変更した後の検証結果１１５を示している。ソースコード１１１は、残高を示すメンバ変数ｂａｌａｎｃｅおよび出金処理メソッドｗｉｔｈｄｒａｗおよび入金処理メソッドｄｅｐｏｓｉｔを有するクラスＡｃｃｏｕｎｔについて記述したソースコードである。出金処理メソッドｗｉｔｈｄｒａｗでは、クラスのメンバ変数ｂａｌａｎｃｅの値から引数ａｍｏｕｎｔの値を減算し、その結果をメンバ変数ｂａｌａｎｃｅに設定する。
【０００６】
前提条件１１２には、例えば、出金処理メソッドｗｉｔｈｄｒａｗの事前条件として引数ａｍｏｕｎｔの値が０以上であることが２行目に、事後条件としてメンバ変数ｂａｌａｎｃｅの値が０以上であることが３行目に設定されている。ここで、関数の事前条件とは、その関数を呼び出す前に満たしていなければならない条件をいう。また、事後条件とは、その関数が処理を終えた後に満たしていなければならない条件をいう。
【０００７】
静的解析ツールは、ソースコード１１１と前提条件１１２とが与えられると、検証結果１１３を出力する。検証結果１１３には、クラスＡｃｃｏｕｎｔの８行目（出金処理メソッドｗｉｔｈｄｒａｗのリターン文）で、メンバ変数ｂａｌａｎｃｅの値が０以上である旨の事後条件が成り立たないことが起こりうるという警告が示されている。これは、引数ａｍｏｕｎｔの値がメンバ変数ｂａｌａｎｃｅの値よりも大きかった場合には、出金処理メソッドｗｉｔｈｄｒａｗで減算を行うと、メンバ変数ｂａｌａｎｃｅが負の値になるからである。
【０００８】
ここで、図１１に示すように、出金処理メソッドｗｉｔｈｄｒａｗの事前条件として、引数ａｍｏｕｎｔの値がメンバ変数ｂａｌａｎｃｅの値以下であるという条件を追加する。そして、静的解析ツールは、変更後の前提条件１１４が与えられると、何の警告もない検証結果１１５を出力する。なお、前提条件を検証に利用する静的解析ツールと同様に、テストプログラムを用いて前提条件に関してソースコードをチェックすることも従来より行われている。
【０００９】
また、特許文献３には、仕様書データを用いてアプリケーションプログラムを自動生成するユーザインタフェースアプリケーション開発装置において、仕様書データが変更された場合の影響範囲を検出する方法が記載されている。
【００１０】
【特許文献１】特開２００４−１２６８６６号公報
【特許文献２】特開平０６−２９００３９号公報
【特許文献３】国際公開第２００４／１０４８２４号パンフレット（頁１４）
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかしながら、これらの従来技術には、次の問題があった。第１の問題点は、前提条件に変更がおきたことを検知しないことである。従来のソースコード検証システムの多くは、ソースファイルの更新有無によって変更を検知する等、どのコードまたはどの前提条件が変更されたかを検知する処理を保持していないからである。なお、特許文献３に記載されている方法は、実際にテストプログラムを実行した結果をもって仕様書データの変更部位を特定する方法であって、静的に差分を検出することはできない。
【００１２】
第２の問題点は、前提条件の変更が影響するソースコード範囲のみを検証し直せないことである。その理由は、前提条件の変更が影響する範囲を検出できる情報を管理していないからである。
【００１３】
なお、特許文献１や特許文献２のようなソースコードの変更に際してテストを効率化するための方法であるが、それらの方法を前提条件の変更に際して適用したとしても、その変更が影響するソースコード範囲を的確に検出できない。例えば、特許文献１に記載されている方法は、変更前と変更後とで、それぞれ全てのソースコード範囲を検証した上で、ソースコードが変更された箇所についての警告を表示しないようにしているのであって、影響範囲を検出して検証範囲を限定しているわけではない。従って、１回の検証時間は短縮されない。また、特許文献２に記載されている方法では、検出する影響範囲に漏れがでる可能性がある。例えば、外部変数が変更された場合に、その外部変数を直接に使用している関数しか検出しないため、その外部変数を引数として呼び出している関数やその外部変数が戻り値として返される関数が検出されない。
【００１４】
そこで、本発明は、前提条件の変更を検知して、前提条件の変更が影響するソースコード範囲のみを検証することができるソースコード検証システム、ソースコード検証方法、およびソースコード検証用プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１５】
本発明によるソースコード検証システムは、ソースコードを実際に動作させずに解析する静的解析ツール（例えば、検証処理部４）を用いてソースコードを検証するソースコード検証システムであって、ソースコードが仕様を満たすための前提条件として、少なくとも関数に対する条件、変数に対する条件のいずれかが入力され、ソースコードにおける関数間の呼び出し関係または関数における変数への参照関係を示す情報である参照情報を生成する参照情報生成手段（例えば、参照情報生成部１）と、前提条件が変更されたことを検知する前提条件変更検知手段（例えば、変更検知部２）と、条件変更検知手段によって前提条件が変更されたことが検知された場合に、参照情報に基づいて、少なくとも変更された条件を直接うける関数およびその関数を直接呼び出している関数を、前提条件の変更によって検証が必要な関数群における基点関数として検出する検証対象検出手段（例えば、影響分析部３）とを備えたことを特徴とする。
【００１６】
また、ソースコード検証システムは、前提条件を示す情報を記憶する前提条件記憶手段（例えば、前提条件６を記憶するための記憶装置）を備え、前提条件変更検知手段は、過去に入力された前提条件のうち少なくとも１バージョンを前提条件記憶手段に記憶させるとともに、所定のタイミングで、前提条件記憶手段に記憶されている前提条件と、現在の前提条件とを比較することによって、前提条件の変更を検知してもよい。
【００１７】
また、ソースコード検証システムは、参照情報として、少なくとも他の関数または変数を参照している関数を示す情報と、その関数の参照先である関数または変数を示す情報とを対応づけて記憶する参照情報記憶手段（例えば、参照情報７を記憶するための記憶装置）を備え、前提条件記憶手段は、前提条件を示す情報として、少なくとも前提条件として与えられた条件と、当該条件の対象要素である関数または変数を示す情報とを対応づけて記憶し、検証対象検出手段は、条件変更検知手段によって前提条件が変更されたことが検知された場合に、変更された条件の対象要素である関数、または変更された条件の対象要素である変数を参照している関数と、その関数を参照している関数とを基点関数として検出してもよい。
【００１８】
また、参照情報生成手段は、参照情報を生成するとともに、各関数および各外部変数がどのソースファイルに記述されているかを示す格納ファイル情報を生成し、検証対象検出手段は、参照情報生成手段によって生成される参照情報および格納ファイル情報に基づいて、各基点関数以下の関数呼び出し階層に位置する各関数を記述しているソースファイルを、各基点関数の検証に必要なソースコードの範囲として検出してもよい。
【００１９】
また、本発明によるソースコード検証方法は、ソースコードを実際に動作させずに解析する静的解析ツールを用いてソースコードを検証するソースコード検証方法であって、ソースコードが仕様を満たすための前提条件として、少なくとも関数に対する条件、変数に対する条件のいずれかを入力し、ソースコードにおける関数間の呼び出し関係または関数における変数への参照関係を示す情報である参照情報を生成し、前提条件が変更されたことを検知し、前提条件が変更されたことが検知された場合に、参照情報に基づいて、少なくとも変更された条件を直接うける関数およびその関数を直接呼び出している関数を、前提条件の変更によって検証が必要な関数群における基点関数として検出することを特徴とする。
【００２０】
また、本発明によるソースコード検証用プログラムは、ソースコードを実際に動作させずに解析する静的解析ツールを用いてソースコードを検証するためのソースコード検証用プログラムであって、ソースコードが仕様を満たすための前提条件として、少なくとも関数に対する条件、変数に対する条件のいずれかが入力されるコンピュータに、ソースコードにおける関数間の呼び出し関係または関数における変数への参照関係を示す情報である参照情報を生成する処理、前提条件が変更されたことを検知する処理、および前提条件が変更されたことが検知された場合に、参照情報に基づいて、少なくとも変更された条件を直接うける関数およびその関数を直接呼び出している関数を、前提条件の変更によって検証が必要な関数群における基点関数として検出する処理を実行させることを特徴とする。
【発明の効果】
【００２１】
本発明によれば、前提条件変更検知手段によって前提条件が変更されたことが検知された場合に、検証対象検出手段が、参照情報生成手段によって生成される参照情報に基づいて、少なくとも変更された条件を直接うける関数およびその関数を直接呼び出している関数を、前提条件の変更によって検証が必要な関数群における基点関数として検出するので、その基点関数を静的解析ツールに与えることによって、前提条件の変更が影響するソースコード範囲のみを検証することができる。
【発明を実施するための最良の形態】
【００２２】
以下、本発明の実施の形態を図面を参照して説明する。図１は、本発明によるソースコード検証システムの構成例を示すブロック図である。図１に示すソースコード検証システムは、キーボードやディスプレイ装置等の入出力装置８と、参照情報生成部１と、変更検知部２と、影響分析部３と、検証処理部４とを備えている。また、ソースコード検証システムに入力されるソースコード５と前提条件６、参照情報生成部１によって生成される参照情報７と格納ファイル情報９、および影響分析部３によって生成される基点関数リスト１０やソースコード範囲１１を記憶する記憶装置を備えている。なお、記憶装置は情報毎に別々の記憶装置であってもよい。
【００２３】
参照情報生成部１は、入力されるソースコード５について参照情報７を生成する。参照情報７とは、ソースコードにおける参照関係を示す情報である。具体的には、関数間の呼び出し関係や、外部変数への参照関係を示す情報であって、例えば、参照先関数と参照元関数とを対応づけた情報や、参照先変数と参照箇所（その変数を参照している関数等）とを対応づけた情報である。なお、外部変数への参照関係には、外部変数に値を設定している関係も含むものとする。本実施の形態では、参照情報生成部１は、参照情報７として、関数間の呼び出し関係を示す情報と、外部変数への参照関係を示す情報とを、それぞれ関数区分と変数区分の２つの要素区分に分けて生成する。また、参照情報記生成部１は、生成した参照情報７をどのソースコードについての参照情報かを識別する情報（例えば、プロジェクト名）とともに記憶装置に記憶させる。また、参照情報生成部１は、参照情報７とともに、各関数および各外部変数がどのソースファイルに記述されているかを示す格納ファイル情報９を生成する。
【００２４】
変更検知部２は、入力されるソースコード５についての前提条件６が変更されたかどうかを検知するとともに、どの条件が変更（追加および削除を含む）されたかを検出する。前提条件６は、ソースコードがその仕様を満たすために必要とする条件群であって、関数に関する前提条件と外部変数に関する前提条件とを含む。関数に関する前提条件には、その関数を呼び出す前に満たしていなければならない条件を示す事前条件と、その関数が処理を終えた後に満たしていなければならない条件を示す事後条件と、その関数を呼び出す前およびその関数が処理をおけた後に満たしていなければならない条件を示す不変条件とがある。また、変数に関する前提条件には、その変数への参照が行われている関数を呼び出す前およびその関数が処理をおけた後に満たしていなければならない不変条件がある。なお、変更検知部２は、ソースコード５とともに入力される前提条件６に対する処理を行うだけでなく、前提条件６を入力するための画面を表示し、ユーザの画面操作に応じて前提情報を入力するなど前提情報の入力機能を有していてもよい。
【００２５】
影響分析部３は、変更検知部２によって検出される前提条件６の変更箇所（変更された条件）と、参照情報生成部１によって生成される参照情報７および格納ファイル情報９とから、その前提条件６の変更によって影響を受ける関数群を検出し検証対象に特定する。影響分析部３は、具体的には、影響を受ける関数群において基点（関数呼び出しの階層上の基点）となる基点関数をリスト化した基点関数リスト１０を生成する。また、各基点関数について、その基点関数以下の関数呼び出し階層に位置する関数群を含むソールファイルを、その基点関数の検証に必要なソースコードの範囲として示すソースコード範囲１１を生成する。なお、検証処理部４が基点関数の情報のみでその階層下に位置する関数群やソースファイルを特定できるような場合には、ソースコード範囲１１の生成は省略してもよい。
【００２６】
検証処理部４は、影響分析部３によって特定される検証範囲に対し、検証を行う。検証処理部４は、例えば、影響分析部３によって生成される基点関数リスト１０に基づいて、基点関数リスト１０で示される基点関数から、その関数呼び出し階層に従ってソースコードを検証する。なお、各基点関数以下の関数呼び出し階層に位置する関数群を含むソースコードの範囲は、ソースコード範囲１１によって示される。
【００２７】
本実施の形態において、参照情報生成部１、変更検知部２、影響分析部３、および検証処理部４は、具体的には、ＣＰＵ等のプログラムに従って動作する情報処理装置によって実現される。例えば、参照情報生成部１、変更検知部２、影響分析部３、および検証処理部４を機能として有するプログラムをユーザに提供して、ユーザがそのプログラムを所有するパーソナルコンピュータにインストールすることによっても、本システムを実施することができる。
【００２８】
次に、本実施の形態の動作について説明する。図２は、本実施の形態によるソースコード検証システムの動作の一例を示すフローチャートである。図２に示すように、ソースコード５が入力されると、参照情報生成部１は、ソースコード５を解析して、参照情報７と格納ファイル情報９とを生成する（ステップＳ２０１）。参照情報生成部１におけるソースコードの解析手法としては、字句解析や構文解析など既知のアルゴリズムを実行すればよい。なお、アルゴリズムの実行には”ｄｏｘｙｇｅｎ”等の一般に公開されているプログラム解析ツールやコンパイラのフロントエンド部を利用してもよい。
【００２９】
次に、変更検知部２は、ソースコード５についての前提条件６が変更されたかどうかを検知する（ステップＳ２０２）。変更検知部２は、例えば、検証を行ったタイミングやユーザが指定したタイミングで、そのときの前提条件６を記憶装置に記憶しておき、新たに前提条件６が入力された場合やユーザから差分検証が指示された場合に、現在の前提条件６と記憶しておいた前提条件６とを比較することによって、前提条件６の変更有無を検知する。なお、変更検知部２は、前提条件６の変更有無を検知する際に、併せてどの前提条件が変更（追加および削除を含む）されたかを検出する。前提条件６が変更されていた場合にはステップＳ２０３へ移行し、検知されていなかった場合には処理を終了する。
【００３０】
影響分析部３は、変更検知部２によって検出される前提条件６の変更箇所（変更された条件）と、参照情報生成部１によって生成される参照情報７および格納ファイル情報９とから、検証対象とする関数群やソースコード範囲を決定する（ステップＳ２０３）。影響分析部３は、前提条件の変更によって影響を受ける関数群を検出し、その関数群において基点（関数呼び出しの階層上の基点）となる基点関数をリスト化した基点関数リスト１０を生成する。また、各基点関数について、その基点関数以下の関数呼び出し階層に位置する関数群を含むソールファイルを、その基点関数の検証に必要なソースコードの範囲として示すソースコード範囲１１を生成する。なお、前提条件の変更によって影響を受ける関数群の検出方法については、後述する。
【００３１】
最後に、検証処理部４は、影響分析部３によって検証対象に決定された関数群やソースコード範囲のソースコードを検証して（ステップＳ２０４）、検証結果を入出力装置８に出力する。検証処理部４におけるソースコードの検証手法としては、前提条件を用いてソースコードの検証を行うテスティングや、定理証明、モデル検査等の既知のアルゴリズムを実行すればよい。なお、アルゴリズムの実行には、関数毎に前提条件についての一連のテストを行うテストプログラムや”ＥＳＣ／Ｊａｖａ２”等の一般に公開されているプログラム解析ツールを利用してもよい。
【００３２】
次に、手続き型言語であるＣ言語で記述されたソースコードの具体例を用いて、本実施の形態の動作について詳細に説明する。
【００３３】
図３に、ソースコード５の一例を示す。また、図４に、図３で示したソースコード５の参照関係を図示する。図３は、例えば、ソースファイルＥ．ｃに、外部変数ｇｖａｒＵに値を設定したり、関数ｆｕｎｃＧを呼び出したり、関数ｆｕｎｃＨを呼び出している関数ｆｕｎｃＥが記述されていることを示している。また、図４は、例えば、このソースファイルＥ．ｃ内の関数ｆｕｎｃＨにおける参照関係として、関数ｆｕｎｃＨから外部変数ｇｖａｒＵへの参照を示す破線矢印と、関数ｆｕｎｃＨから関数ｆｕｎｃＧおよびｆｕｎｃＨへの呼び出しを示す実線矢印とが示されている。
【００３４】
図２のステップＳ２０１では、参照情報生成部１は、図３で示したような各ソースファイルに含まれる関数の呼び出しの記述（コード）や外部変数への参照の記述（コード）から、その参照関係を示す情報を生成し、参照情報７として記憶装置に記憶させる。また、各ソースファイルに含まれる関数の実体の記述から、その関数と格納先ファイル名との対応関係を示す情報を生成し、格納ファイル情報９として記憶装置に記憶させる。
【００３５】
図５は、参照情報７および格納ファイル情報９の一例を示す説明図である。なお、図５では、図３で示したソースコード５から生成される参照情報７および格納ファイル情報９の例を示している。図５（ａ）は、参照情報７の例を示す説明図である。図５（ｂ）は、格納ファイル情報９の例を示す説明図である。なお、図５（ｃ）は、参照情報７の他の例を示す説明図である。
【００３６】
参照情報生成部１は、ソースファイルを解析した結果、他の関数または外部変数を参照している関数を検出した場合には、例えば図５（ａ）に示すように、その関数名（参照元関数名）と、その関数が参照している先の関数名または外部変数名と、その参照先が関数か変数かを示す参照先区分とを対応づけた参照情報７を生成し、記憶装置に記憶させればよい。例えば、参照情報生成部１は、図３に示されたソースファイルＡ．ｃを解析した結果、関数ｆｕｎｃＡが関数ｆｕｎｃＢおよびｆｕｎｃＣを呼び出していることを検出した場合には、図５（ａ）の１行目および２行目に示すように、｛参照区分，参照元関数名，参照先関数名｝＝｛関数，”ｆｕｎｃＡ”，”ｆｕｎｃＢ”｝や，｛関数，”ｆｕｎｃＡ”，”ｆｕｎｃＣ”｝という参照情報７を生成し、記憶装置に記憶させればよい。また、例えば、ソースファイルＥ．ｃを解析した結果、関数ｆｕｎｃＥで変数ｇｖａｒＵに値を設定していることを検出した場合には、図５（ａ）の６行目に示すように、｛参照区分，参照元関数名，参照先関数名｝＝｛外部変数，”ｆｕｎｃＥ”，”ｇｖａｒＵ”｝という参照情報７を生成し、記憶装置に記憶させればよい。
【００３７】
なお、図５（ｃ）に示すように、参照情報７を、関数に関する参照情報と変数に関する参照情報とに分けて格納してもよい。参照情報生成部１は、関数に関する参照情報として、参照元関数名と参照先関数名とを対応づけた情報を生成したり、外部変数に関する参照情報として、参照元関数名と参照先外部変数名とを対応づけた情報を生成し、格納すればよい。例えば、上記例の場合、｛参照元関数名，参照先関数名｝＝｛”ｆｕｎｃＡ”，”ｆｕｎｃＢ”｝や，｛”ｆｕｎｃＡ”，”ｆｕｎｃＣ”｝という参照情報を生成し、関数に関する参照情報として記憶装置に記憶させればよい。また、｛参照元関数名，参照先外部変数名｝＝｛”ｆｕｎｃＥ”，”ｇｖａｒＵ”｝という参照情報を生成し、外部変数に関する参照情報として記憶装置に記憶させればよい。
【００３８】
また、参照情報生成部１は、検査対象となりうる要素である各関数または各外部変数の所在を示すために、例えば図５（ｂ）に示すように、関数または外部変数を含んでいるソースファイルのファイル名と、そのソースファイルが格納している要素名（関数名または外部変数名）と、その要素が関数であるか変数であるかを示す要素区分とを対応づけた参格納ファイル情報９を生成する。なお、関数または外部変数を含んでいるソースファイルとは、関数または外部変数の実体コードが記述されているソースファイルのことである。例えば、図３に示されたソースファイルＡ．ｃを解析した結果、ソースファイルＡ．ｃに関数ｆｕｎｃＡの実体コードが記述されていることを検出した場合には、｛ファイル名，要素名，要素区分｝＝｛”Ａ．ｃ”，”ｆｕｎｃＡ”，関数｝とする格納ファイル情報９を生成し、記憶装置に記憶させればよい。また、例えば、ソースファイルＵ．ｃを解析した結果、ソースファイルＵ．ｃに外部変数ｇｖａｒＵの実体コードが記述されていることを検出した場合には、｛ファイル名，要素名，要素区分｝＝｛”Ｕ．ｃ”，”ｇｖａｒＵ”，外部変数｝とする格納ファイル情報９を生成し、記憶装置に記憶させればよい。
【００３９】
図２のステップＳ２０２では、変更検知部２は、前回の前提条件６と、現在の前提条件６とを比較することによって、前提条件６の変更有無を検知する。変更検知部２は、例えば、前回検証を行った際の前提条件を、図６に示すような前提条件６として記憶装置に記憶しておき、差分検証を指示された際に、現在の前提条件６と記憶しておいた前回の前提条件６とを比較する。そして、比較した結果、前提条件が変更されていた場合には、変更箇所として、その要素名を検出すればよい。なお、変更を調べるアルゴリズムは既知であり、例えば前提条件６を格納したファイルのタイムスタンプで変更の有無を検知した上で、そのファイルに記述されている各要素の差分を調べてもよい。なお、タイプスタンプを調べる”ｌｓ”やファイルの差分を調べる”ｄｉｆｆ”といったプログラムが一般に公開されており、そのプログラムを利用してもよい。
【００４０】
図６は、前提条件６の一例を示す説明図である。変更検知部２は、前提条件６として、例えば、図６（ａ）に示すように、前提条件の対象となる要素（対象要素）と、要素区分と、前提条件の種別（事前条件／事後条件／不変条件）と、条件とを対応づけた情報を記憶するようにしてもよい。例えば、図６（ａ）の１行目の前提条件｛対象要素，要素区分，種別，条件｝＝｛”ｆｕｎｃＥ”，関数，事前条件，”0 <= flag ”｝は、関数ｆｕｎｃＥが呼び出された際に、当該関数ｆｕｎｃＥの引数ｆｌａｇの値が０以上でなければならないという事前条件を示している。また、例えば、図６（ａ）の３行目の前提条件｛対象要素，要素区分，種別，条件｝＝｛”ｇｖａｒＵ”，外部変数，不変条件，”gvarU != 0”｝は、外部変数ｇｖａｒＵがこれを参照する関数が呼び出された際に０以外の値、かつその関数が処理を終えた際にも０以外の値でなければならないという不変条件が示されている。
【００４１】
なお、変更検知部２は、例えば、図６（ｂ）に示すように、前提条件６を、関数に関する前提条件と外部変数に関する前提条件とに分けて記憶してもよい。このような場合には、要素区分は省略される。なお、前提条件は、背景技術で説明したように、所定の書式を定めた上で、ソースコードのコメントとして入力してもよい。そのような場合には、変更検知部２がコメントを解析して前提条件を抽出した上で、比較すればよい。
【００４２】
図２のステップＳ２０３では、影響分析部３は、変更検知部２によって検出された前提条件の変更要素である関数または外部変数についての参照情報７に基づき、その要素の条件が変更されたことによって影響を受ける関数群を決定する。具体的には、影響を受ける関数群における基点関数を決定する。そして、決定した基点関数についての参照情報７に基づき、基点関数以下の関数呼び出し階層に位置している関数群を抽出し、それら関数群をその前提条件の変更の影響をうける関数群であるとして、検証対象に決定する。また、格納ファイル情報９に基づき、それら関数群を含むソースファイルを決定する。なお、影響分析部３は、基点関数を決定した際に、その基点関数を示す情報を基点関数リスト１０に登録する。また、ソースファイルを決定した際に、そのソースファイルを示す情報をソースコード範囲１１に登録する。なお、ソースコード範囲１１には、ソースファイルを示す情報だけでなく、そのソースファイルが含んでいる関数を示す情報を登録してもよい。
【００４３】
以降、図６（ａ）の１行目で示された前提条件が変更された場合を例にして、前提条件の変更によって影響を受ける関数群、すなわち、検証対象とする関数群の決定について説明する。
【００４４】
図７は、関数に関する前提条件の変更に係る基点関数と基点関数からの関数呼び出し階層の例を示す説明図である。図７では、関数ｆｕｎｃＥに関する前提条件が変更された場合（引出線７０１参照。）における影響範囲について示している。影響分析部３は、関数ｆｕｎｃＥに関する前提条件が変更されたことが変更検知部２によって検知された場合、その前提条件の変更を直接うける関数、およびその関数を直接呼び出す関数を特定し、それら関数を基点関数に決定する。ここで、関数に関する前提条件の変更を直接受ける関数とは、その前提条件の対象となる要素（関数）のことである。図７に示す例では、前提条件の変更を直接受ける関数として関数ｆｕｎｃＥが検出され、また、その関数ｆｕｎｃＥを直接呼び出す関数として関数ｆｕｎｃＢが検出される（引出線７０２，７０４参照。）。なお、関数に関する前提条件の変更の場合、前提条件の変更を直接受ける関数は１つであるが、その関数を直接呼び出す関数は１つであるとは限らない。２以上の関数から呼び出されている場合もあるし、１つの関数からも呼び出されていない場合もある。影響分析部３は、例えば、前提条件６においてその対象要素として示される関数を、前提条件の変更を直接受ける関数として検出すればよい。また、その関数が参照先要素である参照情報７においてその参照元関数で示される関数を、その関数（前提条件の変更を直接受ける関数）を直接呼び出す関数として検出すればよい。
【００４５】
そして、その各基点関数以下の関数呼び出し階層に位置している関数群を検証対象とする。なお、検証は基点関数毎に行う必要があるため、基点関数毎にその基点関数以下の関数呼び出し階層に位置している関数群を特定する。図７に示す例では、関数ｆｕｎｃＥの検証に必要な関数群として、関数ｆｕｎｃＥ，ｆｕｎｃＧ，ｆｕｎｃＨ，ｆｕｎｃＩが検出される（引出線７０３参照。）。また、関数ｆｕｎｃＢの検証に必要な関数群として、関数ｆｕｎｃＢ，ｆｕｎｃＣ，ｆｕｎｃＦ，ｆｕｎｃＥ，ｆｕｎｃＧ，ｆｕｎｃＨ，ｆｕｎｃＩが検出される（引出線７０５参照。）。影響分析部３は、例えば、参照情報７において、基点関数を基準に、その関数が参照元関数である参照先関数で示される関数を、その関数の階層下に位置する関数として検出するとともに、さらに、検出した関数を基準にして、その関数が参照元関数である参照先関数で示される関数を、その関数の階層下に位置する関数として検出すればよい。このような動作を関数が検出されなくなるまで繰り返し行えばよい。
【００４６】
また、図８は、外部変数に関する前提条件の変更に係る基点関数と基点関数からの関数呼び出し階層の例を示す説明図である。図８では、外部変数ｇｖａｒＵに関する前提条件が変更された場合（引出線８０１参照。）における影響範囲について示している。影響分析部３は、外部変数ｇｖａｒＵに関する前提条件が変更されたことが変更検知部２によって検知された場合、その前提条件の変更を直接うける関数、およびその関数を直接呼び出す関数を特定し、それら関数を基点関数に決定する。ここで、外部変数に関する前提条件の変更を直接受ける関数とは、その前提条件の対象である外部変数を直接参照している関数である。図８に示す例では、前提条件の変更を直接受ける関数として関数ｆｕｎｃＥおよびｆｕｎｃＵが検出される（引出線８０２，８０３参照。）。そして、関数ｆｕｎｃＥを直接呼び出す関数として関数ｆｕｎｃＢが、関数ｆｕｎｃＵを直接呼び出す関数として関数ｆｕｎｃＸが検出される（引出線８０５参照。関数ｆｕｎｃＥについては図７と同様であるため図示省略している。）。なお、外部変数に関する前提条件の変更の場合には、前提条件の変更を直接受ける関数は１つであるとは限らない。影響分析部３は、例えば、その変数が参照先要素である参照情報７においてその参照元関数で示される関数を、前提条件の変更を直接受ける関数として検出すればよい。
【００４７】
そして、その各基点関数以下の関数呼び出し階層に位置している関数群を検証対象とする。図８に示す例では、図７と同様に、関数ｆｕｎｃＥの検証に必要な関数群として、関数ｆｕｎｃＥ，ｆｕｎｃＧ，ｆｕｎｃＨ，ｆｕｎｃＩが検出され、また関数ｆｕｎｃＢの検証に必要な関数群として、関数ｆｕｎｃＢ，ｆｕｎｃＣ，ｆｕｎｃＦ，ｆｕｎｃＥ，ｆｕｎｃＧ，ｆｕｎｃＨ，ｆｕｎｃＩが検出される。また、関数ｆｕｎｃＵの検証に必要な関数群として、関数ｆｕｎｃＵが抽出される（引出線８０４参照）。また、関数ｆｕｎｃＸの検証に必要な関数群として、関数ｆｕｎｃＸ，ｆｕｎｃＵ，ｆｕｎｃＹ，ｆｕｎｃＩが検出される（引出線８０６参照。）。なお、各基点関数以下の関数呼び出し階層に位置している関数群の検出方法は、関数に関する前提条件が変更された場合と同様である。
【００４８】
図９は、影響分析部３における検証対象とする関数群の決定動作（図２のステップＳ２０３）について、その具体例な処理フローの一例を示すフローチャートである。具体的に、影響分析部３は、変更が検知された前提条件毎に繰り返し処理を行うため、まず、未処理の前提条件の有無を調べ、未処理の前提条件がある場合にはその前提条件について処理を行うためステップＳ９０２に移行し、ない場合には処理を終了する（ステップＳ９０１）。
【００４９】
ステップＳ９０２では、前提条件の要素区分が関数であるか否かを確認する。前提条件の要素区分が関数である場合には（ステップＳ９０２のＹｅｓ）、その対象要素を基点関数リスト１０に登録する（ステップＳ９０３）。これは、関数に関する前提条件の変更を直接受ける関数を基点関数として検出する処理に相当する。例えば、図６（ａ）の１行目に示されている前提条件｛対象要素，要素区分，種別，条件｝＝｛”ｆｕｎｃＥ”，関数，事前条件，”0 <= flag ”｝が変更箇所として検出された場合、関数ｆｕｎｃＥが検出される。
【００５０】
一方、前提条件の要素区分が外部変数である場合には（ステップＳ９０２のＮｏ）、参照情報７の中から、参照先区分が外部変数であって、参照先要素がその前提条件の要素区分で示される外部変数である参照情報を選択し、その参照情報において参照元関数で示される関数を基点関数リスト１０に登録する（ステップＳ９０４）。これは、外部変数に関する前提条件の変更を直接受ける関数を基点関数として検出する処理に相当する。例えば、図６（ａ）の３行目に示されている前提条件｛対象要素，要素区分，種別，条件｝＝｛”ｇｖａｒＵ”，外部変数，不変条件，”gvarU != 0”｝が変更箇所として検出された場合、図５（ａ）に示す参照情報７からは、関数ｆｕｎｃＥおよびｆｕｎｃＵが検出され、基点関数リスト１０に登録される。
【００５１】
次に、影響分析部３は、基点関数リスト１０に登録された各基点関数について、参照情報７の中から、参照先区分が関数であって、参照先要素がその基点関数である参照情報を選択し、その参照情報において参照元関数で示される関数を基点関数リスト１０に登録する（ステップＳ９０５）。これは、前提条件の変更を直接受ける関数を直接呼び出す関数を基点関数として検出する処理に相当する。例えば、関数ｆｕｎｃＥが基点関数リスト１０に登録されている場合、図５（ａ）に示す参照情報７から、関数ｆｕｎｃＢが検出され、基点関数リスト１０に登録される。また、例えば、関数ｆｕｎｃＥおよびｆｕｎｃＵが基点関数リスト１０に登録されている場合、図５（ａ）に示す参照情報７から、関数ｆｕｎｃＢおよびｆｕｎｃＸが検出され、基点関数リスト１０に登録される。
【００５２】
次のステップＳ９０６は、基点関数リスト１０に登録した基点関数毎の繰り返し処理のための終了判定動作であり、基点関数リスト１０に未処理の基点関数があるか否かを調べ、未処理の基点関数がある場合にはその基点関数について処理を行うためステップＳ９０７に移行し、ない場合には次の前提条件についての処理を行うためにステップＳ９０１に戻る。
【００５３】
以降、基点関数リスト１０に関数ｆｕｎｃＥとｆｕｎｃＢの２つの関数が登録されている場合を例に説明する。
【００５４】
ステップＳ９０７では、格納ファイル情報９の中から、その基点関数を要素名に示している格納ファイル情報を選択し、その格納ファイル情報においてその要素の格納先ファイル名をソースコード範囲１１に登録する。例えば、ソースコード範囲１１を、基点関数毎に、その検証に必要な関数群の格納先ファイル名を記述するためのファイルとして生成する場合には、ファイルがなければファイルを生成した上で、そのファイルに格納先ファイル名を示す情報を記述していけばよい。例えば、基点関数ｆｕｎｃＥについての処理であれば、図５（ｂ）に示す格納ファイル情報９からは、ソースファイルＥ．ｃが検出され、ソースコード範囲１１に登録される。
【００５５】
次に、影響分析部３は、参照情報７から、参照先区分が関数であって参照元関数がその基点関数である参照情報を選択する（ステップＳ９０８）。例えば、基点関数ｆｕｎｃＥについての処理であれば、図５（ａ）に示す参照情報７からは、｛参照区分，参照元関数名，参照先関数名｝＝｛関数，”ｆｕｎｃＥ”，”ｆｕｎｃＧ”｝とする参照情報，｛関数，”ｆｕｎｃＥ”，”ｆｕｎｃＨ”｝とする参照情報が選択される。
【００５６】
次のステップＳ９０９は、ステップＳ９０８において選択された参照情報毎の繰り返し処理のための終了判定動作であり、ステップＳ９０８において選択された参照情報の中で未処理の参照情報があるか否かを調べ、未処理の参照情報がある場合にはその参照情報について処理を行うためステップＳ９１０に移行し、ない場合には次の基点関数についての処理を行うためステップＳ９０６に戻る。なお、ステップＳ９１０は、ステップＳ９１１〜Ｓ９１３よりなる再帰処理である。
【００５７】
以降、ステップＳ９０８において｛参照区分，参照元関数名，参照先関数名｝＝｛関数，”ｆｕｎｃＥ”，”ｆｕｎｃＧ”｝とする参照情報，｛関数，”ｆｕｎｃＥ”，”ｆｕｎｃＨ”｝とする参照情報の２つの参照情報が選択された場合を例に説明する。ここでは、まず参照情報｛参照区分，参照元関数名，参照先関数名｝＝｛関数，”ｆｕｎｃＥ”，”ｆｕｎｃＧ”｝について、ステップＳ９１０の再帰処理が呼ばれることとなる。
【００５８】
ステップＳ９１１では、格納ファイル情報９の中から、その参照情報において参照先関数として示されている関数を要素名に示している格納ファイル情報を選択し、その格納ファイル情報においてその要素の格納先ファイル名をソースコード範囲１１に登録する。例えば、１回目の再帰処理では、参照情報｛関数，”ｆｕｎｃＥ”，”ｆｕｎｃＧ”｝に基づき、関数ｆｕｎｃＧを含んでいるソースファイルＧ．ｃが登録される。なお、次に、ステップＳ９０９から呼ばれる２回目の再帰処理では、参照情報｛関数，”ｆｕｎｃＥ”，”ｆｕｎｃＨ”｝に基づき、関数ｆｕｎｃＨを含んでいるソースファイルＨ．ｃが登録される。
【００５９】
次に、ステップＳ９１２では、参照情報７の中から、参照先区分が関数であって、その参照情報における参照先関数を参照元関数として示す参照情報を選択する。１回目の再帰処理では、関数ｆｕｎｃＧを参照元関数として示す参照情報は何も選択されず、２回目の再帰処理では、関数ｆｕｎｃＨを参照元関数として示す参照情報｛関数，”ｆｕｎｃＨ”，”ｆｕｎｃＩ”｝が選択される。
【００６０】
次のステップＳ９１３は、ステップＳ９１２において選択された参照情報毎の繰り返し処理のための終了判定動作であり、ステップＳ９１２において選択された参照情報の中で未処理の参照情報があるか否かを調べる。未処理の参照情報がある場合には、その参照情報について処理を行うため当該再帰処理を再帰呼び出ししてステップＳ９１０に移行し（図９の※１参照。）、ない場合には、当該再帰処理を終了する。なお、当該再帰処理終了後の復帰先は、当該再帰処理の呼び出し元であるため、再帰処理から呼び出されているか、外部から呼び出されているかによって異なる（図９の※２参照。）。
【００６１】
例えば、ステップＳ９０９からの１回目の再帰処理では、ステップＳ９１２において何も選択されないので、未処理の参照情報なしとして当該再帰処理を終了する。このときの復帰先は、ステップＳ９０９である。そして、ステップＳ９０９の判断によって、次の参照情報｛関数，”ｆｕｎｃＥ”，”ｆｕｎｃＨ”｝についての再帰処理が呼び出されることとになる。そして、ステップＳ９０９からの２回目の再帰処理では、ステップＳ９１２において、参照情報｛関数，”ｆｕｎｃＨ”，”ｆｕｎｃＩ”｝が選択されるので、選択された参照情報のうちの未処理の参照情報についての再帰処理を行わせるため、その参照情報を対象として、ステップＳ９１３から再帰処理が呼び出されることになる（ステップＳ９１３からの１回目の再帰処理）。
その後、ステップＳ９１３からの１回目の再帰処理では、ステップＳ９１１において関数ｆｕｎｃＩを含んでいるソースファイルＨ．ｃが登録される。なお、ソースファイルＨ．ｃは既に登録されているので、この登録処理は省略される。そして、ステップＳ９１２において、関数ｆｕｎｃＩを参照元関数とする参照情報は選択されず、ステップＳ９１３の判断によって、当該再帰処理（ステップＳ９１３からの１回目の再帰処理）は終了する。このときの復帰先は、ステップＳ９０８からの２回目の再帰処理におけるステップＳ９１３である。なお、ステップＳ９０８からの２回目の再帰処理において、ステップＳ９１２では、１つの参照情報しか選択されていないので、このステップＳ９１３の判断の結果、当該再帰処理は終了してステップＳ９０９に戻ることになる。
【００６２】
本例では、最終的には図１０に示すソースコード範囲１１を得ることになる。図１０は、関数ｆｕｎｃＥに関する前提条件および外部変数ｇｖａｒＵに関する前提条件が変更された場合におけるソースコード範囲１１の抽出結果を示している。すなわち、関数ｆｕｎｃＥに関する前提条件の変更によって検証が必要な基点関数として、関数ｆｕｎｃＥ，ｆｕｎｃＢが検出される。また、外部変数ｇｖａｒＵに関する前提条件の変更によって検証が必要な基点関数として、関数ｆｕｎｃＥ，ｆｕｎｃＢ，ｆｕｎｃＵ，ｆｕｎｃＸが検出される。そして、基点関数ｆｕｎｃＥの検証に必要なソースコード範囲１１として、ソースファイルＥ．ｃ，Ｇ．ｃ，Ｈ．ｃが検出される。また、基点関数ｆｕｎｃＢの検証に必要なソースコード範囲１１として、ソースファイルＢ．ｃ，Ｆ．ｃ，Ｇ．ｃ，Ｈ．ｃが検出される。また、基点関数ｆｕｎｃＵの検証に必要なソースコード範囲１１として、ソースファイルＵ．ｃが検出される。また、基点関数ｆｕｎｃＸの検証に必要なソースコード範囲１１として、ソースファイルＸ．ｃが検出される。
【００６３】
以上は、手続き型言語Ｃの例に基づく説明であるが、オブジェクト指向言語であるＪａｖａやＣ＋＋であれば、ソースファイルをクラスに置き換え、関数をメソッドに置き換え、外部変数を公開オブジェクトや公開メンバ変数に置き換えることによって、同様の処理が可能である。
【００６４】
このように、本実施の形態によれば、検証の前提条件の変更が影響するソースコード範囲を、検証前に決定することができる。結果、影響するソースコード範囲だけを検証すればよく、検証時間が短縮される。なお、本発明では、ソースコードから決定した参照情報に基づいて、変更された前提条件に直接影響を受ける関数、および当該関数を参照する関数から呼び出される関数を含めた関数群を検証対象として検出しているので、前提条件の変更が影響するソースコード範囲を漏れなく決定できる。
【産業上の利用可能性】
【００６５】
本発明は、ソースコードを実際に動作させずに解析する静的解析ツールを用いてソースコードを検証するソースコード検証システムだけでなく、前提条件の影響範囲を出力する影響範囲出力システムとしても実施可能である。
【図面の簡単な説明】
【００６６】
【図１】本発明によるソースコード検証システムの構成例を示すブロック図である。
【図２】ソースコード検証システムの動作の一例を示すフローチャートである。
【図３】ソースコード５の一例を示す説明図である。
【図４】図３で示したソースコード５の参照関係を示す説明図である。
【図５】参照情報７および格納ファイル情報９の一例を示す説明図である。
【図６】前提条件６の一例を示す説明図である。
【図７】関数に関する前提条件の変更に係る基点関数と基点関数からの関数呼び出し階層の例を示す説明図である。
【図８】外部変数に関する前提条件の変更に係る基点関数と基点関数からの関数呼び出し階層の例を示す説明図である。
【図９】影響分析部３における検証対象とする関数群の決定動作の処理フローの一例を示すフローチャートである。
【図１０】ソースコード範囲１１の抽出結果を示す説明図である。
【図１１】静的解析ツールによる前提条件および検証結果の例を示す説明図である。
【符号の説明】
【００６７】
１  参照情報生成部
２  変更検知部
３  影響分析部
４  検証処理部
【図１】
2008191963.tif 000003
【図２】
2008191963.tif 000004
【図３】
2008191963.tif 000005
【図４】
2008191963.tif 000006
【図５】
2008191963.tif 000007
【図６】
2008191963.tif 000008
【図７】
2008191963.tif 000009
【図８】
2008191963.tif 000010
【図９】
2008191963.tif 000011
【図１０】
2008191963.tif 000012
【図１１】
2008191963.tif 000013