(57)【要約】  ソースコード等価性検証装置は、変更前ソースコードと変更後ソースコードに対して、それぞれ記号実行する記号実行計算部、記号実行計算部の記号実行結果を用いて、変更前ソースコードと変更後ソースコードとの等価性検証式を生成する等価性検証式生成部、等価性検証式生成部で生成された等価性検証式を検証する等価性検証式検証部、等価性検証式検証部による等価性検証式の検証結果が、変更前ソースコードと変更後ソースコードとが非等価の場合に、変更前ソースコードと変更後ソースコードとが等価になるための修正候補を生成する修正候補生成部、および、等価性検証式検証部によるおける検証結果と修正候補生成部による前記修正候補を用いて、検証結果リポートを生成する検証結果生成部を有する。
2016174743.tif 000002
【特許請求の範囲】
【請求項１】
変更前ソースコードと変更後ソースコードに対して、それぞれ記号実行する記号実行計算部、
前記記号実行計算部の記号実行結果を用いて、前記変更前ソースコードと前記変更後ソースコードとの等価性検証式を生成する等価性検証式生成部、
前記等価性検証式生成部で生成された前記等価性検証式を検証する等価性検証式検証部、
前記等価性検証式検証部による前記等価性検証式の検証結果が、前記変更前ソースコードと前記変更後ソースコードとが非等価の場合、前記変更前ソースコードと前記変更後ソースコードとが等価になるための修正候補を生成する修正候補生成部、および、
前記等価性検証式検証部による前記検証結果と前記修正候補生成部による前記修正候補を用いて、検証結果リポートを生成する検証結果生成部を有することを特徴とするソースコード等価性検証装置。
【請求項２】
請求項１に記載のソースコード等価性検証装置において、前記等価性検証式生成部は、前記等価性検証式として、前記変更前ソースコードおよび前記変更後ソースコードの記号実行サマリを構成する各スナップショットの組み合わせに対するパス制約連言式、パス制約等価判定式、およびパス等価性検証式を生成することを特徴とするソースコード等価性検証装置。
【請求項３】
請求項２に記載のソースコード等価性検証装置において、前記等価性検証式検証部は、前記パス制約連言式、前記パス制約等価判定式、および前記パス等価性検証式を検証することを特徴とするソースコード等価性検証装置。
【請求項４】
請求項３に記載のソースコード等価性検証装置において、前記等価性検証式検証部による前記検証結果が、前記変更前ソースコードと前記変更後ソースコードとが非等価の場合、前記修正候補生成部は、前記変更後ソースコードが前記変更前ソースコードに等価になるための前記修正候補となる、変数状態の変更操作、パス制約の分解操作、およびパス制約の統合操作の少なくとも一つ操作を生成することを特徴とするソースコード等価性検証装置。
【請求項５】
請求項４に記載のソースコード等価性検証装置において、前記等価性検証式検証部による前記検証結果が非等価である場合、前記検証結果生成部は、前記修正候補生成部が生成する前記検証結果リポートに前記操作の表示を含むことを特徴とするソースコード等価性検証装置。
【請求項６】
請求項４に記載のソースコード等価性検証装置において、前記等価性検証式検証部による前記検証結果が非等価の場合、前記検証結果生成部は、前記修正候補生成部が生成する前記操作を、前記変更後ソースコードに適用し、前記変更前ソースコードと等価になるように修正された前記変更後ソースコードを、前記検証結果リポートに含むことを特徴とするソースコード等価性検証装置。
【請求項７】
ソースコード等価性検証装置によるソースコード等価性検証方法であって、前記ソースコード等価性検証装置は、
変更前ソースコードと変更後ソースコードのそれぞれを記号実行し、
前記記号実行の結果を用いて、前記変更前ソースコードと前記変更後ソースコードとの等価性検証式を生成し、
前記等価性検証式を検証し、
前記等価性検証式の検証結果が、前記変更前ソースコードと前記変更後ソースコードとが非等価の場合、前記変更前ソースコードと前記変更後ソースコードとが等価になるための修正候補を生成し、
前記等価性検証式の前記検証結果と前記修正候補を用いて、検証結果リポートを生成することを特徴とするソースコード等価性検証方法。
【請求項８】
請求項７に記載のソースコード等価性検証方法において、前記ソースコード等価性検証装置は、
前記等価性検証式として、前記変更前ソースコードおよび前記更後ソースコードの記号実行サマリを構成する各スナップショットの組み合わせに対するパス制約連言式、パス制約等価判定式、およびパス等価性検証式を生成することを特徴とするソースコード等価性検証方法。
【請求項９】
請求項８に記載のソースコード等価性検証方法において、前記ソースコード等価性検証装置は、
前記パス制約連言式、前記パス制約等価判定式、および前記パス等価性検証式を検証することを特徴とするソースコード等価性検証方法。
【請求項１０】
請求項９に記載のソースコード等価性検証方法において、前記ソースコード等価性検証装置は、
前記検証結果が、前記変更前ソースコードと前記変更後ソースコードとが非等価の場合、前記変更後ソースコードが前記変更前ソースコードに等価になるための前記修正候補となる、変数状態の変更操作、パス制約の分解操作、およびパス制約の統合操作の少なくとも一つ操作を生成することを特徴とするソースコード等価性検証方法。
【請求項１１】
請求項１０に記載のソースコード等価性検証方法において、前記ソースコード等価性検証装置は、
前記検証結果が非等価の場合、前記検証結果リポートに前記操作の表示を含むことを特徴とするソースコード等価性検証方法。
【請求項１２】
請求項１０に記載のソースコード等価性検証方法において、前記ソースコード等価性検証装置は、
前記検証結果が非等価の場合、前記操作を、前記変更後ソースコードに適用し、前記変更前ソースコードと等価になるように修正された前記変更後ソースコードを、前記検証結果リポートに含むことを特徴とするソースコード等価性検証方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコードを変更した際にソースコード間の振る舞いが等価であることを検証し、非等価である場合は等価となるように開発者が修正することを支援するための装置、および、検証方法に関する。
【背景技術】
【０００２】
ソースコードの等価性を検証するための手法として、特許文献１に記載の技術がある。特許文献１では、ソースコード比較によって差異が生じている部分にテストを実施し、その結果を比較する手法が開示されている。【０００３】
また、非特許文献１では、記号実行を用いて振る舞いが保持されていることを検証する手法が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】米国特許出願公開第２００７／００３３５７６号公報
【非特許文献】
【０００５】
【非特許文献１】S. Person, M. B. Dwyer, S. Elbaum, C. S. Pasareanu, "Differential Symbolic Execution", Proc. of ACM SIGSOFT Symposium on the Foundations of Software Engineering 2008, USA, 2008
【発明の概要】
【発明が解決しようとする課題】
【０００６】
近年、情報処理社会が進展することにより、ソフトウエアシステムが一般社会に浸透し、ソフトウエアに求められる信頼性が非常に高度なものになってきている。一方で、ソフトウエアは、長年にわたる差分・派生開発によって複雑化および大規模化の一途をたどり、ソフトウエアの拡張しやすさや理解しやすさといった保守性の低下が問題となっている。【０００７】
ソフトウエアの保守性を向上させる方法としてリファクタリングや言語リプレースがある。リファクタリングは、ソフトウエアの振る舞いを変えずに、内部構造を変更することにより、ソフトウエアの設計品質を改善する手法の総称である。言語リプレースは、保守性の低いプログラミング言語を用いて開発されたソフトウエアに対して、そのソフトウエアと同じ機能を保守性の高い別のプログラミング言語を用いて作り直すことである。【０００８】
このリファクタリングや言語リプレースの手法は、複雑化および大規模化の一途をたどるソフトウエアの保守性を確保するために有望な技術である。しかし、ソフトウエアのソースコードの変更や作り直しの際に、対象となっているソースコードの振る舞いを変えてしまうと、新たに不具合を混入してしまう可能性がある。そのため、ソフトウエア開発者が、リファクタリングや言語リプレースが原因で正しく動作していたソフトウエアに不具合が混入することをおそれ、それらを行わない判断が有り得る。ソフトウエアの保守段階において、リファクタリングや言語リプレースを積極的に行うためには、ソースコードの変更前後で、両者のソースコードの振る舞いに変化が無いことを検証する手法が求められる。【０００９】
本明細書中において、２つのソースコードの外的な振る舞いが同じであること、すなわち、任意の同じ入力に対して、実行時に同じ出力が得られることを、両ソースコードが「等価」であると定義する。また、変更前のソースコードと変更後のソースコードが、等価であるかどうかを検証することを「等価性検証」ということにする。【００１０】
変更前のソースコードと変更後のソースコードが等価であることを検証する手法に求められる条件としては以下のような条件がある。
（１）１つの条件は、その作業の大部分が自動化されており、人手による作業が少ないことである。従来、ソースコードの等価性は、人手によるレビューやテストによって検証されていた。これをツールによる自動的な検証を実現にすることにより、検証工数が削減され、リファクタリング等が促進される。
（２）もう１つの条件は、等価性検証手法により非等価であると判断された場合に、その根拠となる情報や修正すべき箇所や修正方法に関する情報を開発者に提供することである。開発者に分かりやすく修正すべき箇所の情報を提供し、さらに修正方法についての情報を提供することにより、開発者による修正が容易となり、開発期間や工数の短縮につながる。【００１１】
特許文献１による手法は、テストを必要としており、（１）の条件を満たすことができない。また、非特許文献１による方法は、等価性を検証するための論理式を生成し、ソルバを用いて検証しているが、修正すべき箇所の情報や修正方法の提供を行っていないため、（２）の条件を満たすことができない。【００１２】
そこで、本発明では、記号実行を用いたソースコード等価性検証装置において、検証結果が非等価である場合に、非等価となった変更後のソースコードを開発者が等価となるように修正するために、ソースコード上の修正関する情報を提示するための技術を提供することを目的とする。
【課題を解決するための手段】
【００１３】
開示するソースコード等価性検証装置は、変更前ソースコードと変更後ソースコードに対して、それぞれ記号実行する記号実行計算部、記号実行計算部の記号実行結果を用いて、変更前ソースコードと変更後ソースコードとの等価性検証式を生成する等価性検証式生成部、等価性検証式生成部で生成された等価性検証式を検証する等価性検証式検証部、等価性検証式検証部による等価性検証式の検証結果が、変更前ソースコードと変更後ソースコードとが非等価の場合に、変更前ソースコードと変更後ソースコードとが等価になるための修正候補を生成する修正候補生成部、および、等価性検証式検証部によるおける検証結果と修正候補生成部による前記修正候補を用いて、検証結果リポートを生成する検証結果生成部を有する。
【発明の効果】
【００１４】
開示するソースコード等価性検証装置によれば、変更前ソースコードと変更後ソースコードとを等価にするために修正すべき箇所を、開発者がソースコード上で確認することが可能となる。
【図面の簡単な説明】
【００１５】
【図１】ソースコード等価性検証に用いる変更前ソースコードの例である。
【図２】ソースコードをソースコード解析した結果の構造グラフの例である。
【図３】ソースコードを記号実行した結果の実行木の例である。
【図４】実施例１のソースコード等価性検証装置のハードウエア構成である。
【図５】実施例１のソースコード等価性検証装置のソフトウエア構成である。
【図６】ソースコード等価性検証装置の機能構成である。
【図７】ソースコード等価性検証装置の制御部および記憶部の構成並びにデータフローである。
【図８】ソースコード等価性検証装置の処理フローチャートである。
【図９】ソースコード等価性検証に用いる変更後ソースコードの例である。
【図１０】ソースコードを記号実行した結果の実行木の例である。
【図１１】等価性検証式生成部の処理フローチャートである。
【図１２】等価性検証式検証部による各パス等価性検証式の検証結果の例である。
【図１３】検証結果リポートの例である。
【図１４】非等価となるように変更した変更後ソースコードの例である。
【図１５】ソースコードを記号実行した結果の実行木の例である。
【図１６】各パス等価性検証式の検証結果の例である。
【図１７】修正候補生成部の一部の処理フローチャートである。
【図１８】検証表の例である。
【図１９】スナップショット分解操作と変数状態の変更操作の例である。
【図２０】スナップショット分解操作を適用した検証表の例である。
【図２１】変数状態の変更操作を適用した検証表の例である。
【図２２】検証結果リポートの例である。
【発明を実施するための形態】
【００１６】
本実施形態の前提となる技術である記号実行について説明する。記号実行とは、ソースコードの検証に際し、ソースコード中に用いられている変数（入力変数、グローバル変数等）に具体的な値を代入しつつソースコードを実行する代わりに、記号を用いて実行し、ソースコードの実行過程における変数の状態（以下、変数状態とも称する。）とソースコード中の当該パスを経るための条件式（以下、パス制約とも称する。）との組み合わせ（以下、スナップショットとも称する。）を用いてソースコードの入出力関係を求める技術である。
【００１７】
記号実行によれば、ソースコードが取り得る全てのパスを網羅してソースコードを検証することができる。図１は、ソースコード等価性検証に用いる変更前ソースコードの例である。以下、図１のＣ言語で記述されたソースコードＣ１００について情報処理装置を用いて記号実行を行う場合を例として説明する。
【００１８】
図２は、ソースコードをソースコード解析した結果の構造グラフの例である。記号実行において、情報処理装置は、まずソースコードＣ１００を対象に、コンパイルと同様の字句分析や構文分析を行うことにより、図２に示す構造グラフＮ１００を生成する。構造グラフＮ１００は、ソースコードの抽象構文木（構文木から、言語の意味に関係ない情報を取り除き、意味に関係ある情報のみを取り出した（抽象した）木構造のデータ構造）の各ノード間の制御フローを示しており、実線矢印は条件の付かない制御フロー、破線矢印は条件付き制御フローを表している。
【００１９】
図２に示す関数ｆｏｏの構造グラフＮ１００では、関数のエントリーポイントに対応するノードＮ１から始まり、関数の出口であるｒｅｔｕｒｎ文に対応するノードＮ５に終わる各制御フローが図示されている。また、ｉｆ文に対応するノードＮ２からは複数の条件付き制御フローが出ており、ｉｆ文の条件の成立／不成立に応じて異なる制御フローを通ることを示している。
【００２０】
構造グラフＮ１００の生成にあたって、情報処理装置は、各ノードに対応するソースコードＣ１００上の位置情報を付与する。図２に示す例においては、情報処理装置は、ソースコードＣ１００中の行番号を位置情報として付与している。例えば、ノードＮ２にはＬ４という位置情報が付与され、対応するｉｆ文がソースコードＣ１００の４行目に記載されていることが分かる。
【００２１】
図３は、ソースコードを記号実行した結果の実行木の例である。情報処理装置は、構造グラフＮ１００に基づき、図３に示す実行木Ｓ１００を生成する。実行木Ｓ１００の各ノードには、前述したパス制約（上欄）と変数状態（中欄）との組み合わせで表され、さらに、ソースコード上で経由した位置を表す位置情報（下欄）が表されている。実行木Ｓ１００の根ノード（ルートノード）Ｓ１０１は、ソースコードの実行の初期状態に対応する。情報処理装置は、ソースコードの実行に伴って変数状態が更新される度に実行木Ｓ１００に新たなノードを追加していく。
【００２２】
実行木Ｓ１００の生成に際し、情報処理装置は、関数ｆｏｏの入力変数となる変数の値に対応する記号変数を割り当てる。入力変数となる変数の値とは、関数外部から与えられて、当該関数の動作に影響を与える変数の値であり、関数の引数や関数内でアクセスするグローバル変数を含む。
【００２３】
例示するソースコードＣ１００においては、関数の引数ａとグローバル変数ｇが入力変数となる。本例では、情報処理装置は、変数ａとｇに「α」と「γ」を記号変数として割り当てている。
【００２４】
情報処理装置は、構造グラフＮ１００のノードＮ１に基づき、実行木Ｓ１００に根ノードＳ１０１を生成する。本例では、情報処理装置は、根ノードＳ１０１のパス制約（上欄）Ｓ１０１ａに、「制約無し」を示す「ｎｏ  ｃｏｎｄｉｔｉｏｎ」を設定し、変数状態（中欄）Ｓ１０１ｂに、入力変数ａとｇの値がそれぞれ割り当てられた記号変数αとγであることを示す「ａ＝α，ｇ＝γ」を設定している。また、位置情報（下欄）Ｓ１０１ｃに、ノードＮ１から取得した位置情報Ｌ２を設定する。
【００２５】
情報処理装置は、構造グラフＮ１００においてノードＮ１の制御フロー上の次ノードＮ２に基づき処理を実行する。情報処理装置は、ノードＮ２は２つの条件付き制御フローＮ２１とＮ２２を持つ条件分岐ノードであり、条件付き制御フローＮ２１に対応する子ノードＳ１０２を、条件付き制御フローＮ２２に対応する子ノードＳ１０５を、それぞれノードＳ１０１の子ノードとして生成する。
【００２６】
ノードＮ２における条件式は「ｇ＝＝１」であり、Ｓ１０１ｂにおける変数ｇの変数状態はγであるため、条件付き制御フローＮ２１における分岐条件は「γ＝１」と表現できる。そのため、ノードＳ１０２のパス制約（上欄）は、Ｓ１０１ａにおけるパス制約「制約無し」と合わせて「γ＝１」と設定される。
【００２７】
ノードＳ１０２における変数状態（中欄）は、ｉｆ文によって変数状態が変化しないため親ノードの変数状態Ｓ１０１ｂと同一に設定される。また、位置情報（下欄）は、親ノードＳ１０１の位置情報Ｓ１０１ｃに加えて、ノードＮ２の位置情報（Ｌ４）が追加され「Ｌ２，４」となり、ソースコードの２行目と４行目を経由してきたことを意味する。
【００２８】
条件付き制御フローＮ２２における分岐条件は、制御フローＮ２２がｉｆ文の条件が成立しなかった場合に対応するフローであることから、「¬（γ＝１）」と表現できる。そのため、ノードＳ１０５のパス制約（上欄）は、Ｓ１０１ａにおけるパス制約「制約無し」と合わせて「¬（γ＝１）」と設定される。
【００２９】
ノードＳ１０５における変数状態（中欄）は、ｉｆ文によって変数状態が変化しないため親ノードの変数状態Ｓ１０１ｂと同一に設定される。また、位置情報（下欄）は、親ノードの位置情報Ｓ１０１ｃに加えて、ノードＮ２の位置情報（Ｌ４）が追加され「Ｌ２，４」となる。
【００３０】
情報処理装置は、ノードＮ２の制御フローＮ２１上の次ノードであるＮ３に基づき処理を実行する。情報処理装置は、ノードＮ３に対応する実行木Ｓ１００におけるノードとしてＳ１０２の子ノードＳ１０３を生成する。
【００３１】
ノードＳ１０３においては、条件分岐が無いため、パス制約（上欄）はＳ１０２と同一に設定する。また、ノードＮ３において変数ｒに値１を代入しているため変数状態（中欄）に「ｒ＝１」を追加する。位置情報（下欄）にはＳ１０２における位置情報にノードＮ３の位置情報である「Ｌ５」を追加する。
【００３２】
情報処理装置は、Ｎ３の制御フロー上の次ノードであるＮ５に基づき処理を実行する。ノードＮ５に対応する実行木Ｓ１００におけるノードとしてＳ１０３の子ノードＳ１０４を生成する。ノードＮ５は変数ｒを返り値とするｒｅｔｕｒｎ文に対応しているため、変数状態（中欄）には、返り値を表すこととする変数Ｒに対して変数ｒの現在の値である１を割り当てた「Ｒ＝１」を追加する。ｒｅｔｕｒｎ文により関数の実行は終わるため、実行木Ｓ１００における、この枝の生成は終了し、まだ生成の終わっていない枝の生成へと移行する。
【００３３】
情報処理装置は、Ｎ２の制御フローＮ２２上の次ノードであるＮ４に基づき処理を実行する。ノードＮ４は２つの条件付き制御フローＮ４１とＮ４２を持つ条件分岐ノードであり、情報処理装置は、条件付き制御フローＮ４１に対応する子ノードＳ１０６を、条件付き制御フローＮ４２に対応する子ノードＳ１１０を、それぞれノードＳ１０５の下に生成する。
【００３４】
ノードＮ４におけるｉｆ文の条件式は「ａ＞１」であり、変数状態よりａに対応する値はαであるため、条件付き制御フローＮ４１における分岐条件は「α＞１」と表現される。そのため、Ｓ１０６におけるパス制約（上欄）はＳ１０５におけるパス制約「¬（γ＝１）」と「α＞１」との連言である「¬（γ＝１）∧（α＞１）」を設定する。
【００３５】
以下、情報処理装置は、各枝に対して、全ての枝の生成が終了するまで上記の作業を繰り返す。
【００３６】
ノードＮ６に対する処理では、情報処理装置は、ノードＳ１０７の子ノードＳ１０８を生成している。ノードＮ６では変数ｇの値をｇ−１に更新している。この時、変数ｇに対応する値はＳ１０７の変数状態（中欄）からγであると分かる。そこで、子ノードＳ１０８では、情報処理装置は、変数ｇに対する変数状態（中欄）を「ｇ＝γ―1」に更新する。このように、記号変数を含む計算に対しては具体的な値ではなく式のままの形で変数状態を保持する。
【００３７】
情報処理装置は、上記の操作によって、最終的に図２に示す構造グラフＮ１００から図３に示すような実行木Ｓ１００を得る。記号実行においては取り得る全ての制御フローが網羅されるように条件分岐に応じた子ノードが実行木に生成される。
【００３８】
実行木における葉ノードは、ソースコードの入力値に対する条件（パス制約）と、出力変数の状態（変数状態）の組の集合を求めることであるということができる。以下の説明において、記号実行が終了した時点における実行木の葉ノードを「スナップショット」と称し、スナップショットの集合のことを「記号実行サマリ」と称する。ただし、変数状態に含まれる変数のうち、ローカル変数（関数の引数を含む）は関数の実行完了時点で破棄されるため、スナップショットおよび記号実行サマリからローカル変数の変数状態は除外することとする。
【００３９】
実行木Ｓ１００における葉ノードはＳ１０４、Ｓ１０９、Ｓ１１３の３ノードであり、これらはそれぞれスナップショットとなり、これらの集合が記号実行サマリＳ１２０となる。ただし、ローカル変数である変数ｒおよびaの変数状態は除外する。
【００４０】
本例では、Ｃ言語で記述されたソースコードを用いて記号実行を説明したが、Ｃ言語に限定されず他のプログラミング言語を用いて記述されたソースコードに対しても同様に実施可能である。
【実施例１】
【００４１】
以下、図４から図１３を用いて、実施例１のソースコード等価性検証装置１０００の構成と処理について説明する。【００４２】
図４は、本実施例のソースコード等価性検証装置１０００のハードウエア構成である。ソースコード等価性検証装置は、例えば、図４に示されるような一般的な情報処理装置であるパーソナルコンピュータで実現される。ソースコード等価性検証装置１０００は、Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ（ＣＰＵ）１０１、主記憶装置１０２、ネットワークＩ／Ｆ１０３、グラフィックＩ／Ｆ１０４、入出力Ｉ／Ｆ１０５、補助記憶装置Ｉ／Ｆ１０６が、バスにより結合された形態になっている。【００４３】
ＣＰＵ１０１は、ソースコード等価性検証装置１０００の各部を制御し、主記憶装置１０２にソースコード等価性検証プログラム２００をロードして実行する。【００４４】
主記憶装置１０２は、通常、ＲＡＭなどの揮発メモリで構成され、ＣＰＵ１０１が実行するプログラム、参照するデータが補助記憶装置などからロードされて、記憶される。【００４５】
ネットワークＩ／Ｆ１０３は、外部ネットワーク１５０と接続するためのインターフェースである。【００４６】
グラフィックＩ／Ｆ１０４は、Ｌｉｑｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙ（ＬＣＤ）などの表示装置１２０を接続するためのインターフェースである。【００４７】
入出力Ｉ／Ｆ１０５は、入出力装置を接続するためのインターフェースである。図４の例では、キーボード１３１とポインティングデバイスのマウス１３２が接続されている。【００４８】
補助記憶装置Ｉ／Ｆ１０６は、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）１４１やＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）ドライブ装置１４２などの補助記憶装置を接続するためのインターフェースである。【００４９】
ＨＤＤ１４１は、大容量の記憶容量を有しており、本実施例の処理を実行するためのソースコード等価性検証プログラム２００が格納されている。【００５０】
ＤＶＤドライブ装置１４２は、ＤＶＤやＣＤなどの光学ディスクにデータを書き込んだり、光学ディスクからデータを読み込んだりする装置であり、ソースコード等価性検証プログラム２００は、例えば、ＣＤ−ＲＯＭにより提供されたものをインストールすることができる。【００５１】
本実施例のテストデータ生成装置１０００は、上記のようなパーソナルコンピュータに、ソースコード等価性検証プログラム２００をインストールして、各機能を実行するものである。【００５２】
図５は、本実施例のソースコード等価性検証装置のソフトウエア構成である。ソースコード等価性検証装置１０００で実行するソースコード等価性検証プログラム２００は、ソースコード読み込みモジュール２００１、構造グラフ生成モジュール２００２、記号実行計算モジュール２００３、等価性検証式生成モジュール２００４、等価性検証式検証モジュール２００５、修正候補生成モジュール２００６、および、検証結果表示モジュール２００７を含む。【００５３】
なお、プログラム等価性検証プログラム２００は、Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ（ＯＳ）上で動作するアプリケーションソフトウエアであり、ソースコード等価性検証装置のソフトウエア構成として、ＯＳやライブラリプログラムも含むが、図５では省略している。【００５４】
ソースコード読み込みモジュール２００１は、検証対象の変更前ソースコードと変更後ソースコードをＨＤＤや他の計算機から読み込み、記憶部に格納するモジュールである。【００５５】
構造グラフ生成モジュール２００２は、ソースコード（たとえば、前述したＣ１００）の字句解析・構文解析を行い、制御フローを抽出することにより、構造グラフ（たとえば、前述したＮ１００）を生成するモジュールである。【００５６】
記号実行計算モジュール２００３は、構造グラフ生成モジュール２００２が生成した構造グラフに基づき、記号実行を行って実行木（たとえば、前述したＳ１００）を計算し、その葉ノードを集めた記号実行サマリ（たとえば、前述したＳ１２０）を生成するモジュールである。【００５７】
等価性判定式生成モジュール２００４は、記号実行計算モジュール２００３が生成した変更前ソースコードの記号実行サマリおよび変更後ソースコードの記号実行サマリから、記号実行サマリに含まれるスナップショットの組み合わせごとに、両者の等価性を判定するための、パス制約連言式、パス制約等価判定式、およびパス等価性検証式を生成するモジュールである。【００５８】
等価性検証式検証モジュール２００５は、等価性判定式生成モジュール２００４が生成したパス制約連言式、パス制約等価判定式、およびパス等価性検証式をＳＡＴ（ＳＡＴｉｓｆｉａｂｉｌｉｔｙ）ソルバやＳＭＴ（Ｓａｔｉｓｆｉａｂｉｌｉｔｙ  Ｍｏｄｕｌｏ  Ｔｈｅｏｒｉｅｓ）ソルバを用いて充足可能性問題として解くモジュールである。【００５９】
修正候補生成モジュール２００６は、等価性検証式検証モジュール２００５が出力した検証結果を用いて、変更前ソースコードの記号実行サマリおよび変更後ソースコードの記号実行サマリに含まれるスナップショットの、どの組み合わせで非等価が生じているかを解析し、非等価である場合の論理的に等価となるための修正候補を導出するモジュールである。【００６０】
検証結果生成モジュール２００７は、等価性検証式検証モジュール２００５が出力した検証結果や修正候補生成モジュール２００６が出力した修正候補や、記号実行サマリ、ソースコードの情報を用いて、検証結果リポートを生成し、表示または通知するモジュールである。【００６１】
図６は、ソースコード等価性検証装置１０００の機能構成である。制御部１１０は、図４のＣＰＵ１０１、主記憶装置１０２により実現し、記憶部１４０は主に図４のＨＤＤ１４１により実現するが、主記憶装置１０２を含めることもある。入力装置１３０は、図４の入出力Ｉ／Ｆ１０５、キーボード１３１、マウス１３２などを含み、さらに補助記憶装置Ｉ／Ｆ１０６を介してＤＶＤドライブ装置１４２から読み込む構成を含めても良い。出力装置１２１は、グラフィックＩ／Ｆ１０４、表示装置１２０などを含み、さらに補助記憶装置Ｉ／Ｆ１０６を介してＤＶＤドライブ装置１４２へ書き込む構成を含めても良い。通信部１０３は、図４のネットワークＩ／Ｆ１０３を表わすが、ネットワーク１５０を介して例えば外部計算機１６０と接続されている。図６の制御部１１０および記憶部１４０の詳細は、図７を用いて説明する。【００６２】
図７は、ソースコード等価性検証装置１０００の制御部１１０および記憶部１４０の構成並びにデータフローである。ソースコード入力部１１１は、検証対象とする変更前ソースコード３０１および変更後ソースコード３０２を読み込み、変更前／後ソースコード記憶領域２０１にそれぞれ格納する。【００６３】
本実施例では、変更前ソースコード３０１と変更後ソースコード３０２がＣ言語で記述された例を用いて説明しているが、他のプログラミング言語にも対応した構造グラフ生成部１１２および記号実行計算部１１３を用いることにより、他のプログラミング言語で記述されたソースコードを用いることも可能である。また、変更前ソースコード３０１と変更後ソースコード３０２とで異なるプログラミング言語を用いても良い。【００６４】
構造グラフ生成部１１２は、変更前／後ソースコード記憶領域２０１に格納されている、変更前ソースコードおよび変更後ソースコードに対してそれぞれソースコード解析を実行し、その解析結果である変更前構造グラフおよび変更後構造グラフを変更前／後構造グラフ記憶領域２０２に格納する。【００６５】
記号実行計算部１１３は、変更後構造グラフを変更前／後構造グラフ記憶領域２０２に格納されている、変更前／後構造グラフのそれぞれを記号実行し、その計算結果（記号実行結果）である記号実行サマリを変更前／後記号実行結果記憶領域２０３に格納する。【００６６】
等価性検証式生成部１１４は、変更前／後記号実行結果記憶領域２０３に格納されている、変更前／後記号実行結果である、変更前ソースコードの記号実行サマリおよび変更後ソースコードの記号実行サマリから、記号実行サマリに含まれるスナップショットの組み合わせごとに、両者の等価性を判定するためのパス制約連言式、パス制約等価判定式、およびパス等価性検証式を生成し、等価性検証式記憶領域２０４に格納する。【００６７】
等価性検証式検証部１１５は、等価性検証式記憶領域２０４に格納されている、パス制約連言式、パス制約等価判定式、およびパス等価性検証式の検証を実行し、これらの検証結果を等価性検証式結果記憶領域２０５に格納する。【００６８】
修正候補生成部１１６は、等価性検証式記憶領域２０４に格納されている、パス制約連言式、パス制約等価判定式、およびパス等価性検証式のいずれかの検証結果が非等価である場合に、どのスナップショットの組み合わせで非等価になるかを判別し、等価となるための操作を導出し、修正候補として修正候補記憶領域２０６に格納する。【００６９】
検証結果生成部１１７は、パス制約連言式、パス制約等価判定式、および等価性検証式の検証結果や、修正候補、記号実行サマリ、ソースコードの情報を用いて、検証結果リポート３１０を生成し、検証結果記憶領域２０７に格納するとともに出力装置１２１を用いて画面に表示する、または、通信部１０３を用いて外部計算機１６０に送信する。【００７０】
以上の説明から明らかなように、制御部１１０に含まれる各部の動作は、図５に示したソースコード等価性検証プログラムの各モジュールをソースコード等価性検証装置１０００が実行することによって実現される。【００７１】
図８は、ソースコード等価性検証装置の処理フローチャートである。変更前ソースコードとして図１に示す変更前ソースコードＣ１００を、変更後ソースコードとしてＣ１００と等価に変更した図９に示す変更後ソースコードＣ２００を入力した場合を例として説明する。【００７２】
ソースコード入力部１１１は、検証対象とする変更前ソースコード３０１を読み込、変更前／後ソースコード記憶領域２０１にそれぞれ格納する。（Ｐ１１０）。構造グラフ生成部１１２は、変更前／後ソースコード記憶領域２０１に格納されている変更前ソースコードのソースコード解析を実行し、その解析結果である変更前構造グラフＮ１００を生成し、変更前／後構造グラフ記憶領域２０２に格納する（Ｐ１２０）。記号実行計算部１１３処は、変更前／後構造グラフ記憶領域２０２に格納されている変更前構造グラフに対して記号実行し、その実行結果を変更前記号実行サマリＳ１２０として生成し、変更前／後記号実行結果記憶領域２０３に格納する（Ｐ１３０）。【００７３】
変更後ソースコード３０２に対しても同様に、ソースコード入力部１１１の処理（Ｐ１１１）、構造グラフ生成処理部１１２の処理（Ｐ１２１）、および記号実行計算部１１３の処理（Ｐ１３１）を実行し、変更後記号実行サマリを変更前／後記号実行結果記憶領域２０３に格納する。【００７４】
変更前ソースコード３０１に対する処理ステップＰ１１０、Ｐ１２０、Ｐ１３０は、変更後ソースコード３０２に対する処理ステップＰ１１１、Ｐ１２１、Ｐ１３１は、独立に実行することができるため、両者を並列に処理しても良い。【００７５】
また、以前に同じ内容のソースコードに対して処理を実行した場合には、変更前／後記号実行結果記憶領域２０３に格納されている以前の処理結果を再利用することにより、構造グラフ生成と記号実行計算を省略することができる。【００７６】
等価性検証式生成部１１４は、変更前ソースコードの記号実行サマリと変更後ソースコードの記号実行サマリを用いて等価性検証式を生成する（Ｐ１４０）。図１０は、変更後ソースコードＣ２００を記号実行した結果の実行木の例である。具体的な処理手順を図１に示す変更前ソースコードＣ１００から生成した図３に示す記号実行サマリＳ１２０と、図９に示す変更後ソースコードＣ２００から生成した図１０に示す記号実行サマリＳ２２０とを用いて説明する。【００７７】
図１１は、等価性検証式生成部１１４の処理フローチャートである。等価性検証式生成部１１４は、変更前／後記号実行結果記憶領域２０３から変更前ソースコードの記号実行サマリを取得する（Ｐ１４１）。変更前記号実行サマリの各スナップショットに対して、下記に示す処理を実行し、未処理の変更前スナップショットが無くなれば（Ｐ１４２）、等価性検証式生成部１１４部は処理を終了する。【００７８】
等価性検証式生成部１１４部は、変更前記号実行前サマリからスナップショットを１つ選択する（Ｐ１４３）。等価性検証式生成部１１４部は、変更前／後記号実行結果記憶領域２０３から変更後記号実行サマリを取得する（Ｐ１４４）。等価性検証式生成部１１４部は、変更後記号実行サマリに対して、スナップショットを１つ選択し（Ｐ１４６）、パス等価性検証式を生成する（Ｐ１４７）。未処理の変更後スナップショットが無くなれば（Ｐ１４５）、等価性検証式生成部１１４部はステップＰ１４２に戻るため、変更前スナップショットと変更後スナップショットの全ての組み合わせに対して、等価性検証式生成部１１４部はパス等価性検証式を生成する。【００７９】
等価性検証式生成部１１４部は、記号実行サマリの各スナップショットに対して、パス制約と各変数状態の等号条件との連言を取ることによりスナップショット制約式を生成する。【００８０】
例えば、スナップショットＳ１０４、Ｓ１０９、Ｓ１１３に対しては、それぞれ（γ＝１）∧（ｇ＝γ）∧（Ｒ＝１）、¬（γ＝１）∧（α＞１）∧（ｇ＝γ−１）∧（Ｒ＝α）、¬（γ＝１）∧¬（α＞１）∧（ｇ＝γ−１）∧（Ｒ＝―α）という制約式が生成される。この際、前述のようにローカル変数である変数ｒおよび変数ａに対する変数状態の等号制約は除外される。【００８１】
さらに、等価性検証式生成部１１４は、選択された変更前スナップショットと変更後スナップショットに対して両者のパス制約に重なる部分が存在するかを判定するためのパス制約連言式と、選択された変更前スナップショットと変更後スナップショットのパス制約が等価であるかを判定するためのパス制約等価判定式と、選択された変更前スナップショットと変更後スナップショットに対応するパスの範囲内での等価性を検証するためのパス等価性検証式を生成し、等価性検証式記憶領域２０４に記録する。【００８２】
パス制約連言式は、選択された変更前スナップショットのパス制約と変更後スナップショットのパス制約の連言となる。このパス制約連言式が充足可能である時、両パス制約を満たす入力が生じるため、両者のパス制約に重なる部分が生じていることが分かる。【００８３】
パス制約等価性判定式は、パス制約連言式が充足した際に、既に両者のパス制約に重なる部分が生じている上で、重なっていない部分が存在しないことを検証する式である。パス制約等価性判定式は、選択された変更前スナップショットのパス制約をＡとし、変更後スナップショットのパス制約をＢとした際、（Ａ∧¬Ｂ）∨（¬Ａ∧Ｂ）で表す。この式が充足不可であった場合、パス制約Ａとパス制約Ｂは全て重なっており等価である。【００８４】
パス等価性検証式は、対応する出力変数間の等号制約式の連言の否定式と、選択した変更前スナップショットのスナップショット制約式と、選択した変更後スナップショットのスナップショット制約式との連言となる。変更前ソースコードと変更後ソースコードが、選択されたスナップショットすなわち選択されたパスにおいて等価である時、そのパスを通る任意の入力変数に対して出力変数が等しくなるため、対応する出力変数間の等号制約の連言が常に成立する。【００８５】
例えば変更前記号実行サマリＳ１２０中のスナップショットＳ１０４と変更後記号実行サマリＳ２２０中のスナップショットＳ２２１を選択した際、パス制約連言式は、（γ＝１）∧（γ＝１）、パス制約等価性検証式は、（（γ＝１）∧¬（γ＝１））∨（（γ＝１）∧¬（γ＝１））、パス等価性検証式は、¬（（Ｒ＝Ｒ’）∧（ｇ＝ｇ’））∧（（γ＝１）∧（ｇ＝γ）∧（Ｒ＝１））∧（（γ＝１）∧（ｇ’＝γ）∧（Ｒ’＝１））となる。ただし、変更後記号実行サマリ側の出力変数ｇとＲに対しては、変更前記号実行サマリ中の変数名との衝突を回避するため、それぞれｇ’とＲ’に置換している。【００８６】
上記の説明例では、一度に１つずつのスナップショットを選択し、パス等価性検証式を生成した。しかし、一度に複数のスナップショットを選択しても良い。その場合、パス等価性検証式生成に用いるスナップショット制約式の代わりに、選択したスナップショットに対応するスナップショット制約式の選言を用いる。【００８７】
また、上記の説明例では、記号実行計算部１１３の処理が完了してから、等価性検証式生成部１１４の処理を開始しているが、記号実行計算部１１３の処理中に、一部のスナップショットの生成が完了した時点で、当該スナップショットに係る組み合わせに対するパス等価性検証式の生成を開始しても良い。【００８８】
等価性検証式検証部１１５は、等価性検証式生成部１１４が生成した複数のパス制約連言式、パス制約等価判定式、およびパス等価性検証式に対して、それぞれＳＡＴソルバ等を用いて充足可能性を判定する（Ｐ１５０）。等価性検証式検証部１１５は、それぞれの式に対して、充足可能か不可能かの結果と、パス等価性検証式が充足可能な場合にはソルバが出力する充足するような変数の値の例である反例とを等価性検証式検証結果記憶領域２０５に格納する。【００８９】
図１２は、本例における、等価性検証式検証部１１５による各パス等価性検証式の検証結果１２００の例である。変更前スナップショットと変更後スナップショットの組み合わせ９通りのうち、全てに対してパス等価性検証式が充足不可能であると判定されるため、変更後ソースコードＣ１００と変更後ソースコードＣ２００は等価と判定される。【００９０】
修正候補生成部１１６は、非等価の場合の変更後ソースコードを等価にする修正操作を生成するが、本例においては等価と判定されるため何も実行しない（Ｐ１６０）。【００９１】
図１３は、検証結果リポートの例である。検証結果生成部１１７は、検証結果に基づき、図１３に示すような検証結果リポート５００を生成する（Ｐ１７０）。【００９２】
検証結果リポート５００には、検証結果５１０として、全てのパス等価性検証式が充足不可能な場合には「等価」と、いずれかが充足可能な場合には「非等価」と表示される。本例では、全てのパス等価性検証式が充足不可能と記録されているため検証結果５１０は「等価」と表示されている。【００９３】
また、検証結果リポート５００は、変更前／後ソースコード記憶領域２０１に格納されているソースコード情報を用いて、変更前ソースコード５２１および変更後ソースコード５２２の表示を含んでも良い。【００９４】
さらに、検証結果リポート５００は、変更前／後記号実行結果記憶領域２０３に格納されている記号実行サマリ情報を用いて、変更前記号実行サマリ５３１および変更後記号実行サマリ５３２の表示を含んでも良い。図１３における記号実行サマリ表示５３１および５３２においては、スナップショットごとにそのパス制約と変数状態とを１行で表示している。
【実施例２】
【００９５】
図８と図１４から図２２を用いて、実施例２のソースコード等価性検証装置の処理の具体例について説明する。本実施例では、変更前ソースコードの特定のパスを通ったときと変更後ソースコードの特定のパスを通ったときとの間の等価性（パス等価性と呼ぶ）を、全てのパスの組み合わせに対して検証することにより等価性検証を実現する。【００９６】
図１４は、非等価となるように変更した変更後ソースコードの例である。以下、図８に示すソースコード等価性検証の処理過程に関して、変更前ソースコードとして図１に示す変更前ソースコードＣ１００を、Ｃ１００と非等価な変更である変更後ソースコードとして図１４に示す変更後ソースコードＣ３００を入力した場合を例として説明する。【００９７】
図１５は、図８の各ステップ処理における処理内容は上述の通りであり、記号実行計算部１１３の処理（Ｐ１３１）において、変更後ソースコードＣ３００からは図１５に示すような実行木Ｓ３００および記号実行サマリＳ３２０が生成される。【００９８】
等価性検証式生成部１１４では、上述の通り、変更前スナップショットと変更後スナップショットとの組み合わせのそれぞれに対して、パス制約連言式、パス制約等価判定式、およびパス等価性検証式を生成する（Ｐ１４０）。例えば変更前記号実行サマリＳ１２０中のスナップショットＳ１０９と変更後記号実行サマリＳ３２２中のスナップショットＳ２２１を選択した際、パス制約連言式は、（¬（γ＝１）∧（α＞１））∧¬（γ＝１）、パス制約等価性検証式は、（（¬（γ＝１）∧（α＞１））∧¬（¬（γ＝１）））∨（¬（¬（γ＝１）∧（α＞１））∧¬（γ＝１））、パス等価性検証式は、¬（（Ｒ＝Ｒ’）∧（ｇ＝ｇ’））∧（¬（γ＝１）∧（α＞１）∧（ｇ＝γ−１）∧（Ｒ＝α））∧（¬（γ＝１）∧（ｇ’＝γ−１）∧（Ｒ’＝−α））となる。【００９９】
等価性検証式検証部１１５は、生成された全てのパス制約連言式、パス制約等価判定式、およびパス等価性検証式の充足可能性をＳＡＴソルバ等により判定することにより、等価判定を行う。【０１００】
図１６は、各パス等価性検証式の検証結果である。例えば変更前記号実行サマリＳ１２０中のスナップショットＳ１０９と変更後記号実行サマリＳ３２２中のスナップショットＳ２２１を選択した際のパス等価性判定式は、充足可能であり、α＝２、γ＝０、Ｒ＝２、ｇ＝−１、Ｒ’＝−２、ｇ’＝−１という反例が得られるので、それらを記録する。【０１０１】
図１７は、修正候補生成部１１６のステップＰ１６０における処理フローチャートである。修正候補生成部１１６は、等価性検証式検証部１１５が判定する各式の充足結果を便宜上、変更前のスナップショットを行に並べて、変更後のスナップショットを列に並べた表形式にして、等価性検証式検証部１１５による検証結果をマスに記載した検証表（図１８参照）を用いて説明する。本例では、図１６に示す充足判定結果は、図１８の検証表１８００となる。行方向に変更前スナップショット、列方向に変更後スナップショットを並べ、各マスに、パス制約連言式、パス制約等価判定式、およびパス等価性検証式の充足可能性の判定結果を記載する。パス制約連言式が充足不可のマスでは、パス制約連言不可として他の判定結果は省略する。パス制約連言式が充足可の場合は、パス制約等価判定式の充足結果を表す。パス制約等価判定式が充足可能の場合は、変更前スナップショットのパス制約と変更後スナップショットのパス制約が非等価のため、パス制約非等価と表わし、充足不可の場合はパス制約等価と表わす。パス等価性検証式が充足不可能の場合は、変更前スナップショットのパス制約と変更後スナップショットのパス制約が示すパスの範囲において変数出力状態が等価であることを意味するため、変数状態等価と表わし、充足可能の場合は変数状態非等価と表す。【０１０２】
修正候補生成部１１６は、検証表の中に変数状態非等価のマスが存在しなければ、等価と判定し、処理を終了する（Ｐ１６２）。少なくとも１つの変数状態が非等価のとき、変数状態が非等価のマスに着目する（Ｐ１６３）。本例では、図１８の検証表１８００において変更前スナップショットＳ１０９と変更後スナップショットＳ３２２に対応するマス１８０４が変数状態非等価のため、このマス１８０４に着目する。【０１０３】
修正候補生成部１１６は、着目したマスがパス制約等価である場合、ステップＰ１６５へ進み、パス制約非等価の場合は、ステップＰ１６６へ進む（Ｐ１６３）。【０１０４】
変更前のスナップショットのパス制約と変更後のスナップショットのパス制約が等価である場合、両者は同等の条件分岐を経てスナップショットを生成しているが、変数状態が異なっているため非等価であるという状況である。変更後のスナップショットの変数状態を変更前のスナップショットの変数状態に置き換えると、着目したマスにおいて等価となるため、修正候補生成部１１６は、着目したマスの変更後のスナップショットの変数状態を変更前のスナップショットの変数状態に置き換える操作を、修正候補として修正候補記憶領域２０６に保存し（Ｐ１６５）、ステップＰ１６１に進む。【０１０５】
修正候補生成部１１６は、検証表１８００の中の着目しているマスの縦方向に走査し、パス制約非等価である他のマスを探し、パス制約非等価である他のマスが存在する場合は、ステップＰ１６７へ進む。存在しない場合、ステップＰ１６８へ進む（Ｐ１６６）。【０１０６】
パス制約非等価である他のマスが存在する場合は、着目しているマスはパス制約が非等価で変数状態も非等価であり、その着目しているマスから縦方向にパス制約非等価の他のマスが存在する状態である。縦方向にパス制約非等価の他のマスが存在するというのは、着目しているマスの変更後スナップショットのパス制約は、縦方向に存在するパス制約非等価のマスの変更前スナップショットのパス制約とも、重なる部分を持つことを示す。よって、修正候補生成部１１６は、着目しているマスの変更後スナップショットを、着目しているマスの変更前スナップショットのパス制約を用いて分解する操作を修正候補として修正候補記憶領域２０６に保存し（Ｐ１６７）、ステップＰ１６１に進む。【０１０７】
本例では、修正候補生成部１１６は、図１８において、マス１８０４に着目しており、マス１８０３が縦方向に存在するパス制約非等価の他のマスとなるため、ステップＰ１６６において、マス１８０３を検知し、ステップＰ１６７に進む。修正候補生成部１１６は、マス１８０３における変更前スナップショットＳ１１３のパス制約¬（γ＝１）∧¬（α＞１）を分解基準とし、マス１８０４の変更後スナップショットＳ３２２のパス制約¬（γ＝１）を分解対象として、分解する（Ｐ１６７）。分解基準と分解対象はそれぞれパス制約のため、複数の制約項を連言でつないだ形をとる。分解の際は、分解基準から、分解基準と分解対象に共通で現れている制約項を取り除く。ここで本例では、共通で現れる制約項は、¬（γ＝１）であるため、分解基準は¬（α＞１）とする。この分解基準を分解対象に肯定と否定で付加することで、マス１８０３を分解する。【０１０８】
図１９は、スナップショット分解操作と変数状態の変更操作の例であり、変更後スナップショットＳ３２２をスナップショットＳ３２２１とスナップショットＳ３２２２に分解した結果である。スナップショットＳ３２２１のパス制約は、分解基準の肯定である¬（α＞１）を付加されており、他方のスナップショットＳ３２２２のパス制約は分解基準の否定である¬（¬（α＞１））を付加されている。両スナップショットの変数状態は分解前と同様である。修正候補生成部１１６は、この分解操作を修正候補記憶領域２０６に保存する。【０１０９】
修正候補生成部１１６は、検証表１８００の中の着目しているマスの横方向に走査し、パス制約非等価である他のマスを探し、パス制約非等価である他のマスが存在する場合はステップＰ１６９へ進む（Ｐ１６８）。存在しなかった場合、修正候補無しとして修正候補生成部１１６は、処理を終了する。【０１１０】
パス制約非等価である他のマスが存在する場合は、着目しているマスはパス制約が非等価で変数状態も非等価であり、その着目しているマスから横方向にパス制約非等価のマスが存在する状態である。この横方向にパス制約非等価のマスが存在するというのは、着目しているマスの変更前スナップショットのパス制約は、その横方向に存在するパス制約非等価の他のマスの変更後スナップショットのパス制約とも、重なる部分を持つことを示す。よって、修正候補生成部１１６は、着目しているマスの変更後スナップショットと、横方向に存在するパス制約非等価の他のマスの変更後スナップショットを統合する操作を修正候補として、修正候補記憶領域２０６に保存し（Ｐ１６９）、ステップＰ１６１に進む。統合操作は、両スナップショットのパス制約は選言で結合し、変数状態はどちらか任意の変数状態を採用する。【０１１１】
修正候補生成部１１６は、修正候補記憶領域２０６に保存された変数状態の変更操作、パス制約の分解操作、またはパス制約の統合操作を用いて、検証表１８００の再構築する（Ｐ１６１）。本例では、変更後スナップショットＳ３２２が、スナップショットＳ３２２１とスナップショットＳ３２２２に分解操作されているため、修正候補生成部１１６は、図１８の列１８０５を分割して、図２０に示す検証表２０００を作成し、分解されたスナップショットを用いて改めて各マスのパス制約連言式、パス制約等価判定式、パス等価性検証式の充足可能性を判定し、検証表を更新する。修正候補生成部１１６は、検証表を再構築後に、ステップＰ１６２に戻り同じ処理を繰り返す。【０１１２】
本例では、図２０の検証表２０００は、変更前スナップショットＳ１０９と変更後スナップショットＳ３２２２の組み合わせであるマス２００１が、ステップＰ１６３において着目され、着目されたマスのパス制約が等価であるため、ステップＰ１６５に進み、修正候補生成部１１６は、変更後スナップショットＳ３２２２の変数状態を、変更前スナップショットＳ１０９の変数状態に置き換える操作を、修正候補記憶領域２０６に保存する。この変更前スナップショットＳ１０９の変数状態に置き換える操作を適用した、修正後のスナップショットは、図１９のスナップショットＳ３２２３となり、修正候補生成部１１６は、ステップＰ１６１に進む。修正候補生成部１１６は、ステップＰ１６１では、図２０におけるスナップショットＳ３２２２を、図１９のスナップショットＳ３２２３に置き換え、図２１に示すような検証表２２００を構築する。検証表２２００では、検証表２０００で変数状態が非等価であったマス２００１が、マス２２０１のように修正される。以上の操作によって、検証表２２００には変数状態が非等価であるマスが存在しないため、ステップＰ１６２において、修正候補生成を終了する。修正候補生成を終了した際は修正候補記憶領域２０６に保存された操作を変更後ソースコードに適用することで、変更前ソースコードと論理的に等価になる。【０１１３】
図２２は、検証結果生成部１１７が生成する検証結果リポート６００の例である。検証結果リポート６００には、検証結果表示６１０として、全てのパス等価性検証式検証結果が充足不可能な場合に「等価」、充足可能なパス等価性検証式がある場合に「非等価」と表示される。本例では、例えばスナップショットＳ１０９とスナップショットＳ３２２を選択したときのパス等価性検証式が充足可能であるため「非等価」と表示される。【０１１４】
検証結果リポート６００には、変更前／後記号実行結果記憶領域２０３に格納されている記号実行サマリ情報を用いて、変更前記号実行サマリ６３１および変更後記号実行サマリ６３２の表示を含んでも良い。このとき、変更後記号実行サマリ６３２の表示に、スナップショットの検証結果６３９を表示することができる。【０１１５】
スナップショットの検証結果６３９は、図１６に示す各パス等価性検証式の検証結果１６０２を参照し、当該スナップショットを選択したパス等価性検証式の検証結果の全てが充足不可能であれば「等価」、充足可能なパス等価性検証式があれば「非等価」を表示する。本例では、スナップショットＳ１０４を選択している全てのパス等価性検証式、スナップショットＳ１１３を選択している全てのパス等価性検証式、および、スナップショットＳ３２１を選択している全てのパス等価性検証式は充足不可能であるため、対応する検証結果が「等価」と表示されている。一方、それ以外のスナップショットにおいては、充足可能なパス等価性検証式を含むため「非等価」と表示されている。【０１１６】
検証結果リポートは、等価性検証式検証結果記憶領域２０５に格納されている反例情報を用いて、非等価となるような反例情報６４０の表示を含んでも良い。この時、記号実行サマリの表示中にスナップショットを選択するためのチェックボックス６３８を設け、選択したスナップショットの組み合わせに対するパス等価性検証式の反例を表示するようにしても良い。【０１１７】
図２２に示す例では、スナップショットＳ１０３とスナップショットＳ３２２に対応するチェックボックスを選択した際に、図１６にあるスナップショットＳ１０９とスナップショットＳ３２２から生成されたパス等価性検証式の反例１６０１から得られた情報が表示されている。【０１１８】
検証結果リポート６００には、さらに、変更前／後ソースコード記憶領域２０１に格納されているソースコード情報を用いて、変更前ソースコード６２１および変更後ソースコード６２２の表示を含んでも良い。このとき、スナップショットを選択するためのチェックボックス６３８を用いて選択されたスナップショットに対して、当該スナップショットが持つ位置情報から、ソースコード上においてそのスナップショットの経路を表示させても良い。【０１１９】
図２２に示す例では、変更前ソースコード６２１上に、スナップショットＳ１０９の位置情報を用いてスナップショットＳ１０９の経路を下線で表示している。また、変更後ソースコード６２２上に、スナップショットＳ３２２の位置情報を用いてスナップショットＳ３２２の経路を下線で表示している。【０１２０】
経路を表示する方法としては、図２２に示す下線で表示する方法の他にも、背景を別の色で表示する、字体や文字サイズを変えて強調表示する、経路以外の部分の表示を消去して経路のみを表示するようにするなど、他の部分と異なる態様で表示する。【０１２１】
あるスナップショットの組み合わせに対する等価性検証結果が非等価であり、非等価である原因を調査する場合、そのスナップショットの経路上に原因が存在しており、経路以外の箇所は当該スナップショットの結果には影響を与えないため調査不要である。【０１２２】
選択したスナップショットに対応する経路がソースコード上に表示され、また、それらの組み合わせに対応する反例が表示されることにより、非等価となる入力および出力に対して、開発者がソースコード上で調査すべき範囲を絞り込むことが可能となり、非等価である原因を発見することが容易となる。【０１２３】
検証結果リポート６００には、修正候補記憶領域２０６に格納されている修正候補情報を用いて、変更後記号実行サマリ６３２の修正対象箇所に対して、等価となるための修正候補２５０１の表示を含んでも良い。【０１２４】
図２２に示す例では、変更後のスナップショットＳ３２２に対して、図１９に示すスナップショットＳ３２２１とＳ３２２２への分解操作が修正候補として修正候補記憶領域２０６に格納されているため、スナップショットＳ３２２１に対応する分解後スナップショット２５０２とスナップショットＳ３２２２に対応する分解後スナップショット２５０３が表示される。また、分解後の操作として、スナップショットＳ３２２２をスナップショットＳ３２２３に変数状態を修正する操作が修正候補として修正候補記憶領域２０６に格納されているため、分解後スナップショット２５０３の変数状態２５０４に、その変数状態の置き換えを反映して表示されている。【０１２５】
修正候補を表示する方法としては、図２２に示す変更後記号実行サマリに修正候補を表示する方法の他にも、変更後ソースコードの選択したスナップショットに対応する経路上に修正候補を表示するなどの方法がある。【０１２６】
非等価であるスナップショットの組み合わせに対して、変更後スナップショットのパス制約と変数状態をどのように修正すれば等価となるかという修正候補が表示されることにより、非等価となる入力および出力に対して、開発者がソースコード上で修正すべき箇所や修正方法を絞り込むことが可能となり、非等価を修正することが容易となる。【０１２７】
検証結果リポート６００には、変更前／後ソースコード記憶領域２０１に格納されているソースコード情報と修正候補記憶領域２０６に格納されている修正候補情報を用いて、変更後ソースコード６２２に対して修正候補を適用し、変更前ソースコードと論理的に等価となるように修正された修正後ソースコード２５０５の表示を含んでも良い。【０１２８】
図２２に示す例では、修正候補記憶領域２０６に格納されている修正候補情報は、まず、分解基準を¬（α＞１）とする変更後スナップショットＳ３２２の分解である。その分解基準によってｉｆ文による分岐を、変更後スナップショットＳ３２２の通る経路上である修正後ソースコード２５０５の７行目に加え、分解基準の否定の経路を示すｅｌｓｅ文による分岐を１０行目に追加している。分解されたスナップショットＳ３２２１、つまり図２２における分解後スナップショット２５０２は、変数状態に変更は無いため８行目と９行目はそのままとなる。分解されたスナップショットＳ３２２２は、変数状態の変更操作がされてスナップショットＳ３２２３となるため、修正後ソースコード２５０５の１１行目は変更された変数状態を実現するソースコードとなる。【０１２９】
このとき、パス制約の分解操作や変数状態の変更操作によって修正された箇所を下線で表示している。修正箇所を表示する方法としては、図２２に示す下線で表示する方法の他にも、背景を別の色で表示する、字体や文字サイズを変えて強調表示する、修正箇所以外の部分の表示を消去して経路のみ表示されるようにするなど、他の部分と異なる態様で表示する。【０１３０】
修正後ソースコードは、論理的に変更前ソースコードと等価となるような修正を機械的に適用したソースコードのため、可読性や保守性が低くなる可能性があり、そのまま用いることが困難な可能性がある。しかし、非等価である変更前／後ソースコードに対して、変更後ソースコードにどのような修正を行うと変更前ソースコードと等価になるかを示すことにより、開発者がソースコード上でどのように修正するかを検討することが容易となる。
【符号の説明】
【０１３１】
１０００…ソースコード等価性検証装置、１０１…ＣＰＵ、１０２…主記憶装置、１０３…ネットワークＩ／Ｆ、１０４…グラフィックＩ／Ｆ、１０５…入出力Ｉ／Ｆ、１０６…補助記憶装置Ｉ／Ｆ、１１０…制御部、１２０…表示・出力装置、１２１…出力装置、１３０…入力装置、１３１…キーボード、１３２…マウス、１４０…記憶部、１４１…ＨＤＤ、１４２…ＤＶＤドライブ、１５０…外部ネットワーク、１６０…外部計算機、２００…ソースコード等価性検証プログラム、２０１…変更前／後ソースコード記憶領域、２０２…変更前／後構造グラフ記憶領域、２０３…変更前／後記号実行結果記憶領域、２０４…等価性検証式記憶領域、２０５…等価性検証式検証結果記憶領域、２０６…修正候補記憶領域、２０７…検証結果記憶領域、１１１…ソースコード入力部、１１２…構造グラフ生成部、１１３…記号実行計算部、１１４…等価性検証式生成部、１１５…等価性検証式検証部、１１６…修正候補生成部、１１７…検証結果生成部、Ｃ１００，Ｃ２００、Ｃ３００…ソースコード、Ｓ１００、Ｓ２００、Ｓ３００…記号実行の実行木、Ｓ１２０、Ｓ２２０、Ｓ３２０…記号実行サマリ、Ｓ１０４、Ｓ１０９、Ｓ１１３、Ｓ２２１〜Ｓ２２３、Ｓ３２１〜Ｓ３２３…記号実行におけるスナップショット、Ｓ１０１ａ…記号実行木のノードのパス制約、Ｓ１０１ｂ…記号実行木のノードの変数状態、Ｓ１０１ｃ…記号実行木のノードの位置情報、Ｎ１００…構造グラフ、１８００、２０００、２２００…検証表、５００、６００…検証結果リポート。
【図１】
2016174743.tif 000003
【図２】
2016174743.tif 000004
【図３】
2016174743.tif 000005
【図４】
2016174743.tif 000006
【図５】
2016174743.tif 000007
【図６】
2016174743.tif 000008
【図７】
2016174743.tif 000009
【図８】
2016174743.tif 000010
【図９】
2016174743.tif 000011
【図１０】
2016174743.tif 000012
【図１１】
2016174743.tif 000013
【図１２】
2016174743.tif 000014
【図１３】
2016174743.tif 000015
【図１４】
2016174743.tif 000016
【図１５】
2016174743.tif 000017
【図１６】
2016174743.tif 000018
【図１７】
2016174743.tif 000019
【図１８】
2016174743.tif 000020
【図１９】
2016174743.tif 000021
【図２０】
2016174743.tif 000022
【図２１】
2016174743.tif 000023
【図２２】
2016174743.tif 000024
【手続補正書】
【提出日】平成29年9月27日(2017.9.27)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
変更前ソースコードと変更後ソースコードに対して、それぞれ記号実行する記号実行計算部、
前記記号実行計算部の記号実行結果を用いて、前記変更前ソースコードと前記変更後ソースコードとの等価性検証式を生成する等価性検証式生成部、
前記等価性検証式生成部で生成された前記等価性検証式を検証する等価性検証式検証部、
前記等価性検証式検証部による前記等価性検証式の検証結果が、前記変更前ソースコードと前記変更後ソースコードとが非等価の場合、前記変更前ソースコードと前記変更後ソースコードとが等価になるための修正候補を生成する修正候補生成部、および、
前記等価性検証式検証部による前記検証結果と前記修正候補生成部による前記修正候補を用いて、検証結果リポートを生成する検証結果生成部を有することを特徴とするソースコード等価性検証装置。
【請求項２】
請求項１に記載のソースコード等価性検証装置において、前記等価性検証式生成部は、前記等価性検証式として、前記変更前ソースコードおよび前記変更後ソースコードの記号実行サマリを構成する各スナップショットの組み合わせに対するパス制約連言式、パス制約等価判定式、およびパス等価性検証式を生成することを特徴とするソースコード等価性検証装置。
【請求項３】
請求項２に記載のソースコード等価性検証装置において、前記等価性検証式検証部は、前記パス制約連言式、前記パス制約等価判定式、および前記パス等価性検証式を検証することを特徴とするソースコード等価性検証装置。
【請求項４】
請求項３に記載のソースコード等価性検証装置において、前記等価性検証式検証部による前記検証結果が、前記変更前ソースコードと前記変更後ソースコードとが非等価の場合、前記修正候補生成部は、前記変更後ソースコードが前記変更前ソースコードに等価になるための前記修正候補となる、変数状態の変更操作、パス制約の分解操作、およびパス制約の統合操作の少なくとも一つ操作を生成することを特徴とするソースコード等価性検証装置。
【請求項５】
請求項４に記載のソースコード等価性検証装置において、前記等価性検証式検証部による前記検証結果が非等価である場合、前記検証結果生成部は、前記修正候補生成部が生成する前記検証結果リポートに前記操作の表示を含むことを特徴とするソースコード等価性検証装置。
【請求項６】
請求項４に記載のソースコード等価性検証装置において、前記等価性検証式検証部による前記検証結果が非等価の場合、前記検証結果生成部は、前記修正候補生成部が生成する前記操作を、前記変更後ソースコードに適用し、前記変更前ソースコードと等価になるように修正された前記変更後ソースコードを、前記検証結果リポートに含むことを特徴とするソースコード等価性検証装置。
【請求項７】
ソースコード等価性検証装置によるソースコード等価性検証方法であって、前記ソースコード等価性検証装置は、
変更前ソースコードと変更後ソースコードのそれぞれを記号実行し、
前記記号実行の結果を用いて、前記変更前ソースコードと前記変更後ソースコードとの等価性検証式を生成し、
前記等価性検証式を検証し、
前記等価性検証式の検証結果が、前記変更前ソースコードと前記変更後ソースコードとが非等価の場合、前記変更前ソースコードと前記変更後ソースコードとが等価になるための修正候補を生成し、
前記等価性検証式の前記検証結果と前記修正候補を用いて、検証結果リポートを生成することを特徴とするソースコード等価性検証方法。
【請求項８】
請求項７に記載のソースコード等価性検証方法において、前記ソースコード等価性検証装置は、
前記等価性検証式として、前記変更前ソースコードおよび前記変更後ソースコードの記号実行サマリを構成する各スナップショットの組み合わせに対するパス制約連言式、パス制約等価判定式、およびパス等価性検証式を生成することを特徴とするソースコード等価性検証方法。
【請求項９】
請求項８に記載のソースコード等価性検証方法において、前記ソースコード等価性検証装置は、
前記パス制約連言式、前記パス制約等価判定式、および前記パス等価性検証式を検証することを特徴とするソースコード等価性検証方法。
【請求項１０】
請求項９に記載のソースコード等価性検証方法において、前記ソースコード等価性検証装置は、
前記検証結果が、前記変更前ソースコードと前記変更後ソースコードとが非等価の場合、前記変更後ソースコードが前記変更前ソースコードに等価になるための前記修正候補となる、変数状態の変更操作、パス制約の分解操作、およびパス制約の統合操作の少なくとも一つ操作を生成することを特徴とするソースコード等価性検証方法。
【請求項１１】
請求項１０に記載のソースコード等価性検証方法において、前記ソースコード等価性検証装置は、
前記検証結果が非等価の場合、前記検証結果リポートに前記操作の表示を含むことを特徴とするソースコード等価性検証方法。
【請求項１２】
請求項１０に記載のソースコード等価性検証方法において、前記ソースコード等価性検証装置は、
前記検証結果が非等価の場合、前記操作を、前記変更後ソースコードに適用し、前記変更前ソースコードと等価になるように修正された前記変更後ソースコードを、前記検証結果リポートに含むことを特徴とするソースコード等価性検証方法。
【国際調査報告】
2016174743.tif 000025
2016174743.tif 000026
2016174743.tif 000027
2016174743.tif 000028