(57)【特許請求の範囲】
【請求項１】
コンピュータに、ソフトウェアのソースコードを入力させ、前記ソースコードを解析させ、解析結果を出力させるためのソフトウェアの構造可視化プログラムにおいて、
前記プログラムは、前記コンピュータに前記ソースコードの構文解析を実行させるための構文解析部と、
前記コンピュータに前記構文解析部による構文解析結果から、前記ソースコード中の記述位置毎に区別された複数の変数について、変数間の依存関係を導出させるための変数依存関係解析部と、
前記変数依存関係解析部により導出した変数依存関係を、前記複数の変数の前記ソースコード中の記述位置情報と共に、前記コンピュータに表示装置への表示、または前記コンピュータ外部への出力を実行させるための変数依存関係出力部と、を有することを特徴とするソフトウェアの構造可視化プログラム。
【請求項２】
前記コンピュータに入力された前記ソースコードを表示装置に表示させるためのソースコード出力部を有し、
前記ソースコード出力部は、前記コンピュータに、前記変数依存関係出力部によって表示または出力された変数依存関係中のユーザが指定した変数に対応する、前記ソースコード中の記述を強調表示させることを特徴とする、請求項１記載のソフトウェアの構造可視化プログラム。
【請求項３】
前記構文解析部による構文解析結果に基づいて、前記コンピュータに前記ソースコードに含まれる変数を抽出させる変数抽出部と、
前記コンピュータに前記変数抽出部によって抽出された変数についての属性を表示させ、ユーザの変数選択を受け付けさせる変数表示部と、
前記コンピュータに前記変数表示部にてユーザにより選択された変数をルートとする変数依存関係を、前記変数依存関係解析部によって導出された変数依存関係から抽出させる変数依存関係抽出部と、を有し、
前記変数依存関係出力部は、前記変数依存関係抽出部によって抽出された変数依存関係を前記コンピュータに表示または出力させることを特徴とする、請求項１記載のソフトウェアの構造可視化プログラム。
【請求項４】
前記変数依存関係抽出部は、前記変数表示部にてユーザにより選択された変数をルートとして抽出した変数依存関係に含まれ参照される変数と実体が同じで定義される変数をルートとする変数依存関係を、前記変数依存関係解析部によって導出された変数依存関係から前記コンピュータに抽出させることを特徴とする、
請求項３記載のソフトウェアの構造可視化プログラム。
【請求項５】
請求項３において、
前記変数表示部は、前記コンピュータに各変数の実行パス数を表示または出力させることを特徴とする、請求項３記載のソフトウェアの構造可視化プログラム。
【請求項６】
前記変数依存関係解析部は、ユーザにより入力された実行開始点から前記構文解析部による構文木を辿るように前記コンピュータに解析させることを特徴とする、請求項１記載のソフトウェアの構造可視化プログラム。
【請求項７】
変数依存関係出力部は、変数依存関係をツリー形式で前記コンピュータに表示または出力させることを特徴とする、請求項３記載のソフトウェアの構造可視化プログラム。
【請求項８】
前記変数依存関係抽出部は、ユーザに選択された変数と実体が異なり、かつ異なる実行パスに存在する変数が、特定の処理タイミングにおいてのみ前記ユーザに選択された変数へ影響を与える変数依存関係を前記コンピュータに抽出させることを特徴とする、請求項３記載の構造可視化プログラム。
【請求項９】
前記変数依存関係解析部による複数のソースコードそれぞれの変数依存関係を解析させた結果を前記コンピュータに比較させ、差分を判定させる変数依存関係比較部を有することを特徴とする請求項１記載の構造可視化プログラム。
【請求項１０】
前記変数依存関係解析部による解析結果に基づき、前記ソースコード中の前記実行開始点に影響を与えない箇所を前記コンピュータにスライシングさせることを特徴とする請求項６記載の構造可視化プログラム。
【請求項１１】
スライシングされた前記ソースコードのモデル検証を行うことを特徴とする請求項１０記載の構造可視化プログラム。
【請求項１２】
請求項１から１１いずれか一項に記載の構造可視化プログラムを格納する記憶媒体を備え、前記構造可視化プログラムを実行するコンピュータと、ユーザからの入力を受け付ける入力装置と、前記コンピュータからの出力を表示する表示装置と、を備えた構造可視化システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はソフトウェアの構造を解析するソフトウェアツールに係り、特に解析結果を可視化する手法およびその手法に沿った処理を実行可能なソフトウェアツールに関する。
【背景技術】
【０００２】
ソフトウェアの規模が巨大化し、構造や処理の複雑さが増しており、設計者や検証者がソフトウェアの全容を把握することが困難になっている。またソフトウェアの開発が過去資産への継ぎ足しで行われることもあり、簡潔でないコード記述を生むことや、ソフトウェアへの追加・修正による影響の把握が困難なことの原因となっている。
【０００３】
特に制御装置では、装置の電動化に伴う制御用ソフトウェアの規模増大により、ソフトウェアを含む電子制御装置に不具合が潜在し、システムの安全性を損う恐れが増していることを背景として、ＩＥＣ６１５０８やＩＳＯ２６２６２などの機能安全規格が制定されている。
【０００４】
システムの安全性を確保する上でも、設計者や検証者がソフトウェア、特に過去資産や他の設計者が記述したソースコードの構造や処理を理解することが好ましい。設計者や検証者による理解を容易にすることを目的として、プログラムに対し静的解析や動的解析を行い、その結果を関数コールグラフなどの図形として視覚化する手法とツールがある。視覚化対象のうち、ソフトウェアの構成上で重要な情報の１つとして、変数間の依存関係がある。ここで依存関係は、実行順序により実行結果が変化する可能性のある関係である。ソフトウェアの動作は、入力を始めとするデータを用いて演算し、出力に至る別のデータを変化させる処理の連続であるから、変数依存関係はソフトウェアの構成や処理概要を把握する上で重要である。
【０００５】
ソースコードから変数依存関係を解析しグラフとして表示することに近い先行技術として、特許文献１や特許文献２では、ソースコードからデータフローグラフを生成している。ここでデータフローグラフは、ある１ステートメントにおけるデータの流れ（変数依存関係）を示すものであり、複数ステートメント間に渡るデータの流れではない。
【０００６】
非特許文献１では、ＰＤＧ（Program Dependence Graph）を紹介している。ＰＤＧでは、ソースコードからステートメント間に存在するデータ依存関係（変数を定義、つまり値決めしている命令から、参照している命令へ到達する依存関係）や制御依存関係（分岐またはループの条件式にて変数を参照している命令から、その分岐・ループに含まれる命令にて変数を定義している命令に到達する依存関係）を有向グラフで示しており、グラフのノードはステートメントである。
【０００７】
非特許文献２，３では、変数依存関係の解析や表示を行っている。しかし依存関係の解析・表示において、変数を記述位置で区別していない。同じ名称、実体（記憶領域）の変数でも、記載位置（ファイル、関数、行、列）が異なれば、依存関係上では区別して扱う必要がある。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開平７−９３１４４号公報
【特許文献２】特開２００３−５０７２２号公報
【非特許文献】
【０００９】
【非特許文献１】『プログラムスライシング技術と応用』  共立出版（１９９５）
【非特許文献２】大崎，山本，阿草：『プログラム理解のための依存関係表示ツール』（ＦＯＳＥ’９６）
【非特許文献３】＊＊井上研究室＊＊
【発明の概要】
【発明が解決しようとする課題】
【００１０】
上記従来技術では、実行時の処理順序を考慮してユーザに変数依存関係の解析結果を提供することについて考慮されていない。
【００１１】
本発明は、複数ステートメント間や関数間など、ソースコードの広域に渡る変数間の依存関係を解析し、ソフトウェア実行時の処理順序により決定される変数同士の与える影響・依存関係を視覚的に理解できるようにすること、また、変数を単位（ノード）としてグラフに表示することにより、ソフトウェアの構成や処理概要に関する情報をユーザに提供することを目的とする。
【課題を解決するための手段】
【００１２】
上記課題を解決するため本発明は、コンピュータに、ソフトウェアのソースコードを入力させ、前記ソースコードを解析させ、解析結果を出力させるためのソフトウェアの構造可視化プログラムにおいて、前記プログラムは、前記コンピュータに前記ソースコードの構文解析を実行させるための構文解析部と、前記コンピュータに前記構文解析部による構文解析結果から、前記ソースコード中の記述位置毎に区別された複数の変数について、変数間の依存関係を導出させるための変数依存関係解析部と、前記変数依存関係解析部により導出した変数依存関係を、前記複数の変数の前記ソースコード中の記述位置情報と共に、前記コンピュータに表示装置への表示、または前記コンピュータ外部への出力を実行させるための変数依存関係出力部と、を有するよう構成する。
【発明の効果】
【００１３】
本発明によれば設計者や検証者がソフトウェアの構造や処理概要を、変数依存関係の観点から理解することを容易にできる。
【図面の簡単な説明】
【００１４】
【図１】本発明の基本機能構成図。
【図２】変数依存関係解析部の機能構成図。
【図３】変数依存関係解析の処理フロー。
【図４】実施例１で解析対象とするソースコード。
【図５】実施例１のソースコードの構文木。
【図６】実施例１のソースコードの制御フローに関するデータベース。
【図７】実施例１のソースコードの制御フローグラフ。
【図８】実施例１のソースコードの代入依存関係に関するデータベース。
【図９】実施例１のソースコードのデータ依存関係に関するデータベース。
【図１０】実施例１のソースコードの制御依存関係に関するデータベース。
【図１１】実施例１のソースコードの変数依存関係（ネットワーク）を示すグラフ。
【図１２】変数依存関係（ネットワーク）から変数依存関係（ツリー）を抽出する拡張機能構成図。
【図１３】変数依存関係（ツリー）を抽出する処理フロー。
【図１４】実施例１のソースコードの変数依存関係（ツリー）を表すグラフ。
【図１５】変数依存関係（ツリー）とソースコードとの連携表示例。
【図１６】実施例１のソースコードの実行パス数カウント結果表示例。
【図１７】異なる実行パスにて間接的に影響する変数依存関係（ツリー）を抽出する処理フロー。
【図１８】実施例２で解析対象とするソースコード。
【図１９】実施例２のソースコードから異なる実行パスにて間接的に影響する変数依存関係（ツリー）を抽出した例。
【図２０】２つの変数依存関係を比較する拡張機能構成図。
【図２１】２つの変数依存関係を比較する処理フロー。
【図２２】変数依存関係の比較例、差分がある場合。
【図２３】変数依存関係の比較例、差分がない場合。
【図２４】関数コールグラフと変数依存関係（ツリー）との複合表示例。
【図２５】本発明のシステム構成。
【図２６】変数依存関係に基づくスライシング処理結果の表示例。
【発明を実施するための形態】
【００１５】
本発明における構文解析部は、ソースコードを解析して構文情報を出力する。変数依存関係解析部は、制御フロー導出部、代入依存関係導出部、データ依存関係導出部、制御依存関係導出部、変数依存関係導出部からなる。制御フロー導出部は、前記構文情報から制御フローを出力する。代入依存関係導出部は、前記制御フローから２変数間の代入依存関係を出力する。データ依存関係導出部は、前記制御フローから２変数間のデータ依存関係を出力する。制御依存関係導出部は、前記制御フローから２変数間の制御依存関係を出力する。変数依存関係導出部は、前記代入依存関係と前記データ依存関係と前記制御依存関係とから複数ステートメント間に渡る変数依存関係を出力する。変数依存関係出力部は、前記変数依存関係をグラフとして表示する。前記の各部における変数は、変数名や変数の実体（記憶領域）だけでなく、ソースコードにおける記述位置によっても区別して扱う。
【００１６】
［実施例１］
以下、図面を用いて本発明の実施形態について説明を行う。  
図１は、本発明を実現する基本的な機能構成図であり、本明細書における全ての実施例で共通である。本発明はソフトウェアツールとして実現されている。各機能はソフトウェアとして実装されており、表示画面、主演算装置、主記憶装置（メインメモリ）、ハードディスク等の記憶媒体、キーボードやポインティングデバイス等の入力装置を備えるコンピュータ上で実行される。
【００１７】
ファイル入力部１１は、解析対象となるソースコードファイルをユーザが１ないし複数選択できる機能を有しており、ユーザによるファイル指定に従い、ソースコードファイルをコンピュータの記憶媒体から読み込む。構文解析部１２は、ユーザが解析実行を指示すると、ファイル入力部１１が読み込んだソースコードファイルの構文を解析し、構文木（Abstract Syntax Tree）データを生成する。なお、本明細書の実施例では、Ｃ言語で記述されているソースコードを扱う。構文木において、記述位置で区別される各変数には、記述位置のほか、実体（記憶媒体における領域）がＩＤの形で割り当てられている。実体は、変数の名称や型、スコープ（グローバル、ローカルなど）から解析する。
【００１８】
関数抽出部１３は、構文解析部１２が生成した構文木から、ソースコード中に記述されている各関数について、名称や記述位置などの属性を抽出し、関数属性データとして出力する。実行開始点選択部１４は、関数抽出部１３が出力した関数属性データから関数名を表示する。ユーザは実行開始点選択部１４の表示から、実行開始点とする関数を１ないし複数選択することができ、実行開始点選択部１４は選択された関数を実行開始点データとして出力する。変数依存関係解析部１５は、構文解析部１２が生成した構文木と、実行開始点選択部１４が出力した実行開始点データとから、変数依存関係を解析しデータとして出力する。変数依存関係出力部１６は、変数依存関係解析部１５が出力する変数依存関係データをグラフとして表示する。ソースコード出力部１７は、ファイル入力部１１が読み込んだソースコードファイルの内容を表示する。また、変数依存関係出力部１６の変数依存関係との連携表示が可能である。連携表示の際には、構文解析部１２が生成した構文木データも利用する。
【００１９】
図２５は、本発明をシステムとして実現した場合のシステム構成である。  
図１で説明したソフトウェアは、ソフトウェア構造可視化プログラム２５１３１として、例えばコンピュータ２５１上のＲＯＭ２５１３に格納されており、ＣＰＵ２５１２によって読み出されて実行される。コンピュータ２５１はソフトウェア構造可視化プログラム２５１３１によって規定された処理、すなわち図１で説明した各部の処理を実行する。解析対象となるソースコードファイルは、コンピュータ２５１上のハードディスク２５１４に格納されている。解析実行指示などのユーザ操作は、キーボードなどの入力装置２５２から行うことができる。
【００２０】
なお、ソースコード出力部１７による出力は、例えばディスプレイなどの表示装置２５３に成されるが、図示しない外部コンピュータへのネットワークを介した出力、ＣＤ−ＲＯＭなどの外部記憶媒体へのデータファイル形式での書き込みによる出力であってもよい。
【００２１】
図２は、変数依存関係解析部１５の詳細を示している。制御フロー導出部２１は、実行開始点選択部１４の出力する実行開始点データから、構文解析部１２の出力する構文木を辿り、制御フローを解析し、データとして出力する。代入依存関係導出部２２、データ依存関係導出部２３、制御依存関係導出部２４は、制御フロー導出部２１の出力する制御フローデータから、それぞれ代入依存関係、データ依存関係、制御依存関係を導出し、データとして出力する。
【００２２】
なお、本発明における代入依存関係、データ依存関係、制御依存関係は変数を単位（ノード）としているが、各変数は変数名や実体だけでなく、ソースコードにおける記述位置で区別される。例えばグローバル変数ａ，ｂ，ｃが宣言されており、ソースコードファイルｓｒｃ．ｃに記述された関数ｆｕｎｃ内において、（ｓｒｃ．ｃの）３行目にｂ＝ａという式、５行目にｃ＝ａという式がある場合、３行目のａと５行目のａとは異なるノードとして扱う。本明細書では、３行目のａを「ａ（Ｌ３＠ｆｕｎｃ）」のように表記する。変数の記述位置属性は、行だけでなく列も有するが、本明細書では一部の表記において列情報を省略する。また、記述位置属性には関数名の代わりにファイル名やファイルパスを用いても良い。「変数」には周辺回路との入出力を行うマイコンのレジスタにアクセスする変数を含む。変数依存関係には、変数と定数との依存関係も含む。
【００２３】
本明細書にて「代入依存関係」は、２変数間の代入処理による依存関係を意味する。例として、変数ａ，ｂに対しａ＝ｂというステートメントがあれば、ａ←ｂ（ａはｂに依存する。ｂはａに影響を与える）という依存関係がある。代入依存関係は、構文木から代入文を検索すれば抽出できる。なおソフトウェアの解析では、定義（値決め）される変数はｄｅｆ、参照される変数はｕｓｅと呼ばれる。上記例では、変数ａがｄｅｆ、変数ｂがｕｓｅである。
【００２４】
データ依存関係は、あるｄｅｆから、そのｄｅｆが含まれるステートメントから遷移可能な各実行パスにおいて処理順序的に最も近い同実体のｕｓｅへ到達する依存関係である。このため、構文木の各ｄｅｆについて、そのｄｅｆから構文木を制御フローに従って各実行パスを辿り、同実体のｄｅｆより前に出現する同実体ｕｓｅを探索することで、データ依存関係を導出することができる。具体的な処理方法の例としては、構文木においてｄｅｆの含まれる各ステートメントから、構文木を辿っていく。ｉｆ文などの分岐文は、各分岐を辿る。上記ｄｅｆと同実体ｕｓｅを発見したら、そのｕｓｅまでのデータ依存関係を記憶し、現在辿っている分岐については探索を終了する。
【００２５】
制御依存関係は、ｉｆ文などの分岐文や、ｗｈｉｌｅ文などのループ文の条件式にて記述されるｕｓｅから、当該分岐文やループ文の内部に記述されるｄｅｆへ到達する依存関係である。このため、構文木における分岐文・ループ文の条件式に記述される各ｕｓｅについて、そのｕｓｅから構文木を制御フローに従って各実行パスを辿り、当該分岐文・ループ文の内部に記述されるｄｅｆを探索することで、制御依存関係を導出することができる。例えばｉｆ文には条件式が真のときの節と、偽のときの節とがあるが、それぞれの節に含まれるｄｅｆを探索する。このとき、ｕｓｅとｄｅｆとは実体が異なっても制御依存関係を生じる。
【００２６】
変数依存関係導出部２５は、代入依存関係導出部２２、データ依存関係導出部２３、制御依存関係２４が出力する依存関係をつなぎ合わせ、解析対象としたソースコードの広域に渡る変数依存関係を導出し、データとして出力する。より正確には、実行開始点選択部１４にてユーザが選択した実行開始点の関数から始まる実行パス全体に渡る変数依存関係である。出力された変数依存関係データは、変数依存関係出力部１６に渡される。
【００２７】
図３は、図１、図２に示した機能による変数依存関係を導出する処理のフローを示している。ステップ３１にて、構文解析部１２が構文木データを出力する。構文木データは、ＲＡＭ２５１１のような記憶媒体に一時的に記憶されてもよいし、ハードディスク２５１４上にデータファイルとして作成されてもよい。ステップ３２にて、ステップ３１にて生成された構文木データから関数抽出部１３が関数名を抽出し、実行開始点選択部１４が関数名を表示してユーザによる実行開始点選択を受け付ける。ステップ３３にて、制御フロー導出部２１は構文木データとステップ３２にて入力された実行開始点データとから、制御フローデータを出力する。制御フローデータに関しても同様に、ＲＡＭ２５１１やハードディスク２５１４など、出力先はいずれであってもよい。ステップ３４にて、代入依存関係導出部２２はステップ３３にて出力された制御フローデータから、代入依存関係を導出し出力する。ステップ３５にて、データ依存関係導出部２３はステップ３３にて出力された制御フローデータから、データ依存関係を導出し出力する。ステップ３６にて、制御依存関係導出部２４はステップ３３にて出力された制御フローデータから、制御依存関係を導出し出力する。ステップ３７にて、変数依存関係導出部は、ステップ３４にて出力された代入依存関係と、ステップ３５にて出力されたデータ依存関係と、ステップ３６にて出力された制御依存関係とを連結し、ソースコードの広域に渡る変数依存関係を導出し出力する。データ依存関係、制御依存関係、変数依存関係それぞれに関しても同様に、ＲＡＭ２５１１やハードディスク２５１４など、出力先はいずれであってもよい。
【００２８】
以下では、サンプルソースコードに対する変数依存関係の解析と表示の例を説明する。図４は、解析対象とするソースコードファイルである。ファイル左端の数値は、行番号を示している。図５は、図４のサンプルソースコードを入力として構文解析部１２が出力する構文木データをグラフとして示している（ただし変数と関数の宣言は省略している。また、代入文もツリーに分解できるが省略している）。構文木データ５１〜５４はそれぞれ関数ｆ１，ｆ２，ｆ３，ｆ４に対応しており、構文木の各ノードは１構文要素を意味する。各構文ノードは解析対象とされたソースコード全体で一意のＩＤ（構文ＩＤ）が割り振られている。図４の各構文ノードの右にカッコ内で記された数値が、構文ＩＤである。構文木の構成を一部説明すると、関数ｆ１（構文ＩＤ１００）の下位にはｉｆ文（１０１）が配され、当該ｉｆ文の下位には条件式「ｘ＞０」（１０３）、条件式が真のときの節（１０４）、条件式が偽のときの節（１０６）が配されている。なお図５には描画していないが、構文木の各ノードは属性として、記述されているファイル名、記述開始位置（行・列）と記述終了位置（行・列）とを有する。例えばｉｆ文（構文ＩＤ＝１０１）のノードには、ファイル名「ｓｒｃ０１．ｃ」、記述開始位置「５行２列目」、記述終了位置「９行２列目」が記録されている。
【００２９】
図６は、制御フロー導出部２１が出力する制御フローデータの例を示している。これはユーザが実行開始点選択部１４にて、関数ｆ１とｆ４を選択した場合のデータである。制御フローデータ６１にて、１つのデータセット（１行）は１構文要素を意味し、構文ＩＤ、ソースコードのファイルパス（図では記載省略）、関数名（または関数ＩＤ）と開始行・列で表される記述位置、ステートメント、ステートメントに含まれる変数の実体ＩＤ、「通過点」の各項目からなる。変数実体ＩＤは構文解析部１２により解析木データにて、変数の宣言を抽出した順番で一意に割り振られている。「通過点」は、当該構文に到達するまでに通過した、関数呼び出し文、関数入り口、分岐文などの構文ＩＤが通過順に並ぶデータである。いくつかの構文要素について通過点データを説明すると、関数ｆ１（構文ＩＤ１００）と関数ｆ４（４００）は実行開始点であるため、通過点は空である。条件式ｘ＞０（１０３）、真文ａ＝１（１０５）、偽文ａ＝０（１０７）は関数ｆ１（１００）、ｉｆ文（１０１）が通過点となっている。またそれぞれ条件文（１０２）、ＴＲＵＥ節（１０４）、ＦＡＬＳＥ節（１０６）が通過点となっている。条件式ｙ＞０（４０３）、代入文ｚ＋＝ｙ（４０５）、ｙ−−（４０６）は関数ｆ４（４００）、ｗｈｉｌｅ文（４０１）が通過点となっている。またそれぞれ条件文（４０２）、ループ内（４０４）が通過点となっている。このように通過点データは構文木における各ノードの親子関係から導出することができる。
【００３０】
また制御フローデータ６１にて、各構文のデータは実行順序に基づく半順序で並べられている。つまり、基本的には実行順序通りであるが、例えばｉｆ文の真文と偽文とには順序関係がなく、データ上はどちらかが先に並べられている。２つの構文間における順序関係の有無は、通過点データとステートメント種類から判定することができる。例えば、真文（構文ＩＤ１０５）と偽文（１０７）は通過点データがｉｆ文（１０１）まで同一だが、その後のＴＲＵＥ節（１０４）とＦＡＬＳＥ節（１０６）とで異なるので、ｉｆ文（１０１）から並列であることがわかる。代入文（１０８）と関数呼び出し文（１０９）は、通過点データが同一であるため、順序関係があるとわかる。
【００３１】
図７は、制御フローデータ６１を有向グラフにしたものである。ノードの数値は構文ＩＤである。変数依存関係導出部２５は制御フローデータ６１から、制御フローグラフ７１，７２に示された制御フローと同等の情報を得ることができる。例えば、制御フローデータ７２にて、代入文（４０６）から条件文（４０３）に戻るフローの付与は、通過点データの「ループ内（４０４）」が付与されているのが代入文（４０６）までであることから判断することができる。
【００３２】
図８は、代入依存関係導出部２２が出力する代入依存関係データを示している。代入依存関係データ８１にて、１つのデータセット（１行）は１つの依存関係を意味し、依存先変数（ｄｅｆ）と依存元変数（ｕｓｅ）のデータとから構成され、各変数のデータは変数名または即値、変数（または即値）の実体ＩＤ、関数名と開始行・列とで表される記述位置の各項目からなる。なお、関数ｆ４の５行目に記述されたステートメントｚ＋＝ｙの変数ｚは、ｄｅｆとｕｓｅの２つに分解されている。代入依存関係８１は、制御フローデータ６１（または構文木データ５１〜５４）から代入文を抽出して導出できる。
【００３３】
図９は、データ依存関係導出部２３が出力するデータ依存関係データを示している。データ依存関係９１にて、１つのデータセット（１行）は１つの依存関係を意味し、依存先変数（ｕｓｅ）と依存元変数（ｄｅｆ）のデータとからなり、各変数のデータ項目は代入依存関係データ８１と同じである。
【００３４】
データ依存関係データ９１の導出例として、「ｚ（Ｌ８＠ｆ４）←ｚ（Ｌ５＠ｆ４）」と「ｚ（Ｌ５＠ｆ４）←ｚ（Ｌ５＠ｆ４）」とを説明する。制御フローデータ６１にて、構文ＩＤ４０５のｄｅｆであるｚ（Ｌ５＠ｆ４）を始点として、ｚ（Ｌ５＠ｆ４）と実体（ＩＤ１２）が同じｕｓｅを探索する。ｚ（Ｌ５＠ｆ４）はｗｈｉｌｅ文（構文ＩＤ４０１）のループ内（４０４）にあるが、このループは構文ＩＤ４０６までとなっている。構文ＩＤ４０６までに該当するｕｓｅが発見されないので、２つの実行パス、構文ＩＤ４０３〜４０６と構文ＩＤ４０７〜とをそれぞれ探索する。それぞれの実行パスで最初に発見される該当ｕｓｅは、構文ＩＤ４０５のｚ（Ｌ５＠ｆ４）と構文ＩＤ４０７のｚ（Ｌ８＠ｆ４）であるため、ｚ（Ｌ５＠ｆ４）ｄｅｆを依存元とするデータ依存関係があると判定する。
【００３５】
図１０は、制御依存関係導出部２４が出力する制御依存関係データを示している。制御依存関係データ１０１にて、１つのデータセット（１行）は１つの依存関係を意味し、依存先変数（ｕｓｅ）と依存元変数（ｄｅｆ）のデータとからなり、各変数のデータ項目は代入依存関係データ８１と同じである。
【００３６】
制御依存関係データ１０１の導出例として、「ａ（Ｌ６＠ｆ１）←ｘ（Ｌ５＠ｆ１）」と「ａ（Ｌ８＠ｆ１）←ｘ（Ｌ５＠ｆ１）」とを説明する。制御フローデータ６１にて、条件式ｘ＞０（構文ＩＤ１０３）で用いられるｕｓｅであるｘ（Ｌ５＠ｆ１）から、条件式（１０３）が属するｉｆ文（１０１）内で記述されるｄｅｆを探索すると、通過点データにｉｆ文（１０１）が含まれる構文（１０５，１０７）のａ（Ｌ６＠ｆ１）とａ（Ｌ８＠ｆ１）が該当するｄｅｆとして発見されるので、制御依存関係があると判定する。
【００３７】
図１１は、代入依存関係データ８１、データ依存関係データ９１、制御依存関係データ１０１を統合したデータを、変数依存関係を有向グラフとして表したものである。データ統合の方法は、ｄｅｆ／ｕｓｅは各変数の属性情報とした上で、ｄｅｆ／ｕｓｅの区別に依らず依存元と依存先とで１つのテーブルに纏める。変数依存関係出力部１６は図１１と同等の表示を行う。図４のソースコードに対し、関数ｆ１とｆ４とを実行開始点に指定した場合、２つの変数依存関係１１１と１１２が導出される。変数依存関係１１１のルートノードはｆ（Ｌ１４＠ｆ１）、変数依存関係１１２のルートノードはｅ（Ｌ８＠ｆ４）である。変数依存関係１１２にてｚ（Ｌ５＠ｆ４）ｄｅｆとｚ（Ｌ５＠ｆ４）ｕｓｅとの間に見られるように、依存関係にはループが存在し得る。このため、変数依存関係を図１１のようにグラフ化した場合、ネットワーク形式となる。
【００３８】
図１２は、ネットワーク形式の変数依存関係から、あるノード（位置で区別する変数）をルートとしてツリー形式のデータを抽出しグラフ表示するための機能構成図のうち、図１からの差分を示している。
【００３９】
変数抽出部１２１は、構文解析部１２の出力する構文木データのうち、変数宣言部を探索し、宣言されている変数の属性情報を抽出し、変数属性データとして出力する。変数属性データでは変数を実体で区別し記述位置では区別しない。変数選択部１２２は、変数抽出部１２１が出力した変数属性データを表示する。ユーザは変数選択部１２２の表示から、変数依存関係のルートにする変数を１ないし複数選択可能であり、変数選択部１２２は選択された変数に関する属性データを出力する。変数依存関係抽出部１２３は、変数依存関係解析部１５の出力するネットワーク形式の変数依存関係データと、変数選択部１２２が出力する変数属性データとから、変数属性データに含まれる変数をルートとするツリー形式の変数依存関係を抽出し、データとして出力する。変数依存関係出力部１６は、変数依存関係抽出部１２３の出力するツリー形式の変数依存関係データを表示する。
【００４０】
図１３は、変数依存関係抽出部１２３によるツリー形式の変数依存関係を抽出する処理のフローを示している。処理フローは処理１から開始する。ステップ１３１にて、変数依存関係抽出部１２３は変数依存関係解析部１５が出力するネットワーク形式の変数依存関係のルートノードを起点として、変数選択部１２２が出力する変数属性データに含まれる（記述位置で区別しない）変数と実体が同じ（記述位置で区別する）変数のノードを探索する。また、探索されたノードのコピーを、変数依存関係抽出部１２３が出力するツリー形式の変数依存関係のルートノードとする。ステップ１３２にて、変数依存関係抽出部１２３はステップ１３１にて設定したツリーのルートノードと、ネットワーク形式の依存関係から探索したノードを引数として、処理２を呼び出す。ここで処理２の仮引数となるノードを「追加点ノード」と「探索点ノード」とする。ステップ１３３〜１３５は、探索点ノードの全ての子ノード（探索点ノードが依存しているノード）についてそれぞれ実施し、子ノードが存在しなければ実施しない。ステップ１３３にて、変数依存関係抽出部１２３は当該子ノードのコピーを追加点ノードに依存先として接続する。ステップ１３４にて、当該子ノードのさらに子ノード、つまり対象ノードの孫ノードがツリーに追加済であるか否かを確認する。確認方法は、ツリーをルートノードから辿り、当該孫ノードと（実体だけでなく記述位置を含めて）一致するノードの有無を判定する。一致するノードが存在すれば追加済である。追加済であればステップ１３５をスキップし、追加済でなければステップ１３５に進む。ステップ１３５にて、変数依存関係抽出部１２３はステップ１３３にて追加したノードと当該子ノードを引数として、処理２を呼び出す。処理２は再帰構造となっており、全ての処理２が終了すると、処理２から処理１に戻り、処理１を終了する。
【００４１】
図１４は、変数依存関係抽出部１２３が図１３の処理フローにより抽出したツリー形式の変数依存関係データを、有向グラフとして表示した例であり、変数依存関係出力部１６は図１４と同等の表示を行う。ツリー形式の変数依存関係１４１，１４２は、図１１に記載されたネットワーク形式の変数依存関係１１１，１１２から、変数ｅをルートノードとして抽出したデータであり、依存関係のループが消失している。
【００４２】
なお、ステップ１３４にてある孫ノードがツリーに追加済である場合に、ツリーにて当該孫ノードと同一のノードを、ステップ１３３にて追加したノードに依存先として接続すれば、ネットワーク形式での依存関係の抽出を行うことができる。
【００４３】
また、図１３の処理フローでは依存関係の子ノードを辿り追加しているが、これは「選択した変数に影響を与える変数の依存関係」である。図１３の処理フローとは逆に親ノードを辿ってツリーを抽出し、図１４や図１５と同様の表示を行うと、「選択した変数が影響を与える依存関係」を抽出し表示を行うことができる。
【００４４】
図１４のようにツリー形式で変数依存関係を表示することにより、ユーザはルートノードとなる変数から依存関係を一方向に辿ることができるため、依存関係にループがあるときよりも表示が簡素になり、ユーザは依存関係を追い易く、ソフトウェアの構造を理解しやすくなる。
【００４５】
図２４は、図１１の変数依存関係１１１を異なる形式で描画したグラフであり、変数依存関係と関数コールの複合グラフである。変数依存関係出力部１６は図２４と同等の表示を行う。
【００４６】
関数ノード２４１〜２４３とその呼出順序を示す接続（矢印）は、関数コールグラフを示している。関数コールグラフのデータは、変数依存関係導出部２５が、制御フロー導出部２１による制御フローデータ６１から、関数呼び出しの構文を抽出して連結することで作成する。具体的には、ｆ１→ｆ２（構文ＩＤ１０９）、ｆ２→ｆ３（２０１）を抽出し、連結している。
【００４７】
変数依存関係２４０の各変数ノードは、関数ノード２４１〜２４３のうち、変数ノードが記述されている関数に対応する関数ノード内に配置される。変数依存関係２４０における各ノードの表記は、変数依存関係１１１と異なり、記述位置情報から関数名が省略されている。
【００４８】
図２４のようなグラフを表示することにより、ユーザは関数呼出順序と変数依存関係、および両者の関係を同時に見ることができるので、ソフトウェアの構造を、変数依存関係のみとはまた異なる視点から理解することができる。
【００４９】
図１５は、変数依存関係とソースコードとを連携して表示した例である。変数依存関係表示領域１５１は、変数依存関係出力部１６の一部であり、図１４のツリー形式の変数依存関係１４１を表示している。ｃ（Ｌ６＠ｆ２）から先は集約され、表示されていない。ユーザがカーソル１５２を用いて変数依存関係表示領域１５１のあるノード（記述位置で区別した変数）を選択すると、ソースコード出力部１７の一部であるソースコード表示領域１５３に、選択された変数の記載を含むソースコードが表示される。図１５では、選択されたｄ（Ｌ１３＠ｆ１）が記載されたｓｒｃ０１．ｃが表示され、さらに１３行目に下線が引かれ、変数ｄは強調表示されており、選択された変数の記載された箇所がユーザに判別しやすくなっている。
【００５０】
図１５の表示を実現する処理を以下に説明する。変数依存関係出力部１６は、変数依存関係表示領域１５１でカーソル１５２によりある変数が選択されたことを検出すると、選択された変数の属性情報をソースコード出力部１７に通知する。ソースコード出力部１７は、通知された変数の属性情報に含まれるファイルパスから、ソースコード表示領域１５３に当該ファイルを表示する。また、通知された変数の属性情報に含まれる変数の記述位置から、下線表示や強調表示を行う。
【００５１】
また、ソースコード表示領域１５３にてカーソル１５２により選択された変数を、変数依存関係表示領域１５１の依存関係から検索し、表示することも可能である。ソースコード出力部１７は、ソースコード表示領域１５３にてカーソル１５２によりある記述位置が選択された場合、構文解析部１２の出力する構文木データから、選択された記述位置と同じ位置にある変数を探索する。該当する変数が存在する場合、当該変数の属性情報を変数依存関係出力部１６に通知する。変数依存関係出力部１６は、変数依存関係から通知された属性情報（実体ＩＤ、記載位置）をキーとして一致する変数のノードを探索する。当該ノードが存在する場合、当該ノードを変数依存関係表示領域１５１に強調表示する。
【００５２】
図１５では、変数依存関係と関数コールグラフの連携表示も行っている。関数コールグラフ表示領域１５４では、変数依存関係表示領域１５１にて選択されたｄ（Ｌ１３＠ｆ１）が記載されている関数ｆ１のノードが下線表示されている。関数コールグラフ表示領域１５４は、変数依存関係出力部１６から選択された変数の属性情報の通知を受け、属性情報に含まれる関数名（または関数ＩＤ）と一致する関数ノードを関数コールグラフから検索し、下線表示を行う。
【００５３】
以上のように、複数ステートメント間や関数間など、ソースコードの広域に渡る変数間の依存関係を導出し、変数を単位（ノード）としてソースコード中の記述位置で区別してグラフに表示することにより、ソフトウェアの構成や処理概要に関する情報を変数依存関係の観点からユーザに提供することができる。これにより、設計者や検証者がソフトウェアの構造や処理概要を理解することを容易にすることができる。
【００５４】
図１６は、変数選択部１２２による変数属性情報の表示例である。変数表示領域１６１において、変数選択領域１６２に対しユーザがカーソル１５２により（記述位置で区別しない）変数を選択すれば、選択された変数をルートノードとするツリー形式の変数依存関係が変数依存関係抽出部１２３により抽出される。
【００５５】
変数表示領域１６１には、実行パス数表示欄１６３を設けることができる。実行パス数表示欄１６３には、変数ａ〜ｅ、ｘ〜ｚそれぞれの実行パス数が表示されている。実行パス数は、変数依存関係解析部１５が出力するネットワーク形式の変数依存関係から求めることができる。各依存関係のルートノードから辿り、変数の実体ごとに出現有無を調べ、出現する場合は１、出現しない場合は０として、全依存関係にて合計した値がその変数の実行パス数である。ただし依存関係のループにより探索が終了しないことを防ぐため、１回辿ったノードを一時記憶し、当該ノードから先は辿らない。実体が同じ変数は、１つの変数依存関係ツリーに複数回出現しても、実行パス数は１となる。
【００５６】
変数依存関係１１１，１１２をルートノードから辿っていくと、変数ｅは両方の変数依存関係で出現するので実行パス数は２、変数ａ〜ｄ，ｆは変数依存関係１１１のみで、変数ｘ〜ｚは変数依存関係１１２のみで出現するので実行パス数はそれぞれ１となる。
【００５７】
図１６のような表示により、ユーザは各変数の実行パス数を見て、ツリー形式の変数依存関係のルートノードとする変数を選択することができる。複数の実行パスからアクセスされる変数は、各実行パスの処理タイミングにより、データアクセスの競合、排他制御の失敗など、設計時に想定していない処理間の干渉による不具合をもたらす恐れがある。本実施例では、周期タスクにおいて関数ｆ１(  )を実行し、構文ＩＤ１１１にて変数ｅの値を参照する直前に、割込み処理により関数ｆ４(  )が実行され、変数ｅの値が書き換えられる現象が想定しうる。ユーザは、ソフトウェアの不具合原因となりうる変数を抽出し、不具合事象を発生させ得る処理の実行パスに対応する変数依存関係を表示させ、また変数依存関係から当該実行パスに関係するソースコードを表示させることにより、不具合発生箇所の候補を目視し、実際に不具合がしうるかを確認することができる。
【００５８】
［実施例２］
図１７は、変数依存関係抽出部１２３が図１３の処理に加えてその後に実施しうる処理のフローを示している。この処理フローにより、変数選択部１２２で選択された変数に対し「間接的に」影響を与え得る変数依存関係のツリーが抽出される。ここで「間接的に」とは、選択された変数とは実体が異なり、かつ異なる実行パスに存在する変数が、処理タイミングによっては選択された変数と依存関係が生じる、という意味である。
【００５９】
フローは処理１から開始する。ステップ１７１は、図１３の処理で抽出されたツリー形式の変数依存関係の各ルートノードについて実施する。ステップ１７１にて、変数依存関係抽出部１２３はツリー形式の変数依存関係の１つのルートノードを引数として、処理２を呼び出す。ここで処理２の仮引数となるノードを「探索点ノード」とする。ステップ１７２〜１７５は、対象ノードの全ての子ノードについてそれぞれ実施し、子ノードが存在しなければ実施しない。ステップ１７２にて、変数依存関係抽出部１２３は当該子ノードがｕｓｅか否かを判定し、ｕｓｅであればステップ１７３に、ｕｓｅでなければステップ１７５に進む。ステップ１７３にて、変数依存関係抽出部１２３は当該子ノードと実体が同じでｄｅｆの（記述位置で区別する）変数ノードを、変数依存関係解析部１５が出力したネットワーク形式の変数依存関係から探索する。ただし、ステップ１７１で対象としたルートノードと同一のノードが含まれる変数依存関係は探索対象から外す。当該ｄｅｆが存在すればステップ１７４に、存在しなければステップ１７５に進む。ステップ１７４にて、変数依存関係抽出部１２３はステップ１７３で探索したｄｅｆをルートとするツリー形式の変数依存関係を抽出する。抽出方法は図１３の処理フローと同様である。また、抽出したツリー形式の変数依存関係と、既に抽出しているツリー形式の変数依存関係との重複の有無を判定し、重複しているツリーは破棄する。２つのツリー間での重複の判定方法は、１つのツリーのルートノードが、他のツリーのルートノードと同じか下位に含まれていれば前者のツリーが冗長で破棄してよいとする。この判定を、新たに抽出したツリーと、既に抽出した全てのツリー間で行う。ステップ１７５にて、変数依存関係抽出部１２３は当該子ノードを引数として処理２を呼び出す。処理２は再帰構造となっており、全ての処理２が終了すると、処理２から処理１に戻り、処理１を終了する。
【００６０】
以下では、サンプルソースコードに対し図１７の処理により変数依存関係を抽出し表示する例を説明する。図１８は、解析対象とするソースコードファイルである。図１９のうち、変数依存関係１９１と１９２は、実行開始点を関数ｆ５とｆ６とした場合に変数依存関係抽出部１２３が抽出するネットワーク形式の変数依存関係である。これらの変数依存関係に対し、ユーザにより変数選択部１２２にて変数ｄがルートノードとして選択されると、変数依存関係抽出部１２３は図１３の処理フローにより、変数依存関係１９１からツリー形式の変数依存関係１９３を抽出する。さらに変数依存関係抽出部１２３は図１７の処理フローにより、変数依存関係１９３に含まれるｕｓｅであるｃ（Ｌ６＠ｆ５）と実体が同じｄｅｆであるｃ（Ｌ４＠ｆ６）を変数依存関係１９２から探索し、ｃ（Ｌ４＠ｆ６）をルートノードとしてツリー形式の変数依存関係１９４を抽出する。
【００６１】
関数ｆ５とｆ６が、割込みやＯＳ（Operating System）のタスクとして並行に実行される場合、各処理の実行タイミングによっては、ｃ（Ｌ６＠ｆ５）ｕｓｅの値はｃ（Ｌ５＠ｆ５）ｄｅｆではなくｃ（Ｌ４＠ｆ６）ｄｅｆの値となる。つまりｃ（Ｌ４＠ｆ６）はｃ（Ｌ５＠ｆ５）に間接的に影響し、さらにｄ（Ｌ６＠ｆ５）に影響しうる。
【００６２】
以上のように間接的に影響のある変数依存関係を抽出し表示することにより、ユーザは処理の実行タイミングにより排他制御の失敗やデータ競合により不具合を起こし得る箇所をソースコードから容易に発見できる。また、図１５のように変数依存関係とソースコードとを連携表示させることで、実際の不具合の可能性を確認することができる。
【００６３】
［実施例３］
図２０は、２つのソースコードの変数依存関係を比較して差分を判定し表示するための機能構成図のうち、図１からの差分を示している。変数依存関係解析部１５は、２つのソースコードについて変数依存関係を解析する。変数依存関係比較部２０１は、変数依存関係解析部１５による２つのソースコードの変数依存関係を比較する。変数依存関係データの各ノードには差異有無の項目があり、値として差異あり／差異なし／未確定（初期値）のいずれかを取るとする。変数依存関係比較部２０１は比較結果から差異有無の項目に値を設定する。変数依存関係出力部１６は、変数依存関係比較部２０１により比較された２つのソースコードの変数依存関係を差分部分に違いを付けて、つまり差異有無の項目が「差異あり」のノードに着色するなどして表示する。
【００６４】
変数依存関係比較部２０１が比較する変数依存関係のデータには、変数の記述位置が含まれる。しかし２つのソースコードの変数依存関係を比較する際には、変数の記述位置を無視する。一方で、変数依存関係を表示する際には、変数の記述位置を含めて表示する。
【００６５】
図２１は、変数依存関係比較部２０１が実行する、２つのソースコードの変数依存関係について比較する処理フローを示している。ここでは簡単のため、各ソースコードにおける変数依存関係のルートノードは１つとする。フローは処理１から開始する。ステップ２１１にて、変数依存関係比較部２０１は２つのソースコードの変数依存関係それぞれのルートノードを抽出する。１つのルートノードを「ノード１」、もう１つのルートノードを「ノード２」とする。ステップ２１２にて、変数依存関係比較部２０１はノード１とノード２の実体を比較する。実体が同じであればステップ２１３に、異なればステップ２１５に進む。ステップ２１３では、ノード１とノード２を引数として処理２を呼び出す。ステップ２１４では、ノード２の下位ノードについて、差分有無の項目が「未確定」のノードを、「差分あり」とし、処理１を終了する。ステップ２１５では、２つの変数依存関係の全ノードに差異があると判定し、処理１を終了する。
【００６６】
次に処理２を説明する。処理２の仮引数もノード１、ノード２とする。ステップ２１６〜２２０は、ノード１の全ての子ノードについてそれぞれ実施し、子ノードが存在しなければ実施しない。ステップ２１６にて、変数依存関係比較部２０１はノード２の下位ノードから、ノード１の当該子ノードと、実体およびｄｅｆ／ｕｓｅの種類が同じで、かつ差分有無の項目が「未確定」の変数ノードを探索する。ステップ２１７では、ステップ２１６で該当するノードが存在すればステップ２１８に、存在しなければステップ２１９に進む。ステップ２１８にて、変数依存関係比較部２０１は変数依存関係の差分を判定する。ノード１′に現在処理対象としているノード１の子ノードを、ノード２′にステップ２１５で探索したノードを指定し、ノード１′とノード２′については差異なしと判定する。ノード２とノード２′の間にノードがある場合には、それらのノードには差異があると判定する。判定後はステップ２２０に進む。ステップ２１９にて、変数依存関係比較部２０１は現在処理対象としているノード１の子ノードに差異があると判定する。また、ノード１′に当該子ノードを、ノード２′にノード２を指定し、ステップ２２０に進む。ステップ２２０では、ノード１′とノード２′を引数として処理２を呼び出す。処理２は再帰構造となっており、全ての処理２が終了すると、処理２から処理１に戻り、処理１を終了する。
【００６７】
図２２は、２つのサンプルソースコードに対し、変数依存関係比較部２０１が図２１の処理フローに沿って２つの変数依存関係の差分を解析し、変数依存関係出力部１６が表示した例である。ソースコード２２１とソースコード２２２は関数ｆ７を記述しており、それぞれ第１版、第２版である。変数依存関係２２３はソースコード２２１について、変数依存関係２２４はソースコード２２２について、実行開始点をｆ７として導出したデータの有向グラフである。ソースコード２２１からソースコード２２２へは、５行目がｃ＝ｂからｃ＋＝ｂに変更されている。変数依存関係比較部２０１は、変数依存関係２２４のｃ（Ｌ５＠ｆ７）ｕｓｅについて差異ありと判定し、それ以外の変数依存関係２２４のノードと、変数依存関係２２３の全ノードについては、差異なしと判定する。変数依存関係出力部１６は、変数依存関係２２４のｃ（Ｌ５＠ｆ７）ｕｓｅには他ノードとは異なる色を付けて表示し、ユーザに対し変数依存関係の差分を視覚的に区別しやすく表示する。
【００６８】
図２３は、図２２とは異なる２つのサンプルソースコードに対し、図２２と同様に解析と表示を行った例である。ソースコード２３１とソースコード２３２は関数ｆ８を記述しており、それぞれ第１版、第２版である。変数依存関係２３３はソースコード２３１について、変数依存関係２３４はソースコード２３２について、実行開始点をｆ８として導出したデータの有向グラフである。ソースコード２３２はソースコード２３１に対し、６行目に空行が挿入されている。この変更により、変数依存関係２３３のｃ（Ｌ６＠ｆ８）、ｄ（Ｌ６＠ｆ８）が、変数依存関係２３４ではｃ（Ｌ７＠ｆ８）、ｄ（Ｌ７＠ｆ８）と記載位置情報が変化している。しかし、変数依存関係比較部２０１は２つの変数依存関係２３３、２３４の全ノードについて差異なしと判定する。実際、ソースコード２３１とソースコード２３２では処理内容に差異が無く、このことは変数依存関係２３３、２３４にて変数の位置情報以外に差異がないことから、ユーザにとって視覚的に理解しやすくなっている。
【００６９】
以上のように、２つのソースコードから変数依存関係を抽出し、変数の位置情報を無視した上で差分を比較し表示することにより、ソフトウェアの構成や処理概要の差異を変数依存関係の観点からユーザに提供することができる。これにより、設計者や検証者がソフトウェアの構造や処理概要を理解することを容易にすることができる。
【００７０】
［実施例４］
本実施例では、本発明の変数依存関係解析結果を用いて、ソースコードのスライシングおよびモデル検査を行う。変数依存関係の解析方法については、実施例１から３と共通するため説明を省略する。スライシングとは、ある変数に影響を与えるソースコードの記載のみを抽出し、当該変数に影響を与えないソースコードの記載を削除する処理を意味する。モデル検査とは、検証の対象となるソフトウェアが実際に動作する際（ソフトウェアが機器を制御する制御ソフトウェアの場合は、ソフトウェアが動作するハードウェアや制御対象機器との複合動作を想定）の取り得る状態を網羅的に探索し、不具合を発見することを意味する。
【００７１】
スライシングでは、抽出の始点となるステートメントと、終点となるステートメントおよびそのステートメント内の変数を、「スライシング基準」として指定する必要がある。
【００７２】
本実施例ではスライシング基準として、変数選択部１２２にてユーザにより選択された変数とその変数が含まれるステートメントを終点、変数依存関係出力部１６によって表示された変数依存関係のうち、末端またはユーザによって選択された変数の含まれるステートメントを始点に設定し、スライシングを行う。これにより、ユーザが検証したい変数（以下では「検証点」と呼ぶ）を変数選択部１２２にて指定することで、モデル検査の対象となるソースコードを検証点に関連する部分にのみ絞ることができ、モデル検査の際の状態爆発を回避できる。またユーザは、終点のステートメントに依存関係のあるステートメントを始点に選択することができるため、確実に検証点に関連するコードを抽出することができる。そのほか、変数依存関係出力部１６の表示にて始点に選択した変数が、モデル検査の際、ソフトウェアと外部環境（ハードウェアや制御対象機器など）との境界になるため、ユーザは外部環境モデルとのインタフェースが用意に判別でき、外部環境についてモデルの作成や既存モデルからの選択が容易になる。
【００７３】
図２６は、サンプルコードに対して本発明のスライシングを行った例である。ソースコード出力部１７はソースコード２６１を表示しているが、この段階では変数選択部１２２にて変数は選択されておらず、スライシングも行われていない。
【００７４】
次に変数選択部１２２にてユーザにより変数ｃが選択されると、変数依存関係出力部１６に変数依存関係２６４が表示され、ソースコード出力部１７にはソースコード２６２が表示される。ソースコード２６２では、５行目のｙ＝ｘ、７行目のｚ＝ｙにハッチングが掛けられている。これは変数ｘ，ｙ，ｚが変数依存関係２６４に含まれないため、スライシングにて除外されるコードであることを示している。この段階でユーザがソースコード出力部１７にファイル出力を指示すると、５行目と７行目が削除されたソースコードがファイル出力される。
【００７５】
ソースコード２６２の表示や、スライシングされたソースコードのファイル出力においては、構文解析部１２による構文木データが利用される。ソースコード出力部１７は、構文木データの各構文ノードについて、その構文に含まれる変数が、変数依存関係２６４に含まれれば当該構文はスライシングで残り、含まれなければ除外されると判定する。
【００７６】
次に変数依存関係出力部１６にて、ユーザがｂ（Ｌ４＠ｆ９）に対し、スライシングにて除外する指定を行う。すると変数依存関係出力部１６の表示にて、変数依存関係２６５のように、ｂ（Ｌ４＠ｆ９）とその下位のａ（Ｌ４＠ｆ９）は除外された表示となる。また、ソースコード出力部１７において、ソースコード２６３が表示される。ソースコード２６３では、さらに４行目のｂ＝ａが削除された表示となっている。これは、ユーザによるｂ（Ｌ４＠ｆ９）の除外指定の影響を示すものである。この場合、ｂ（Ｌ９＠ｆ９）がスライシングの始点の変数として選択されたことになる。この段階でユーザがソースコード出力部１７にファイル出力を指示すると、４，５，７行目が削除されたソースコードがファイル出力される。
【００７７】
以上のようにして抽出されたソースコードに対し、ソースコード出力部１７は、必要であれば構文木データと規定の変換ルールを用いてモデル検査用の言語に変換して、モデル検査器に入力することで、検証点に関係するソースコードが動作するときに取り得る状態が網羅的に探索される。モデル検査器に対し、ユーザは検査対象のソースコードが取ってはいけない状態をプロパティやアサーションとして指定し、必要であれば外部環境モデルを付与することで、不具合を発見することができる。
【符号の説明】
【００７８】
１１  ファイル入力部
１２  構文解析部
１３  関数抽出部
１４  実行開始点選択部
１５  変数依存関係解析部
１６  変数依存関係出力部
１７  ソースコード出力部
１２３  変数依存関係抽出部
２０１  変数依存関係比較部
【図１】
0005775829.tif 000002
【図２】
0005775829.tif 000003
【図３】
0005775829.tif 000004
【図４】
0005775829.tif 000005
【図５】
0005775829.tif 000006
【図６】
0005775829.tif 000007
【図７】
0005775829.tif 000008
【図８】
0005775829.tif 000009
【図９】
0005775829.tif 000010
【図１０】
0005775829.tif 000011
【図１１】
0005775829.tif 000012
【図１２】
0005775829.tif 000013
【図１３】
0005775829.tif 000014
【図１４】
0005775829.tif 000015
【図１５】
0005775829.tif 000016
【図１６】
0005775829.tif 000017
【図１７】
0005775829.tif 000018
【図１８】
0005775829.tif 000019
【図１９】
0005775829.tif 000020
【図２０】
0005775829.tif 000021
【図２１】
0005775829.tif 000022
【図２２】
0005775829.tif 000023
【図２３】
0005775829.tif 000024
【図２４】
0005775829.tif 000025
【図２５】
0005775829.tif 000026
【図２６】
0005775829.tif 000027