(57)【要約】【課題】ソースコードに含まれる大域変数に対する参照、代入について、詳細な解析結果を提供する。【解決手段】ソースコード解析装置１が、ソースコード２１に含まれる大域変数のアドレスの局所変数への代入、いずれかのアドレスを格納した関数の引数の局所変数への代入、大域変数のアドレスが格納されている局所変数の他の局所変数への代入、いずれかのアドレスを格納した関数の引数が格納されている局所変数の他の局所変数への代入等を抽出して解析することで、大域変数の名前のみに基づく解析よりも、大域変数に対する参照、代入について、詳細な解析を行うことができる。【選択図】図１
2010191598.tif 000002
【特許請求の範囲】
【請求項１】
大域変数及び局所変数が含まれるプログラムコードを解析対象プログラムコードとして指定するからコード指定部と、
前記コード指定部により指定された解析対象プログラムコードに対する解析を行い、大域変数のアドレスの局所変数への代入と、いずれかのアドレスを格納する引数の局所変数への代入と、大域変数のアドレスを格納する局所変数の他の局所変数への代入と、いずれかのアドレスを格納する引数を格納する局所変数の他の局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出するコード解析抽出部と、
前記コード解析抽出部の抽出結果を記憶する抽出結果記憶部とを有することを特徴とする情報処理装置。
【請求項２】
前記コード解析抽出部は、
大域変数を格納する局所変数の参照と、いずれかのアドレスを格納する引数を格納する局所変数の参照を前記解析対象プログラムコードから抽出することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記コード解析抽出部は、
大域変数のアドレスを代入した局所変数を介した大域変数又は局所変数の参照と、
いずれかのアドレスを格納する引数を代入した局所変数を介した大域変数又は局所変数の参照と、
大域変数のアドレスを格納する局所変数を代入した局所変数を介した大域変数又は局所変数の参照と、
いずれかのアドレスを格納する引数を格納する局所変数を代入した局所変数を介した大域変数又は局所変数の参照の少なくともいずれかを前記解析対象プログラムコードから抽出することを特徴とする請求項１又は２に記載の情報処理装置。
【請求項４】
前記コード解析抽出部は、
大域変数のアドレスを代入した局所変数を介した大域変数又は局所変数への代入と、
いずれかのアドレスを格納する引数を代入した局所変数を介した大域変数又は局所変数への代入と、
大域変数のアドレスを格納する局所変数を代入した局所変数を介した大域変数又は局所変数への代入と、
いずれかのアドレスを格納する引数を格納する局所変数を代入した局所変数を介した大域変数又は局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出することを特徴とする請求項１〜３のいずれかに記載の情報処理装置。
【請求項５】
前記コード解析抽出部は、
いずれかのアドレスを格納する引数の参照を前記解析対象プログラムコードから抽出することを特徴とする請求項１〜４のいずれかに記載の情報処理装置。
【請求項６】
前記コード解析抽出部は、
いずれかのアドレスを格納する引数を介した大域変数の参照と、いずれかのアドレスを格納する引数を介した局所変数の参照の少なくともいずれかを前記解析対象プログラムコードから抽出することを特徴とする請求項１〜５のいずれかに記載の情報処理装置。
【請求項７】
前記コード解析抽出部は、
いずれかのアドレスを格納する引数を介した大域変数への代入と、いずれかのアドレスを格納する引数を介した局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出することを特徴とする請求項１〜６のいずれかに記載の情報処理装置。
【請求項８】
前記コード解析抽出部は、
大域変数の参照と、大域変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出することを特徴とする請求項１〜７のいずれかに記載の情報処理装置。
【請求項９】
前記コード解析抽出部は、
前記解析対象プログラムコードに関数呼び出しが含まれている場合に、
前記関数呼び出しに関連する仮引数と実引数を抽出し、抽出した抽出仮引数と抽出実引数とを対応付け、呼び出し対象の関数のプログラムコードを解析し、抽出仮引数の参照と、抽出仮引数への代入と、抽出仮引数の値を代入した局所変数の参照と、抽出仮引数の値を代入した局所変数の他の局所変数への代入の少なくともといずれかを抽出し、抽出結果を、抽出仮引数と抽出実引数に対応付けることを特徴とする請求項１〜８のいずれかに記載の情報処理装置。
【請求項１０】
前記コード指定部は、
前記解析対象プログラムコードに関数呼び出しが含まれている場合に、呼び出し対象の関数が含まれているプログラムコードを識別し、当該プログラムコードを新たな解析対象プログラムコードとして指定し、
前記コード解析抽出部は、
前記コード指定部により新たな解析対象プログラムコードが指定された場合に、それまで解析を行っていた解析対象プログラムコードに対する解析を中断し、前記新たな解析対象プログラムコードに対する解析を開始し、前記新たな解析対象プログラムコードに対する解析が終了した際に、前記新たな解析対象プログラムコードの前に解析を行っていた解析対象プログラムコードに対する解析を再開することを特徴とする請求項１〜９のいずれかに記載の情報処理装置。
【請求項１１】
前記コード解析抽出部は、
大域変数と、アドレスを格納する実引数に記述されている変数と、アドレスを格納する実引数に対応する仮引数に記述されている変数と、宣言文に含まれている変数を検査対象変数とし、
検査対象変数の参照と、検査対象変数への代入と、検査対象要素を介した他の変数への代入と、他の変数への検査対象変数の代入の少なくともといずれかが前記解析対象プログラムコードに含まれているか否かを検査して抽出処理を行うことを特徴とする請求項１〜１０のいずれかに記載の情報処理装置。
【請求項１２】
前記コード解析抽出部は、
他の変数へ検査対象変数が代入されている場合に、当該他の変数がアドレスを格納する変数であるかを判断し、当該他の変数がアドレスを格納する変数である場合に当該他の変数を検査対象変数とすることを特徴とする請求項１１に記載の情報処理装置。
【請求項１３】
前記コード解析抽出部は、
前記解析対象プログラムに静的変数が含まれている場合に、静的変数を検査対象変数に含ませることを特徴とする請求項１１又は１２に記載の情報処理装置。
【請求項１４】
前記コード解析抽出部は、
前記解析対象プログラムコードを解析して、前記解析対象プログラムコードの構文木と記号表を生成し、生成した構文木と記号表を用いて抽出処理を行うことを特徴とする請求項１〜１３のいずれかに記載の情報処理装置。
【請求項１５】
前記コード解析抽出部は、
前記コード指定部による解析対象プログラムコードの指定前に複数のプログラムコードを解析し、各プログラムコードの構文木と記号表を生成し、
前記コード指定部により解析対象プログラムコードが指定された際に、解析対象プログラムコードの構文木と記号表を用いて抽出処理を行うことを特徴とする請求項１〜１４のいずれかに記載の情報処理装置。
【請求項１６】
前記コード解析抽出部は、
他のプログラムコードについての以前の抽出結果を用いて、前記解析対象プログラムコードについての抽出処理を行うことを特徴とする請求項１〜１５のいずれかに記載の情報処理装置。
【請求項１７】
前記コード解析抽出部は、
抽出結果を示す抽出結果情報を生成し、
前記情報処理装置は、更に、
前記抽出結果情報と、前記解析対象プログラムコードとを併せて表示する表示部を有することを特徴とする請求項１〜１６のいずれかに記載の情報処理装置。
【請求項１８】
前記表示部は、
前記抽出結果情報を用いて、前記解析対象プログラムコードに含まれる特定の変数が記述されているプログラム文及び前記特定の変数の伝播状況の少なくともいずれかを表示することを特徴とする請求項１７に記載の情報処理装置。
【請求項１９】
コンピュータが、大域変数及び局所変数が含まれるプログラムコードを解析対象プログラムコードとして指定するからコード指定ステップと、
前記コンピュータが、前記コード指定ステップにより指定された解析対象プログラムコードに対する解析を行い、大域変数のアドレスの局所変数への代入と、いずれかのアドレスを格納する引数の局所変数への代入と、大域変数のアドレスを格納する局所変数の他の局所変数への代入と、いずれかのアドレスを格納する引数を格納する局所変数の他の局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出するコード解析抽出ステップと、
前記コンピュータが、前記コード解析抽出ステップの抽出結果を記憶する抽出結果記憶ステップとを有することを特徴とする情報処理方法。
【請求項２０】
大域変数及び局所変数が含まれるプログラムコードを解析対象プログラムコードとして指定するからコード指定処理と、
前記コード指定処理により指定された解析対象プログラムコードに対する解析を行い、大域変数のアドレスの局所変数への代入と、いずれかのアドレスを格納する引数の局所変数への代入と、大域変数のアドレスを格納する局所変数の他の局所変数への代入と、いずれかのアドレスを格納する引数を格納する局所変数の他の局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出するコード解析抽出処理と、
前記コード解析抽出処理の抽出結果を記憶する抽出結果記憶処理とをコンピュータに実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムコードを解析する技術に関する。
【背景技術】
【０００２】
コンピュータシステムでは、高速化、高性能化の要求が強まっている。この要求に対して、プロセッサ単体の高性能化の他に、複数のプロセッサを用いてプログラムを並列動作させることで、処理時間の短縮、すなわち高速化を実現するといった取り組みがなされている。
【０００３】
プログラムを並列動作させるにあたり、プログラム内の複数箇所で同じデータにアクセスすると、そのアクセス順序によってはプログラムが想定外の動作となるといった問題がある。
【０００４】
この点、特許文献１では、割り込み禁止命令を用いた大域変数へのアクセス順序制御を行う場合に、プログラムのソースコードを解析し、割り込み禁止命令が適切に記述されているか検査することにより、大域変数の干渉を判断し、人手によるチェックの工数削減を実現している。
【０００５】
また、プログラムの並列化を自動的に行うといった取り組みも多数なされている。
特許文献２では、プログラムの並列化を２パスで行い、ソースコード中の関数呼び出しを検出した際に、第１のパスにおいて生成された各関数内で使用される大域変数の情報を参照することにより、大域変数への参照や代入の順序関係から関数呼び出しの並列実行の可否を判定し、関数呼び出しの前後のプログラム部分及び呼び出された関数同志の並列化の解析を行っている。
さらに、特許文献３では、オブジェクト指向言語を対象として、クラスメンバの情報を考慮することにより、効率の良い並列化を行っている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００３−２４１９９７号公報
【特許文献２】特開平５−１４３３５７号公報
【特許文献３】特開２００４−１３１８４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、上述した従来技術では、大域変数名、もしくはクラスのメンバ変数名に基づいた割り込み禁止命令のチェック、もしくは並列化を行っているため、大域変数のアドレスを格納した変数を経由して行われる大域変数の参照（読み込み）、もしくは大域変数への代入（書き込み）を解析できない。
比較的規模の大きなプログラムでは、機能の共通化等を目的として、大域変数名等を関数定義の中に直接記述せず、引数で与えられたアドレスに対する参照や代入を行う場合がある。
このような記述をしているソースコードの場合、上述した従来技術では、アドレスが代入された引数を対象とした解析ができないため、割り込み禁止の検査については検出漏れが発生し、自動並列化については該当箇所が並列化対象から外れてしまい並列度が上がらないなど、結果としてそれぞれの目的を達成できないという課題がある。
【０００８】
本発明は、上記に鑑みてなされたものであり、大域変数のアドレスを格納する処理を検出し、格納された変数を用いた大域変数の参照、代入を解析対象とすることで、大域変数の名前のみに基づく解析よりも、大域変数に対する参照、代入について、詳細な解析結果を提供することを主な目的とする。
また、本発明は、上述の解析結果を用いて、大域変数とそのアドレスが格納された変数との関係を視覚的に表示することを主な目的とする。
【課題を解決するための手段】
【０００９】
本発明に係る情報処理装置は、
大域変数及び局所変数が含まれるプログラムコードを解析対象プログラムコードとして指定するからコード指定部と、
前記コード指定部により指定された解析対象プログラムコードに対する解析を行い、大域変数のアドレスの局所変数への代入と、いずれかのアドレスを格納する引数の局所変数への代入と、大域変数のアドレスを格納する局所変数の他の局所変数への代入と、いずれかのアドレスを格納する引数を格納する局所変数の他の局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出するコード解析抽出部と、
前記コード解析抽出部の抽出結果を記憶する抽出結果記憶部とを有することを特徴とする。
【発明の効果】
【００１０】
本発明によれば、大域変数のアドレスを格納する処理を検出し、格納された変数を用いた大域変数の参照、代入を解析対象とすることで、大域変数の名前のみに基づく解析よりも、大域変数に対する参照、代入について、詳細な解析結果を提供することができる。
【図面の簡単な説明】
【００１１】
【図１】実施の形態１におけるソースコード解析装置１を備える解析システムの機能ブロック図。
【図２】構文木１６０を構成するノード１６００の構造の一例を示す図。
【図３】記号表１６１の構造の一例を示す図。
【図４】引数関連情報１６２の構造の一例を示す図。
【図５】関数定義ファイルリスト２０の構造の一例を示す図。
【図６】ソースコード２１ａ、ソースコード２１ｂ、ソースコード２１ｃを示す図。
【図７】解析結果２２の構造の一例を示す図。
【図８】入力部１０の動作を示すフローチャート。
【図９】ソースファイル特定部１１の動作を示すフローチャート。
【図１０】実施の形態１おけるソースコード展開部１２の動作を示すフローチャート。
【図１１】引数関連情報設定部１３の動作を示すフローチャート。
【図１２】解析部１４の動作を示すフローチャート。
【図１３】解析部１４による宣言の解析動作を示すフローチャート。
【図１４】解析部１４による代入文の解析動作を示すフローチャート。
【図１５】解析部１４による関数呼び出しの解析動作を示すフローチャート。
【図１６】表示部１５の動作を示すフローチャート。
【図１７】解析結果２２を木構造状に示した図。
【図１８】解析結果２２を木構造状に示し、特定の関数の内部動作を表示した図。
【図１９】解析結果２２を用いて、縦軸に着目する変数を１つ選択し、横軸に解析開始関数から呼び出される関数を並べて、アドレスの代入、着目変数への代入を実行順序に従い表示した図。
【図２０】実施の形態２におけるソースコード解析装置１を備える解析システムの機能ブロック図。
【図２１】実施の形態２で用いる関数定義ファイルリスト２０の構造の一例を示す図。
【図２２】実施の形態２におけるソースコード展開部１２による展開済データ２３作成の動作を示すフローチャート。
【図２３】実施の形態２におけるソースコード展開部１２による展開済データ２３読み込みの動作を示すフローチャート。
【図２４】ソースコードの例を示す図。
【図２５】ソースコード解析装置のハードウェア構成例を示す図。
【発明を実施するための形態】
【００１２】
実施の形態１．
この実施の形態では、大域変数の参照、代入について、詳細な情報の提供を可能としたソースコード解析装置について説明する。
【００１３】
まず、本実施の形態に係るソースコード解析装置の動作の概要を説明した後に、本実施の形態に係るソースコード解析装置の構成例及び動作の詳細を説明する。
【００１４】
ソースコード解析装置は、プログラミング言語で記述されたソースコード（プログラムコード）を解析して、ソースコードに含まれる以下の＜Ａ＞〜＜Ｉ＞の各要素を抽出する。
＜Ａ＞大域変数の参照
＜Ｂ＞大域変数への代入
＜Ｃ＞いずれかのアドレスを格納した引数の参照
＜Ｄ＞局所変数への
（１）大域変数のアドレスの代入
（２）いずれかのアドレスを格納した関数の引数の代入
（３）大域変数のアドレスが格納されている局所変数の代入
（４）いずれかのアドレスを格納した関数の引数が格納されている局所変数の代入
＜Ｅ＞
（１）大域変数のアドレスが格納されている局所変数の参照
（２）いずれかのアドレスを格納する引数が格納されている局所変数の参照
＜Ｆ＞上記＜Ｄ＞の局所変数を介した、大域変数もしくは局所変数の参照
＜Ｇ＞上記＜Ｄ＞の局所変数を介した、大域変数もしくは局所変数への代入
＜Ｈ＞いずれかのアドレスを格納する関数の引数を介した、大域変数もしくは局所変数の参照
＜Ｉ＞いずれかのアドレスを格納する関数の引数を介した、大域変数もしくは局所変数への代入
【００１５】
例えば、本実施の形態に係るソースコード解析装置が、図２４に例示するソースコードを解析対象とした場合には、ｇを大域変数としてソースコードを解析し、図２４のコメントに示しているように上記の＜Ａ＞〜＜Ｉ＞が抽出される。
なお、図２４のソースコード例は、Ｃ言語で記述されたものである。
本実施の形態では、ソースコード解析装置は、ソースコードの構文木と記号表を生成し、構文木と記号表を用いてソースコードを解析して上記の＜Ａ＞〜＜Ｉ＞を抽出し、抽出結果を記憶する。
なお、構文木と記号表の生成は必須ではなく、構文木と記号表を用いずにソースコードを解析するようにしてもよい。
【００１６】
また、解析対象のソースコードに関数呼び出しが含まれている場合は、ソースコード解析装置は、関数呼び出しに関連する仮引数と実引数を抽出し、抽出した抽出仮引数と抽出実引数とを対応付け、呼び出し対象の関数のソースコードを解析し、抽出仮引数の参照と、抽出仮引数への代入と、抽出仮引数の値を代入した局所変数の参照と、抽出仮引数の値を代入した局所変数の他の局所変数への代入の少なくともといずれかを抽出し、抽出結果を、抽出仮引数と抽出実引数に対応付ける。
また、ソースコード解析装置は、呼び出し対象の関数が含まれているソースコードを識別し、当該ソースコードを新たな解析対象ソースコードとして指定するとともに、それまで解析を行っていた解析対象ソースコードに対する解析を中断し、新たな解析対象ソースコードに対する解析を開始し、新たな解析対象ソースコードに対する解析が終了した際に、新たな解析対象ソースコードの前に解析を行っていた解析対象ソースコードに対する解析を再開する。
【００１７】
また、ソースコード解析装置は、ソースコードの解析において、大域変数と、アドレスを格納する実引数に記述されている変数と、アドレスを格納する実引数に対応する仮引数に記述されている変数と、宣言文に含まれている変数が出現した場合には、これら変数を検査リストに入れる。このように検査リストに入れた変数を検査対象変数と呼ぶ。
そして、検査対象変数の参照と、検査対象変数への代入（代入文において検査対象変数が左辺）と、検査対象要素を介した他の変数への代入（代入文において他の変数が左辺）と、他の変数への検査対象変数の代入（代入文において他の変数が左辺、検査対象変数が右辺）の少なくともといずれかが解析対象ソースコードに含まれているか否かを検査して抽出処理を行う。
また、ソースコード解析装置は、他の変数へ検査対象変数が代入されている場合（代入文において他の変数が左辺、検査対象変数が右辺）に、当該他の変数がアドレスを格納する変数であるかを判断し、当該他の変数がアドレスを格納する変数である場合に当該他の変数を検査リストに入れて検査対象変数とする。
【００１８】
そして、ソースコード解析装置は、抽出した＜Ａ＞〜＜Ｉ＞の各々に対して、変数名、抽出元のソースファイル名、行番号、呼出階層、操作種別（参照／代入の別）、設定値をリスト化して、ソースコード解析装置のユーザに提示する。
【００１９】
次に、本実施の形態に係るソースコード解析装置１を備える解析システムの機能ブロックを図１に示す。
【００２０】
解析システムは、ソースコード解析装置１（情報処理装置）及び記憶装置２を備える。
ソースコード解析装置１は、大域変数の参照・代入について、詳細な解析結果を提供することを可能とした装置であり、動作の詳細については後述する。
記憶装置２は、例えばＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）等の不揮発性記憶装置である。
記憶装置２は、ソースコード解析装置１への入力となるデータ、およびソースコード解析装置１からの出力を蓄積する。
【００２１】
ソースコード解析装置１は、入力部１０、ソースファイル特定部１１、ソースコード展開部１２、引数関連情報設定部１３、解析部１４、表示部１５、一時記憶部１６を備える。
【００２２】
入力部１０は、解析システムの使用者からの入力を受け付ける機能であり、この入力に基づき、ソースコード解析装置１を用いて解析する関数を決定したり、解析結果の表示形式を決定したりする。
【００２３】
ソースファイル特定部１１は、入力部１０、もしくは解析部１４から渡される解析対象関数、および関数定義ファイルリスト２０に基づき、解析に用いるソースコード２１を決定する。
ソースファイル特定部１１は、コード指定部の例である。また、ソースファイル特定部１１により行われる処理がコード指定ステップとなる。
【００２４】
ソースコード展開部１２は、ソースファイル特定部１１が決定したソースコード２１から構文木１６０、および記号表１６１を作成し、一時記憶部１６に格納する。
引数関連情報設定部１３は、ソースコード展開部１２が一時記憶部１６に格納した構文木１６０、および記号表１６１に基づき、解析対象関数の仮引数と実引数との対応関係を引数関連情報１６２として一時記憶部１６に格納する。
解析部１４は、ソースコード展開部１２が一時記憶部１６に格納した構文木１６０、および記号表１６１に基づき、大域変数と、大域変数のアドレスが格納されている局所変数と、関数の引数を用いた大域変数、に対する参照、代入を解析結果２２に出力し、引数関連情報１６２にある仮引数を用いた大域変数に対する参照、代入等の動作を、引数関連情報１６２に記録する。また、関数呼び出しの記述がある場合は、記述された関数に対する解析を先に実行し、解析結果２２に出力する。
これらソースコード展開部１２、引数関連情報設定部１３及び解析部１４は、コード解析抽出部の例である。また、ソースコード展開部１２、引数関連情報設定部１３及び解析部１４は、コード解析抽出部により行われる処理がコード解析抽出ステップとなる。
【００２５】
表示部１５は、解析結果２２を入力部１０にて指定された形式で表示する。
一時記憶部１６は、例えばＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）等の揮発性記憶装置であり、構文木１６０、記号表１６１、引数関連情報１６２、階層値１６３、解析結果１６４を一時的に格納する。
解析結果１６４は、ソースコード解析装置１がソースコードを解析中の中間段階の解析結果である。
解析部１４は、解析結果２２に反映させる上記の＜Ａ＞〜＜Ｉ＞を抽出する度に、逐次解析結果１６４に抽出結果を蓄積し、解析結果１６４を記憶装置２に移して解析結果２２とするが、説明が煩雑になるのを避けるため、以下では、解析部１４は解析結果２２に抽出結果を蓄積するものとして説明する。
一時記憶部１６は、抽出結果記憶部の例である。また、一時記憶部１６による解析結果１６４の記憶処理が抽出結果記憶ステップとなる。
【００２６】
なお、上記の説明ではソースコード解析装置１と記憶装置２を個々の分かれた装置としたが、これらが１つの装置として構成されていてもよい。
また、上記の説明では、表示部１５をソースコード解析装置１の中に含むとしているが、ソースコード解析装置１とは別の装置（例えば「表示装置」）であっても構わない。
【００２７】
次に、構文木１６０について説明する。
図２は構文木１６０を構成するノード１６００の構造を示す図である。
ノード１６００はノード種別１６０１、構文規則番号１６０２、行番号１６０３、値種別１６０４、ノード値１６０５を備える。
ノード種別１６０１は、構文規則を構成する終端記号（ソースコード上に出現する識別子、演算子、特殊記号等）もしくは非終端記号（ソースコードには出現せず、特定の終端記号の集合を表すもの）を識別するための情報である。
構文規則番号１６０２は、非終端記号に関する構文規則を一意に特定するための番号である。例えば、ある非終端記号が親ノードとなる木構造に対応する構文規則が２つあるとした場合、構文規則番号１６０２に０、１のどちらかを入れることで、該当する構文規則を特定できる。
行番号１６０３はそれぞれの終端記号について、ソースコード上の出現位置を意味する番号である。
値種別１６０４は、ノード値１６０５の種類を識別するための情報である。
ノード値１６０５は、ノード種別１６０１が非終端記号に属する場合、子ノードの個数と子ノードへの接続情報である。また、ノード種別１６０１が記号表１６１に格納される識別子の場合、ノード値１６０５は、記号表の該当する情報への接続情報である。また、ノード種別１６０１が識別子以外の終端記号の場合、ノード値１６０５は、ソースコードに出現する予約語、特殊文字等の文字列である。
【００２８】
記号表１６１について説明する。
図３は記号表１６１の構造を示す図である。
記号表１６１には、識別子の数だけ識別子名１６１０、識別子種別１６１１、型指定子情報１６１２、宣言子情報１６１３、初期化子情報１６１４が存在する。すなわち、記号表１６１は、１つ以上の識別子名１６１０、識別子種別１６１１、型指定子情報１６１２、宣言子情報１６１３、初期化子情報１６１４から構成される組を備える。
識別子名１６１０は、ソースコードに出現した識別子の名前である。
識別子種別１６１１は、識別子の種類を表す情報である。識別子種別１６１１に格納する値は、例えば、大域変数、静的変数、引数、局所変数等を意味する値である。
型指定子情報１６１２は、識別子名１６１０の型指定子に関する情報である。具体的には、型指定子という名前の非終端記号に対応するノードをルートとする構文木１６０の部分木に出現する終端記号、すなわち型名等の記述となる。
宣言子情報１６１３は、識別子名１６１０の宣言子に関する情報である。具体的には、宣言子という名前の非終端記号に対応するノードをルートとする構文木１６０の部分木に出現する終端記号、すなわち変数宣言の場合は変数名、関数宣言の場合は関数名と引数リスト、等の記述となる。
初期化子情報１６１４は、識別子名１６１０の初期化子に関する情報である。具体的には、初期化子という名前の非終端記号に対応するノードをルートとする構文木１６０の部分木に出現する終端記号、すなわち代入する値の記述となる。図３では、大域変数ｇＶａｌのみに対して「２０」と記述されており、大域変数ｇＶａｌが宣言と同時に２０という値で初期化されることを意味する。
なお、説明のため、図３では記号表１６１の型指定子情報１６１２、宣言子情報１６１３、初期化子情報１６１４の欄に型名、もしくは初期化値等を直接記述したが、構文木１６０の該当するノード１６００への接続情報を格納してもよい。
【００２９】
引数関連情報１６２について説明する。
図４は引数関連情報１６２の構造を示す図である。
引数関連情報１６２には、引数の数だけ実引数１６２０、仮引数１６２１、初期設定１６２２、操作種別１６２３が存在する。
すなわち、引数関連情報１６２は、０個以上の実引数１６２０、仮引数１６２１、初期設定１６２２、操作種別１６２３から構成される組を備える。なお、引数のない関数の呼び出しの場合は、実引数１６２０、仮引数１６２１、初期設定１６２２、操作種別１６２３から構成される組の個数が０個となる。
実引数１６２０は、ソースコード２１に記述された関数呼び出しにある引数である。
仮引数１６２１は、ソースコード２１に記述された関数定義、もしくは関数プロトタイプ宣言に記述されている引数である。
初期設定１６２２は、実引数１６２０に代入されている値である。図４では、ｇＶａｌという名前の変数のアドレスを格納しているため、初期設定１６２２には「＆ｇＶａｌ」と先頭に「＆」をつけている。
操作種別１６２３は仮引数１６２１を用いた処理の種類を表す情報である。
【００３０】
階層値１６３について説明する。
階層値１６３は、ソースコード解析装置１による解析における、解析を開始する関数から、現在解析している関数に到達するまでの関数呼び出しの回数を示す値である。
【００３１】
関数定義ファイルリスト２０について説明する。
図５は関数定義ファイルリスト２０の構造を示す図である。関数定義ファイルリスト２０には、ソースコード解析装置１による解析に用いる１つ以上のソースコード２１で定義されている関数の数だけ、関数名２００、ソースファイル名２０１が存在する。
すなわち、関数定義ファイルリスト２０は、１つ以上の関数名２００、ソースファイル名２０１から構成される組を備える。
関数名２００は、ソースコード２１に記述された関数定義における関数の名前である。
ソースファイル名２０１は、関数名２００の関数定義が記述されているファイルの名前である。
【００３２】
ソースコード２１について説明する。
図６はこの実施の形態の説明に用いるソースコード２１を示す図である。
ソースコード２１はＣ言語で記述されたプログラムである。
図６には、３つのソースコード２１ａ、ソースコード２１ｂ、ソースコード２１ｃが示されており、ファイル名はそれぞれ、／ｓｒｃ／ｆｕｎｃＡ．ｃ、／ｓｒｃ／ｆｕｎｃＢ．ｃ、／ｓｒｃ／ｆｕｎｃＣ．ｃである。
ソースコード２１ａには大域変数ｇＶａｌの宣言と関数ｆ１の定義が記述されている。
ソースコード２１ｂには関数ｆ２の定義が記述されている。
ソースコード２１ｃには関数ｆ３の定義が記述されている。
なお、図６には示していないが、関数ｆ１における関数ｆ２の呼び出し、および、関数ｆ２における関数ｆ３の呼び出しが可能なように、各ソースコードには関数プロトタイプ宣言が記述されているものとする。
なお、この実施の形態ではＣ言語で記述されたソースコードを例として説明するが、他の言語を対象とすることも可能である。
【００３３】
解析結果２２について説明する。
図７は解析結果２２の構造を示す図である。
解析結果２２には、解析対象となる変数に対する操作の回数だけ、変数名２２０、ソースファイル名２２１、行番号２２２、呼出階層２２３、操作種別２２４、設定値２２５が存在する。すなわち、解析結果２２は、１つ以上の変数名２２０、ソースファイル名２２１、行番号２２２、呼出階層２２３、操作種別２２４、設定値２２５から構成される組を備える。
変数名２２０は操作された変数の名前である。
ソースファイル名２２１は、変数名２２０により特定される変数への操作が記述されたファイルの名前である。
行番号２２２は、ソースファイル名２２１のファイルにおける、変数名２２０により特定される変数への操作の記述位置を示す情報である。
呼出階層２２３は、関数呼び出しの深さを示す情報である。
操作種別２２４は、変数名２２０により特定される変数への操作の種類を示す情報であり、格納する情報の種類は操作種別１６２３と同じである。なお、図７の操作種別２２４では「Ｓｅｔ」「Ｒｅａｄ」「Ｗｒｉｔｅ」が各欄に１つずつ格納されているが、同時に複数の情報を保持することもできる。
設定値２２５は、変数名２２０により特定される変数そのもの、もしくは前記変数がアドレスを保持している場合はそのアドレスが指す変数、に対して設定された値である。前記変数に対する値の設定が発生しない操作の場合、設定値２２５は空である。
【００３４】
以上で説明した図１から図７までと、以下の図８から図１９までに基づき、この実施の形態におけるソースコード解析装置１の動作を詳細に説明する。
【００３５】
まず、この実施の形態における、入力部１０の動作である初期化処理について、図１、図４、図８に基づき説明する。
図８は、この実施の形態における、解析システムの使用者から入力を受けた入力部１０の動作を示すフローチャートである。
【００３６】
（Ｓ１００）：入力部１０は、解析システムの使用者から解析を開始する関数を渡されると、初期化処理を開始する。
（Ｓ１０１）：入力部１０は、階層値１６３に０を設定する。この動作は階層値１６３の初期化に相当する。
（Ｓ１０２）：入力部１０は、解析結果２２を開く。
（Ｓ１０３）：入力部１０は、Ｓ１００にて取得した関数名と、空の引数関連情報をソースファイル特定部１１に渡す。空の引数関連情報とは、実引数１６２０、仮引数１６２１、初期設定１６２２、操作種別１６２３の組を１つも持たないこと引数関連情報１６２であることを意味する。
（Ｓ１０４）：入力部１０は、初期化処理を完了する。
【００３７】
次に、ソースファイル特定部１１の動作について、図１、図５、図９に基づき説明する。
図９は、この実施の形態における、ソースファイル特定部１１の動作を示すフローチャートである。
【００３８】
（Ｓ１１０）：ソースファイル特定部１１は、入力部１０もしくは解析部１４から関数名と引数関連情報１６２を渡されると、処理を開始する。
（Ｓ１１１）：ソースファイル特定部１１は、関数定義ファイルリスト２０を読み込む。この実施の形態では、関数定義ファイルリスト２０は解析システムによる解析の実行前に予め準備されており、図５に示す内容が記録されているとする。
（Ｓ１１２）：ソースファイル特定部１１は、関数定義ファイルリスト２０の関数名２００に、入力部１０もしくは解析部１４から渡された関数名が存在するか判定する。存在すると判定した場合（Ｓ１１２でＹｅｓ）は、Ｓ１１３に進む。一方、存在しないと判定した場合（Ｓ１１２でＮｏ）は、Ｓ１１４に進む。
（Ｓ１１３）：ソースファイル特定部１１は、関数定義ファイルリストから該当する関数名２００、およびソースファイル名２０１を取り出し、ソースコード展開部１２に渡す。
（Ｓ１１４）：ソースファイル特定部１１は、処理を完了する。
【００３９】
次に、ソースコード展開部１２の動作について、図１、図２、図３、図５、図１０に基づき説明する。
図１０は、この実施の形態における、ソースコード展開部１２の動作を示すフローチャートである。
なお、以降はソースファイル名２０１に対応するソースコード２１は記憶装置２に存在するものとして説明する。
【００４０】
（Ｓ１２０）：ソースコード展開部１２は、ソースファイル特定部から解析対象となる関数名２００、およびソースファイル名２０１を渡されると、処理を開始する。
（Ｓ１２１）：ソースコード展開部１２は、ソースコード２１を読み込み、構文木１６０を作成する。構文木１６０の作成方法について、詳細には述べず、概要のみ述べる。まず、ソースコード２１に対して字句解析を行い終端記号として取り出し、ノード１６００を作成し、スタックに蓄積する。次に、ノードの並びが構文規則と一致した場合、前記一致した１つ以上のノードをスタックから取り出し、さらに、それらを子ノードとする非終端記号を表すノードを作成し、前記作成したノードをスタックに蓄積する。この処理をソースコード２１の終端まで繰り返すことで、構文木１６０が作成される。
（Ｓ１２２）：ソースコード展開部１２は、ソースコード２１を読み込み、記号表１６１を作成する。記号表１６１の作成方法について、詳細には述べず、概要のみ述べる。ソースコード２１から変数宣言、関数定義等を読み取り、構文規則に基づき、識別子名１６１０から初期化子情報１６１４までの５つの情報を取り出し、記号表１６１に格納する。変数宣言に対する識別子種別１６１１の判定は、変数宣言が行われているソースコード２１内の位置、具体的には関数定義の外側（大域変数）、関数定義の引数リスト（引数）、関数定義の内側（局所変数）、に基づき行う。
（Ｓ１２３）：ソースコード展開部１２は、処理を完了する。
【００４１】
次に、引数関連情報設定部１３の動作について、図１、図３、図４、図５、図７、図１１に基づき説明する。
図１１は、この実施の形態における、引数関連情報設定部１３の動作を示すフローチャートである。
【００４２】
（Ｓ１３０）：引数関連情報設定部１３は、ソースコード展開部１２による構文木１６０、および記号表１６１の作成が完了すると、処理を開始する。
（Ｓ１３１）：引数関連情報設定部１３は、ソースファイル特定部１１に渡された引数関連情報１６２に格納された、実引数１６２０、仮引数１６２１、初期設定１６２２、操作種別１６２３から構成される組の数を判定する。０個より多い場合（Ｓ１３１でＹｅｓ）は、Ｓ１３２に進む。一方、０個の場合（Ｓ１３１でＮｏ）はＳ１３６に進む。
（Ｓ１３２）：引数関連情報設定部１３は、記号表１６１から仮引数１６２１に対応する識別子名１６１０を探索し、前記識別子名１６１０の型を、型指定子情報１６１２、および宣言子情報１６１３を取り出す。前記型指定子情報１６１２、および宣言子情報１６１３から、仮引数１６２１がアドレスを格納すると判定した場合（Ｓ１３２でＹｅｓ）は、Ｓ１３３に進む。一方、仮引数１６２１がアドレスを格納しないと判定した場合（Ｓ１３２でＮｏ）は、Ｓ１３４に進む。
（Ｓ１３３）：引数関連情報設定部１３は、記号表１６１から仮引数１６２１に対応する宣言子情報１６１３を探す。続いて、変数名２２０に仮引数１６２１、ソースファイル名２２１にソースコード展開部１２に渡されたソースファイル名２０１、行番号２２２に前記宣言子情報１６１３に対応する構文木１６０のノード１６００の行番号１６０３、呼出階層２２３に階層値１６３、操作種別２２４にアドレス設定を意味する値（図７では「Ｓｅｔ」と記載）、設定値２２５に実引数１６２０を格納する組を、解析結果２２に記録する。
（Ｓ１３４）：引数関連情報設定部１３は、引数関連情報１６２における、Ｓ１３２の実行対象を次に進める。
（Ｓ１３５）：引数関連情報設定部１３は、引数関連情報１６２全体に対して、Ｓ１３２が実行されたか判定する（補足：図４において、表の上から順番に検査して、一番下に到達したか、ということを判定している）。実行されたと判定した場合（Ｓ１３５でＹｅｓ）は、Ｓ１３６に進む。一方、実行されていないと判定した場合（Ｓ１３５でＮｏ）は、Ｓ１３２に進む。
（Ｓ１３６）：引数関連情報設定部１３は、処理を完了する。
【００４３】
次に、解析部１４の動作について、図１、図２、図４、図１２に基づき説明する。
図１２は、この実施の形態における、解析部１４の動作を示すフローチャートである。
【００４４】
（Ｓ１４０）：解析部１４は、引数関連情報設定部１３による引数関連情報１６２を用いた解析結果２２への記録が完了すると、処理を開始する。
（Ｓ１４１）：解析部１４は、記号表の特定の識別子に対するリンク情報で構成される検査リストを作成する（検査リストは図示しない）。検査リストに格納する変数は、ソースコード２１のすべての大域変数と、引数関連情報設定部１３にて解析結果２２に記録された引数関連情報１６２の仮引数１６２１である。この実施の形態では、静的大域変数、すなわち、スコープがソースファイル内部に限定される変数は検査リストに格納しない。
（Ｓ１４２）：解析部１４は、構文木１６０にて、解析対象の関数の関数定義に対応するノードに移動する。以降は、前記ノードの子ノードを用いて解析を行う。
（Ｓ１４３）〜（Ｓ１４７）：解析部１４は、関数定義内部の宣言、もしくは代入文を単位とした解析を行う。まず、前記単位に相当する構文木１６０の部分木を、ノード種別１６０１、構文規則番号１６０２、値種別１６０４、およびノード値１６０５を用いて決定し、前記決定された部分木が宣言に相当するか、代入文に相当するかを判定する（Ｓ１４３）。宣言と判定した場合（Ｓ１４３で宣言）はＳ１４４に進み、宣言に対する解析を行う（Ｓ１４４）。一方、代入文と判定した場合（Ｓ１４３で代入文）はＳ１４５に進み、文の解析を行う（Ｓ１４５）。Ｓ１４４およびＳ１４５の詳細な動作は後述する。宣言もしくは代入文の解析が完了すると、次の宣言もしくは代入文に進む。このとき、有効範囲（スコープ）から外れた局所変数について、検査リストから削除する（Ｓ１４６）。続いて、関数定義の末尾に到達しているか判定する（Ｓ１４７）。到達していると判定した場合（Ｓ１４７でＹｅｓ）は、Ｓ１４８に進む。一方、まだ到達していない場合（Ｓ１４７でＮｏ）は、Ｓ１４３に進む。なお、Ｓ１４３およびＳ１４６では、宣言もしくは代入文のいずれでもない部分は読み飛ばす。
（Ｓ１４８）：解析部１４は、検査リストを破棄する。また、構文木１６０と記号表１６１も破棄する。
（Ｓ１４９）：解析部１４は、処理を完了する。
【００４５】
次に、解析部１４における宣言に対する解析について、図１、図２、図３、図７、図１３に基づき説明する。
図１３は、解析部１４における宣言に対する解析の動作（図１２のＳ１４４）を示すフローチャートである。
【００４６】
（Ｓ１５０）：解析部１４は、宣言に対する解析を行うと判断すると、処理を開始する。
（Ｓ１５１）：解析部１４は、解析部１４は、宣言に対応する構文木１６０の部分木を用いて、宣言された変数が初期化されているか判定する。初期化されていると判定した場合（Ｓ１５１でＹｅｓ）は、初期化式に対する代入文解析を実行し（Ｓ１５２）、その後Ｓ１５３に進む。一方、初期化されていないと判定した場合（Ｓ１５１でＮｏ）は、Ｓ１５７に進む。
（Ｓ１５２）：解析部１４は、初期化式に対して代入文解析を実行する。Ｓ１５２の詳細な動作は後述する。
（Ｓ１５３）：解析部１４は、宣言に対応する構文木１６０の部分木を用いて、宣言された変数の型を特定し、アドレスを格納する型か判定する。アドレスを格納する型であると判定した場合（Ｓ１５３でＹｅｓ）は、Ｓ１５４に進む。一方、アドレスを格納する型でないと判定した場合（Ｓ１５３でＮｏ）は、Ｓ１５７に進む。
（Ｓ１５４）：解析部１４は、宣言に対応する構文木１６０の部分木を用いて、Ｓ１５２で解析した初期化式に、検査リストに格納された変数が出現しているか判定する。出現していると判定した場合（Ｓ１５４でＹｅｓ）は、Ｓ１５５に進む。一方、出現していないと判定した場合（Ｓ１５４でＮｏ）は、Ｓ１５７に進む。
（Ｓ１５５）：解析部１４は、宣言された変数を検査リストに追加する。
（Ｓ１５６）：解析部１４は、記号表１６１から宣言された変数に対応する宣言子情報１６１３を探す。続いて、変数名２２０に宣言された変数の名前、ソースファイル名２２１にソースコード展開部１２に渡されたソースファイル名２０１、行番号２２２に前記宣言子情報１６１３に対応する構文木１６０のノード１６００の行番号１６０３、呼出階層２２３に階層値１６３、操作種別２２４にアドレス設定を意味する値（図７では「Ｓｅｔ」と記載）、設定値２２５に初期化に用いた式全体を格納する組を、解析結果２２に記録する。
（Ｓ１５７）：解析部１４は、宣言に対する解析を終了する。
【００４７】
次に、解析部１４における代入文に対する解析について、図１、図２、図４、図５、図７、図１４に基づき説明する。
図１４は、解析部１４における代入文に対する解析の動作（図１２のＳ１４５、および図１３のＳ１５２）を示すフローチャートである。
【００４８】
（Ｓ１６０）：解析部１４は、代入文に対する解析を行うと判断すると、処理を開始する。
（Ｓ１６１）：解析部１４は、代入文に対応する構文木１６０の部分木を用いて、関数呼び出しがあるか判定する。関数呼び出しがあると判定した場合（Ｓ１６１でＹｅｓ）は、Ｓ１８０に進む。一方、関数呼び出しがないと判定した場合（Ｓ１６１でＮｏ）は、Ｓ１６２に進む。
（Ｓ１６２）：解析部１４は、代入文に対応する構文木１６０の部分木、および検査リストを用いて、代入文で検査リストに格納された変数を参照しているか判定する。ただし、Ｓ１６１で参照した関数呼び出しに対応する部分は判定に用いない。代入文で検査リストに格納された変数を参照していると判定した場合（Ｓ１６２でＹｅｓ）は、Ｓ１６７に進む。一方、代入文で検査リストに格納された変数を参照していないと判定した場合（Ｓ１６２でＮｏ）は、Ｓ１６３に進む。
（Ｓ１６３）：解析部１４は、代入文に対応する構文木１６０の部分木、および検査リストを用いて、代入文で検査リストに格納された変数を介した他の変数への代入が行われているか判定する。代入文で検査リストに格納された変数を介した他の変数への代入が行われていると判定した場合（Ｓ１６３でＹｅｓ）は、Ｓ１６８に進む。一方、代入文で検査リストに格納された変数を介した他の変数への代入が行われていないと判定した場合（Ｓ１６３でＮｏ）は、Ｓ１６４に進む。
（Ｓ１６４）：解析部１４は、代入文に対応する構文木１６０の部分木、および検査リストを用いて、代入文で検査リストに格納された変数に対する代入（代入文において検査リストに格納された変数が左辺）が行われているか判定する。代入文で検査リストに格納された変数に対する代入が行われていると判定した場合（Ｓ１６４でＹｅｓ）は、Ｓ１６８に進む。一方、代入文で検査リストに格納された変数に対する代入が行われていないと判定した場合（Ｓ１６４でＮｏ）は、Ｓ１６５に進む。
（Ｓ１６５）：解析部１４は、代入文に対応する構文木１６０の部分木、および検査リストを用いて、代入文で検査リストに格納された変数を代入（代入文において検査リストに格納された変数が右辺）しているか判定する。代入文で検査リストに格納された変数を代入していると判定した場合（Ｓ１６５でＹｅｓ）は、Ｓ１７０に進む。一方、代入文で検査リストに格納された変数を代入していないと判定した場合（Ｓ１６５でＮｏ）は、Ｓ１７４に進む。
【００４９】
（Ｓ１８０）：解析部１４は関数呼出解析に移行する。関数呼出解析の詳細は、図１５を用いて後に説明する。
（Ｓ１６６）：解析部１４は、代入文に対応する構文木１６０の部分木を用いて、次の関数呼び出しを探索する。
【００５０】
（Ｓ１６７）：解析部１４は、変数名２２０に参照されている変数の名前、ソースファイル名２２１にソースコード展開部１２に渡されたソースファイル名２０１、行番号２２２に代入文を表す構文木１６０の部分木における参照されている変数を表すノード１６００の行番号１６０３、呼出階層２２３に階層値１６３、操作種別２２４に参照を意味する値（図７では「Ｒｅａｄ」と記載）、設定値２２５には設定値なしを意味する値、を格納する組を、解析結果２２に記録する。また、変数名２２０が引数関連情報１６２の仮引数１６２１に格納されている変数、もしくは引数関連情報１６２の仮引数１６２１に格納されている変数が代入されている変数の場合は、追加で、該当する組の操作種別１６２３に参照を意味する値を記録する。
【００５１】
（Ｓ１６８）：解析部１４は、代入文の左辺に対応する構文木１６０の部分木および記号表１６１を用いて、左辺の型を特定する。
（Ｓ１６９）：解析部１４は、変数名２２０に代入された変数の名前、ソースファイル名２２１にソースコード展開部１２に渡されたソースファイル名２０１、行番号２２２に代入文を表す構文木１６０の部分木における代入された変数を表すノード１６００の行番号１６０３、呼出階層２２３に階層値１６３、操作種別２２４にアドレス設定を意味する値もしくは代入を意味する値（図７では「Ｓｅｔ」もしくは「Ｗｒｉｔｅ」と記載）、設定値２２５に代入された式全体、を格納する組を、解析結果２２に記録する。このとき、解析部１４は、Ｓ１６８で特定した左辺の型を参照して、アドレスを格納する型の場合は操作種別２２４にアドレス設定を意味する値を格納し、アドレスを格納する型ではない場合は代入を意味する値を格納する。また、変数名２２０が引数関連情報１６２の仮引数１６２１に格納されている変数、もしくは引数関連情報１６２の仮引数１６２１に格納されている変数が代入されている変数の場合は、追加で、該当する組の操作種別１６２３にアドレス設定もしくは代入を意味する値を記録する。
【００５２】
（Ｓ１７０）：解析部１４は、代入文の左辺に対応する構文木１６０の部分木および記号表１６１を用いて、左辺の型がアドレスを格納する型であるかを判定する。左辺の型がアドレスを格納する型であると判定した場合（Ｓ１７０でＹｅｓ）は、Ｓ１７１に進む。一方、左辺の型がアドレスを格納する型でないと判定した場合（Ｓ１７０でＮｏ）は、Ｓ１７４に進む。
（Ｓ１７１）：解析部１４は、代入文に対応する構文木１６０の部分木、および検査リストを用いて、代入された変数（代入文の左辺の変数）が検査リストに格納されているか判定する。代入された変数が検査リストに格納されていると判定した場合（Ｓ１７１でＹｅｓ）は、Ｓ１７２に進む。一方、代入された変数が検査リストに格納されていないと判定した場合（Ｓ１７１でＮｏ）は、Ｓ１７３に進む。
（Ｓ１７２）：解析部１４は、代入文に対応する構文木１６０の部分木、および検査リストを用いて、代入された変数を検査リストに追加する。
（Ｓ１７３）：解析部１４は、変数名２２０に代入された変数の名前、ソースファイル名２２１にソースコード展開部１２に渡されたソースファイル名２０１、行番号２２２に代入文を表す構文木１６０の部分木における代入された変数を表すノード１６００の行番号１６０３、呼出階層２２３に階層値１６３、操作種別２２４にアドレス設定を意味する値（図７では「Ｓｅｔ」と記載）、設定値２２５に代入された式全体、を格納する組を、解析結果２２に記録する。また、変数名２２０が引数関連情報１６２の仮引数１６２１に格納されている変数、もしくは引数関連情報１６２の仮引数１６２１に格納されている変数が代入されている変数の場合は、追加で、該当する組の操作種別１６２３に参照を意味する値を記録する。
（Ｓ１７４）：解析部１４は、代入文に対する解析を終了する。
【００５３】
次に、解析部１４における関数呼び出しに対する解析（図１３および図１４におけるＳ１８０：関数呼出解析）について、図１、図２、図４、図５、図７、図１５に基づき説明する。
図１５は、解析部１４における関数呼び出しに対する解析の動作を示すフローチャートである。
【００５４】
（Ｓ１８１）：解析部１４は、関数呼び出しに対する解析を行うと判断すると、処理を開始する。
（Ｓ１８２）：解析部１４は、関数呼び出しに対応する構文木１６０の部分木を用いて、引数の個数を数える。
（Ｓ１８３）：解析部１４は、Ｓ１８２で数え上げた引数の個数分、引数関連情報１６２に情報を追加したか判定する。引数の個数分、引数関連情報１６２に情報を追加したと判定した場合（Ｓ１８３でＹｅｓ）は、Ｓ１９０に進む。一方、引数の個数分、引数関連情報１６２に情報を追加していないと判定した場合（Ｓ１８３でＮｏ）は、Ｓ１８４に進む。
（Ｓ１８４）：解析部１４は、関数呼び出しに対応する構文木１６０の部分木を用いて、引数が関数呼び出しか判定する。引数が関数呼び出しであると判定した場合（Ｓ１８４でＹｅｓ）は、Ｓ１８５に進む。一方、引数が関数呼び出しでないと判定した場合（Ｓ１８４でＮｏ）は、Ｓ１８６に進む。
（Ｓ１８５）：解析部１４は、引数にある関数を対象に、関数呼出解析を実行する。すなわち、Ｓ１８０を再帰的に実行する。
（Ｓ１８６）：解析部１４は、検査リスト、および関数呼び出しに対応する構文木１６０の部分木を用いて、（ア）実引数の型がアドレスを格納する型である、（イ）実引数が検査リストに格納されている、の２条件を判定する。（ア）が真であり、かつ（イ）が偽の場合（Ｓ１８６でＹｅｓ）は、Ｓ１８７に進む。一方、（ア）が真であり、かつ（イ）が偽を満たさない場合（Ｓ１８６でＮｏ）は、Ｓ１８８に進む。
（Ｓ１８７）：解析部１４は、引数に記述されている変数を検査リストに追加する。
（Ｓ１８８）：解析部１４は、解析結果２２を用いて、まず実引数に代入されている値を特定する。ただし、実引数が複数の変数で表現されている場合、特定は行わない。次に、解析部１４は、実引数１６２０に関数呼び出しに記述されている式、仮引数１６２１に呼び出されている関数のプロトタイプ宣言もしくは定義に記述されている仮引数、初期設定１６２２に前記動作により特定された実引数１６２０に代入されている値（特定していない場合は何も設定しない）、操作種別１６２３には無設定を意味する値、を格納する引数関連情報１６２Ｎｅｗを作成する（ソースファイル特定部に渡される引数関連情報と区別するため１６２Ｎｅｗとする）。なお、引数が複数ある場合は、先頭の引数の処理にて作成し、残りの引数については追記となる。
（Ｓ１８９）：解析部１４は、次の引数に対する処理に移る。
【００５５】
（Ｓ１９０）：解析部１４は、階層値１６３を１増加させる。
（Ｓ１９１）：解析部１４は、ソースファイル特定部１１を実行する。このとき、関数名は関数呼び出しに記述されている関数の名前であり、引数関連情報１６２ＮｅｗはＳ１８４からＳ１８９までの処理にて作成したもの、もしくは空である。
（Ｓ１９２）：解析部１４は、階層値１６３を１減少させる。
（Ｓ１９３）：解析部１４は、引数関連情報１６２Ｎｅｗがある場合、すなわち引数の個数が１個以上の場合は引数関連情報１６２Ｎｅｗを参照し、操作種別１６２３に参照もしくは代入を意味する値が格納されている場合は、変数名２２０に実引数１６２０、ソースファイル名２２１にソースコード展開部１２に渡されたソースファイル名２０１、行番号２２２に代入文を表す構文木１６０の部分木における代入された変数を表すノード１６００の行番号１６０３、呼出階層２２３に階層値１６３、操作種別２２４に操作種別１６２３に格納されている値（参照もしくは代入の一方）、設定値２２５に設定値なしを意味する値、を格納する組を、解析結果２２に記録する。また、引数関連情報１６２Ｎｅｗに格納されている実引数が、引数関連情報１６２の仮引数１６２１に格納されている変数である、もしくは、引数関連情報１６２の仮引数１６２１に格納されている変数が代入されている変数の場合は、該当する引数関連情報１６２の操作種別１６２３も更新する。なお、引数関連情報１６２Ｎｅｗの操作種別１６２３に参照と代入の両方が発生したことを意味する値が格納されている場合は、解析結果にそれぞれを分けて記録する。一方、解析部１４は、引数関連情報１６２Ｎｅｗがない場合、何もしない。
（Ｓ１９４）：解析部１４は、引数関連情報１６２Ｎｅｗがある場合、Ｓ１８４からＳ１８９までで作成した引数関連情報１６２Ｎｅｗを破棄する。一方、解析部１４は、引数関連情報１６２Ｎｅｗがない場合、何もしない。
（Ｓ１９５）：解析部１４は、関数呼出解析を完了する。
【００５６】
最後に、入力部１０に渡された関数について、解析部１４による解析が完了すると、解析部１４は解析結果２２を閉じる（図示せず）。
【００５７】
この実施の形態における、関数ｆ１に対する解析の流れについて、図１、図４、図５、図７、図８、図９、図１０、図１１、図１２、図１３、図１４、図１５に基づき説明する。
【００５８】
（入力部１０）：関数名「ｆ１」と、空の引数関連情報１６２ａをソースファイル特定部１１に渡す（Ｓ１０３）。
（ソースファイル特定部１１［ｆ１］）：関数定義ファイルリスト１２０を読み込み（Ｓ１１１）、関数ｆ１の存在を判定し（Ｓ１１２）、関数名２００すなわち「ｆ１」、およびソースファイル名（／ｓｒｃ／ｆｕｎｃＡ．ｃ）をソースコード展開部１２に渡す（Ｓ１１３）。
（ソースコード展開部１２［ｆ１］）：／ｓｒｃ／ｆｕｎｃＡ．ｃを読み込み、構文木１６０ａおよび記号表１６１ａを作成する（Ｓ１２１、Ｓ１２２）。
（引数関連情報設定部１３［ｆ１］）：引数関連情報１６２ａは空であるため、Ｓ１３１にて分岐し、Ｓ１３６に到達する。
【００５９】
（解析部１４［ｆ１］）：検査リストを作成し、大域変数ｇＶａｌを検査リストに格納する（Ｓ１４１）。
（解析部１４［ｆ１：行番号５］）：「ｉｎｔ  ｙ  ＝  ｇＶａｌ」に対する宣言解析を実行する（Ｓ１４４）。この宣言は、初期化を行っているため（Ｓ１５１でＹｅｓ）、初期化式、すなわちｇＶａｌに対する代入文解析を実行する（Ｓ１５２）。ｇＶａｌに対する代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＹｅｓ、Ｓ１６３でＮｏ、Ｓ１６４でＮｏ、Ｓ１６５でＮｏ、であり、ｇＶａｌの参照を解析結果２２に記録し（Ｓ１６７）、代入文解析を終了する（Ｓ１７４）。続いて、局所変数ｙはアドレスを格納する型ではないため（Ｓ１５３でＮｏ）、宣言解析を終了する（Ｓ１５７）。
（解析部１４［ｆ１：行番号７］）：「ｇＶａｌ  ＝  ０」に対する代入文解析を実行する（Ｓ１４５）。ｇＶａｌは検査リストに格納されているため、代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＮｏ、Ｓ１６３でＮｏ、Ｓ１６４でＹｅｓ、Ｓ１６５でＮｏ、であり、左辺の型がアドレスを格納する型ではないため、ｇＶａｌに対する値の代入をを解析結果２２に記録し（Ｓ１６８、Ｓ１６９）、代入文解析を終了する（Ｓ１７４）。
（解析部１４［ｆ１：行番号８］）：「ｘ  ＝  ＆ｇＶａｌ；」に対する代入文解析を実行する（Ｓ１４５）。代入文解析の流れは、まず、Ｓ１６１でＮｏとなる。次に、ｇＶａｌが検査リストに格納されているため、Ｓ１６２はＹｅｓとなり、ｇＶａｌの参照を解析結果２２に記録する（Ｓ１６７）。ｘは検査リストに格納されていないため、Ｓ１６３、Ｓ１６４はＮｏとなる。右辺にｇＶａｌがあるため、Ｓ１６５はＹｅｓとなる、ｘはアドレスを格納する型であるため、Ｓ１７０はＹｅｓとなる。ｘは検査リストに格納されていないため、Ｓ１７１はＮｏとなり、ｘを検査リストに追加し（Ｓ１７２）、ｘに対するアドレス設定を解析結果２２に記録する（Ｓ１７３）。その後、代入文解析を終了する（Ｓ１７４）。
（解析部１４［ｆ１：行番号９］）：「ｙ  ＝  ｆ２（ｘ）」に対する代入文解析を実行する。代入文解析の流れは、まず、Ｓ１６１でＹｅｓとなり、関数呼び出しを実行する（Ｓ１８０）。引数関連情報１６２ｂをを作成し（Ｓ１８４〜Ｓ１８９）、関数名ｆ２と引数関連情報１６２ｂをソースファイル特定部１１に渡す（Ｓ１９１）。
【００６０】
（ソースファイル特定部１１［ｆ２］）：関数定義ファイルリスト１２０を読み込み（Ｓ１１１）、関数ｆ２の存在を判定し（Ｓ１１２）、関数名２００、すなわち「ｆ２」、およびソースファイル名２０１（／ｓｒｃ／ｆｕｎｃＢ．ｃ）をソースコード展開部１２に渡す（Ｓ１１３）。
（ソースコード展開部１２［ｆ２］）：／ｓｒｃ／ｆｕｎｃＢ．ｃを読み込み、構文木１６０ｂおよび記号表１６１ｂを作成する（Ｓ１２１、Ｓ１２２）。
（引数関連情報設定部１３［ｆ２］）：引数関連情報１６２ｂは空でなく（Ｓ１３１でＹｅｓ）、仮引数ｐはアドレスを格納する型であるため（Ｓ１３２でＹｅｓ）、ｐに対するアドレス設定を解析結果２２に記録する（Ｓ１３３）。
【００６１】
（解析部１４［ｆ２］）：検査リストを作成する（Ｓ１４１）。／ｓｒｃ／ｆｕｎｃＢ．ｃには大域変数がないため、空の検査リストとなる。
（解析部１４［ｆ２：行番号３］）：「ｉｎｔ  ＊ｑ  ＝  ｐ」に対する宣言解析を実行する（Ｓ１４４）。この宣言は、初期化を行っているため（Ｓ１５１でＹｅｓ）、初期化式、すなわちｐに対する代入文解析を実行する（Ｓ１５２）。ｐに対する代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＹｅｓ、Ｓ１６３でＮｏ、Ｓ１６４でＮｏ、Ｓ１６５でＮｏ、であるため、ｐの参照を解析結果２２に記録し（Ｓ１６７）、代入文解析を終了する（Ｓ１７４）。続いて、局所変数ｑはアドレスを格納する型であり（Ｓ１５３でＹｅｓ）、かつ右辺のｐが検査リストに格納されているため（Ｓ１５４でＹｅｓ）、ｑを検査リストに格納し（Ｓ１５５）、ｑに対するアドレス設定を解析結果２２に記録する（Ｓ１５６）。その後、宣言解析を終了する（Ｓ１５７）。
（解析部１４［ｆ２：行番号４］）：「ｉｎｔ  ＊ｒ  ＝  ｑ」に対する宣言解析を実行する（Ｓ１４４）。この宣言は、初期化を行っているため（Ｓ１５１でＹｅｓ）、初期化式、すなわちｑに対する代入文解析を実行する（Ｓ１５２）。ｑに対する代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＹｅｓ、Ｓ１６３でＮｏ、Ｓ１６４でＮｏ、Ｓ１６５でＮｏ、であるため、ｑの参照を解析結果２２に記録し（Ｓ１６７）、代入文解析を終了する（Ｓ１７４）。続いて、局所変数ｒはアドレスを格納する型であり（Ｓ１５３でＹｅｓ）、かつ右辺のｑが検査リストに格納されているため（Ｓ１５４でＹｅｓ）、ｒを検査リストに格納し（Ｓ１５５）、ｒに対するアドレス設定を解析結果２２に記録する（Ｓ１５６）。その後、宣言解析を終了する（Ｓ１５７）。
（解析部１４［ｆ２：行番号５］）：「ｉｎｔ  ＊ｓ  ＝  ｒ」に対する宣言解析を実行する（Ｓ１４４）。この宣言は、初期化を行っているため（Ｓ１５１でＹｅｓ）、初期化式、すなわちｒに対する代入文解析を実行する（Ｓ１５２）。ｒに対する代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＹｅｓ、Ｓ１６３でＮｏ、Ｓ１６４でＮｏ、Ｓ１６５でＹｅｓ、であるため、ｒの参照を解析結果２２に記録し（Ｓ１６７）、代入文解析を終了する（Ｓ１７４）。続いて、局所変数ｓはアドレスを格納する型であり（Ｓ１５３でＹｅｓ）、かつ右辺のｒが検査リストに格納されているため（Ｓ１５４でＹｅｓ）、ｓを検査リストに格納し（Ｓ１５５）、ｓに対するアドレス設定を解析結果２２に記録する（Ｓ１５６）。その後、宣言解析を終了する（Ｓ１５７）。
（解析部１４［ｆ２：行番号６］）：「ｉｎｔ  ｂ  ＝  ＊ｒ」に対する宣言解析を実行する（Ｓ１４４）。この宣言は、初期化を行っているため（Ｓ１５１でＹｅｓ）、初期化式、すなわち＊ｒに対する代入文解析を実行する（Ｓ１５２）。＊ｒに対する代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＹｅｓ、Ｓ１６３でＮｏ、Ｓ１６４でＮｏ、Ｓ１６５でＮｏ、であるため、ｒに対する参照を解析結果２２に記録し（Ｓ１６７）、代入文解析を終了する（Ｓ１７４）。続いて、局所変数ｓはアドレスを格納する型ではないため（Ｓ１５３でＮｏ）、宣言解析を終了する（Ｓ１５７）。
（解析部１４［ｆ２：行番号８］）：「＊ｓ  ＝０」に対する代入文解析を実行する。代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＮｏ、Ｓ１６３でＹｅｓ、であり、左辺の型がアドレスを格納する型ではないため、ｓに対する値の代入を解析結果２２に記録する（Ｓ１６８，Ｓ１６９）。続いて、Ｓ１６５でＮｏとなるため、代入文解析を終了する（Ｓ１７４）。
（解析部１４［ｆ２：行番号９］）：「ｂ  ＝  ｆ３（ｑ）」に対する代入文解析を実行する。代入文解析の流れは、まず、Ｓ１６１でＹｅｓとなり、関数呼び出しを実行する（Ｓ１８０）。引数関連情報１６２ｃをを作成し（Ｓ１８４〜Ｓ１８９）、関数名ｆ３と引数関連情報１６２ｃをソースファイル特定部１１に渡す（Ｓ１９１）。
【００６２】
（ソースファイル特定部１１［ｆ３］）：関数定義ファイルリスト１２０を読み込み（Ｓ１１１）、関数ｆ３の存在を判定し（Ｓ１１２）、関数名２００、すなわち「ｆ３」、およびソースファイル名２０１（／ｓｒｃ／ｆｕｎｃＣ．ｃ）をソースコード展開部１２に渡す（Ｓ１１３）。
（ソースコード展開部１２［ｆ３］）：／ｓｒｃ／ｆｕｎｃＣ．ｃを読み込み、構文木１６０ｃおよび記号表１６１ｃを作成する（Ｓ１２１、Ｓ１２２）。
（引数関連情報設定部１３［ｆ３］）：引数関連情報１６２ｃは空でなく（Ｓ１３１でＹｅｓ）、仮引数ｔはアドレスを格納する型であるため（Ｓ１３２でＹｅｓ）、ｔに対するアドレス設定を解析結果２２に記録する（Ｓ１３３）。
【００６３】
（解析部１４［ｆ３］）：検査リストを作成する（Ｓ１４１）。／ｓｒｃ／ｆｕｎｃＣ．ｃには大域変数がないため、空の検査リストとなる。
（解析部１４［ｆ３：行番号３］）：「ｉｎｔ  ｚ  ＝  ＊ｔ」に対する宣言解析を実行する（Ｓ１４４）。この宣言は、初期化を行っているため（Ｓ１５１でＹｅｓ）、初期化式、すなわち＊ｔに対する代入文解析を実行する（Ｓ１５２）。＊ｔに対する代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＹｅｓ、Ｓ１６３でＮｏ、Ｓ１６４でＮｏ、Ｓ１６５でＮｏ、であるため、ｔに対する参照を解析結果２２に記録し（Ｓ１６７）、代入文解析を終了する（Ｓ１７４）。続いて、局所変数ｚはアドレスを格納する型ではないため（Ｓ１５３でＮｏ）、宣言解析を終了する（Ｓ１５７）。
（解析部１４［ｆ３：行番号４］）：「＊ｔ  ＝  １００」に対する代入文解析を実行する。代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＮｏ、Ｓ１６３でＹｅｓ、であり、左辺の型がアドレスを格納する型ではないため、ｔに対する値の代入を解析結果２２に記録する（Ｓ１６８、Ｓ１６９）。その後、Ｓ１６５でＮｏとなるため、代入文解析を終了する（Ｓ１７４）。
（解析部１４［ｆ３：行番号５］「ｚ」に対する代入文解析を実行する。代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＮｏ、Ｓ１６３でＮｏ、Ｓ１６４でＮｏ、Ｓ１６５でＮｏ、であるため、代入文解析を終了する（Ｓ１７４）。
（解析部１４［ｆ３］）：関数ｆ３の末尾まで解析すると（Ｓ１４７でＹｅｓ）、解析部１４の処理が完了し（Ｓ１４９）、関数ｆ２の解析に戻る。
【００６４】
（解析部１４［ｆ２：行番号９］）：Ｓ１９３で引数関連情報１６２ｃに記録された操作種別を用いて、引数ｑに対する参照と代入を解析結果２２に記録する（Ｓ１９３）。関数解析が完了すると（Ｓ１９５）、図１４のＳ１６２に戻る。Ｓ１６２以降の代入文解析の流れは、Ｓ１６２でＮｏ、Ｓ１６３でＮｏ、Ｓ１６４でＮｏ、Ｓ１６５でＮｏ、であるため、代入文解析を終了する（Ｓ１７４）。  （解析部１４［ｆ２：行番号１０］）：「ｂ」に対する代入文解析を実行する。代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＮｏ、Ｓ１６３でＮｏ、Ｓ１６４でＮｏ、Ｓ１６５でＮｏ、であるため、代入文解析を終了する（Ｓ１７４）。
（解析部１４［ｆ２］）：関数ｆ２の末尾まで解析すると（Ｓ１４７でＹｅｓ）、解析部１４の処理が完了し（Ｓ１４９）、関数ｆ１の解析に戻る。
【００６５】
（解析部１４［ｆ１：行番号９］）：Ｓ１９３で引数関連情報１６２ｂに記録された操作種別を用いて、引数ｘに対する参照と代入を解析結果２２に記録する（Ｓ１９３）。関数解析が完了すると（Ｓ１９５）、図１４のＳ１６２に戻る。Ｓ１６２以降の代入文解析の流れは、Ｓ１６２でＮｏ、Ｓ１６３でＮｏ、Ｓ１６４でＮｏ、Ｓ１６５でＮｏ、であるため、代入文解析を終了する（Ｓ１７４）。
（解析部１４［ｆ１：行番号１０］）：「ｙ」に対する代入文解析を実行する。代入文解析の流れは、Ｓ１６１でＮｏ、Ｓ１６２でＮｏ、Ｓ１６３でＮｏ、Ｓ１６４でＮｏ、Ｓ１６５でＮｏ、であるため、代入文解析を終了する（Ｓ１７４）。
（解析部１４［ｆ１］）：関数ｆ１の末尾まで解析すると（Ｓ１４７でＹｅｓ）、解析部１４の処理が完了する（Ｓ１４９）。すなわち、ソースコード解析装置による解析処理が完了する。
【００６６】
続いて、解析結果２２の作成が完了した後の表示部１５の動作について、図１、図１６に基づき説明する。
図１６は表示部１５の動作を示すフローチャートである。
【００６７】
（Ｓ２００）：表示部１５は、入力部１０から解析部１４までによる解析結果２２の作成が完了すると、処理を開始する。
（Ｓ２０１）：表示部１５は、入力部１０から表示形式を取得する。
（Ｓ２０２）：表示部１５は、解析結果２２を読み込む。
（Ｓ２０３）：表示部１５は、Ｓ２０１で取得した表示形式に従い、解析結果２２を表示する。
（Ｓ２０４）：表示部１５は、処理を完了する。
例えば、表示形式が「テーブル」の場合、図７のような表示となる。
【００６８】
以上のように、本実施の形態によれば、大域変数のアドレスの代入、および関数の引数の関連情報を用いた解析を行うことにより、大域変数の名前のみに基づく解析よりも、大域変数に対する参照、代入を詳細に取り出すことができるといった利点がある。
具体的には、図６のソースコードを解析する場合、大域変数の名前のみに基づく解析では、／ｓｒｃ／ｆｕｎｃＣ．ｃの代入文「＊ｒ＝１００；」にて大域変数ｇＶａｌへの代入が発生していることが分からない。
しかし、本実施の形態によれば、／ｓｒｃ／ｆｕｎｃＡ．ｃの「ｘ＝＆ｇＶａｌ；」によるアドレス代入、「ｙ＝ｆ２（ｘ）；」による関数の引数を介したアドレスの伝播、／ｓｒｃ／ｆｕｎｃＢ．ｃの「ｉｎｔ  ＊ｑ＝ｐ；」によるアドレスの代入、「ｂ＝ｆ３（ｑ）；」による関数の引数を介したアドレスの伝播、／ｓｒｃ／ｆｕｎｃＣ．ｃの「＊ｒ＝１００；」によるポインタ型変数を介した大域変数への代入、をソースコードから抽出して解析結果２２に出力することで、この解析結果２２を用いてユーザは／ｓｒｃ／ｆｕｎｃＣ．ｃの代入文「＊ｒ＝１００；」にて大域変数ｇＶａｌへの代入が発生していると判断できる。
【００６９】
さらに、本実施の形態では、アドレスを格納する型である局所変数をすべて検査リストに格納せず、検査リストにある変数を代入した、もしくは関数の引数に指定された場合に検査リストに追加することにより、検査リストへの格納数を削減し、検査リストに対する探索処理の負荷軽減を図り、結果として解析の高速化を実現している。
【００７０】
また、上記説明では、Ｓ１４１にて静的大域変数（静的変数）を検査リストに格納しなかったが、静的大域変数を検査リストに格納しても構わない。
このようにすることで、静的大域変数に対する参照、代入も解析可能となるといった利点がある。
【００７１】
また、解析部１４における静的大域変数に対する動作を、入力部１０からの指示に基づき変更するようにしても構わない。
このようにすることで、１ファイルに多数の関数定義が記述されている場合は静的大域変数を検査リストに入れる、等のように、解析範囲に柔軟性を持たせることができ、かつ、静的大域変数を検査リストに格納しない場合は、解析の高速化が期待できる。
【００７２】
また、上記説明では、再帰呼び出しを行う関数について特に記述しなかったが、解析中の関数名をスタックに保存して、既にスタックに格納されている関数については、解析をスキップするといった動作としても構わない。
このようにすることで、再帰呼び出しを行う関数に対する解析が可能となる。
【００７３】
また、上記説明では各関数の解析にて構文木１６０と記号表１６１を作成しているが、既に作成済の構文木１６０と記号表１６１を再利用してもよい。
このようにすることで、ソースコード展開部１２の実行回数の削減が期待でき、結果として構文木１６０および記号表１６１を展開する記憶領域の削減、および解析の高速化が期待できる。
なお、このとき、構文木１６０および記号表１６１の破棄は、参照する解析処理がなくなった場合に実行する。
【００７４】
また、上記説明では、ｉｎｔ型の変数のみ用いているが、他の型であっても本実施の形態は適用可能である。
さらに、構造体および共用体のメンバについても、構文木１６０および記号表１６１を用いることで型の特定が可能であるため、変数と同様に解析できる。
このとき、解析結果２２の変数名２２０にはメンバ名も含めて格納してもよい。ユーザ定義の型名（Ｃ言語の場合、ｔｙｐｅｄｅｆを使用）についても、同様に解析可能である。
【００７５】
また、上記説明では、引数関連情報１６２は引数の個数分作成するとしたが、実際に必要なものはアドレスを格納する型の引数のみである。
したがって、前記必要な引数のみを引数関連情報に格納するようにしてもよい。
このとき、各組が何番目であるか特定するための序数を、実引数１６２０、仮引数１６２１、初期設定１６２２、操作種別１６２３から成る組に追加する（図示せず）。
【００７６】
また、上記説明では、表示部１５が入力部１０から解析部１４までにより生成された解析結果２２を表示するとしたが、入力部１０から指定された、既に作成済の解析結果２２を表示しても構わない。
つまり、解析と表示が独立して動作可能である。
【００７７】
また、上記説明では、表示部１５にて、図７に示す解析結果２２をそのまま表示するとしたが、解析結果２２およびソースコード２１を用いて、別の形式で表示しても構わない。
別の表示形式について、図１７に基づき説明する。
図１７は、解析結果２２を木構造状に示した図である。ソースコード２１から関数名を取り出し、解析結果２２の呼出階層２２３を用いると、図１７のような表示が実現できる。各関数を示すブロックの中には、関数名と、解析結果２２に出現する操作種別２２４を表示している。
【００７８】
また、上記説明では、Ｓ１６５にて検査リストにある変数を代入した場合に代入された変数を検査リストに格納済か判断していたが、ソースコード２１の動作対象機器におけるメモリのアドレスを意味する数値を代入する場合に、同様の判定を行っても構わない。
ただし、記憶装置２にメモリのアドレスと、そのアドレスに格納される変数の対応関係を事前に知っているものとする。
【００７９】
さらに、図１７を表示している状態で、入力部１０が関数ｆ３の選択を検出すると、表示部１５が、図１８のように関数ｆ３で実際に行われている処理を表示するようにしても構わない。
同様に、関数の呼び出し関係についても、表示部１５は最初に解析開始関数であるｆ１のみ表示し、その後入力部１０からの指示に従い、関数ｆ２を表示するようにしても構わない。
また、複数の関数呼び出しがある場合、図１７から図１８のような情報の展開を行う関数呼び出しを選択できるようにしても構わない。
このようにすることで、複雑な呼び出し関係にある関数でも、特定の実行経路に着目できるといった利点がある。
【００８０】
図１７、図１８とは異なる表示形式の例を、図１９に基づき説明する。
図１９は、縦軸に着目する変数を１つ選択し（図１９ではｇＶａｌを選択）、横軸に解析開始関数から呼び出される関数を並べて、アドレスの代入、着目変数への代入を実行順序に従い表示した図である。
図１９のような表示形式は、例えば、代入と参照のタイミングのみに着目する場合に、必要な情報のみを表示しているため、解析結果２２の可読性が上がるといった利点がある。
【００８１】
また、表示部１５は、図７、図１７、図１８に示す解析結果２２と、対応するソースコード２１を並べて表示するようにしても構わない。
このようにすることで、解析結果２２とソースコード２１の対応関係が分かりやすくなるという利点がある。
【００８２】
また、表示部１５は、解析結果２２に複数の大域変数がある場合、入力部１０からの指示に基づき、表示する大域変数を選択しても構わない。
また、大域変数ではなく、局所変数を選択するようにしても構わない。
このようにすることで、解析結果２２の可読性が上がるといった利点がある。
【００８３】
また、表示部１５は、入力部１０の指示に基づき、記憶装置２に蓄積された複数の解析結果２２を同時に表示しても構わない。
このようにすることで、例えば複数のタスクにおける特定の大域変数への参照、代入を簡単に把握できるといった利点がある。
【００８４】
以上、本実施の形態では、プログラミング言語で記述されたソースコードを解析するソースコード解析装置であり、
解析対象関数、または表示形式を入力する入力部と、
解析対象関数が記述されているファイルを特定するソースファイル特定部と、
上記ソースファイル特定部により特定されたソースコードを読み込み構文木および記号表を作成するソースコード展開部と、
構文木および記号表を一時的に蓄積する一時記憶部と、
構文木および記号表を用いて、大域変数と、大域変数のアドレスが格納されている局所変数と、関数の引数を用いた大域変数、に対する参照、代入を解析結果に出力する解析部と、
上記入力部から指定された表示形式に基づき、解析結果を表示する表示部と
を備えるソースコード解析装置を説明した。
【００８５】
また、上記解析部は、上記構文木に関数呼び出しが出現した場合、仮引数と実引数との対応関係と、出現した関数の名前を用いて、前記ソースファイル特定部の処理を実行し、
上記ソースコード解析装置は、さらに、
ソースファイル特定部が受け取った仮引数と実引数の対応関係を用いて、変数のアドレスが実引数に格納されていることを解析結果に出力する引数関連情報設定部
を備え、
さらに、
上記解析部は、ソースファイル特定部が受け取った仮引数と実引数の対応関係を用いて、仮引数、もしくは仮引数の値を代入した局所変数、に対する参照、代入を、仮引数と実引数の対応関係に記録することを説明した。
【００８６】
また、上記ソースファイル特定部は、解析対象関数の名前を記憶しており、上記解析部から記憶している関数に対する解析を指示されたときに解析処理をスキップすることを説明した。
【００８７】
また、上記ソースコード展開部は、上記構文木および記号表の作成に使用したソースコードのファイル名を記憶しており、上記ソースファイル特定部から記憶しているソースコードに対するソースコード展開処理を指示されたときにソースコード展開処理をスキップすることを説明した。
【００８８】
また、上記入力部は、静的大域変数を解析対象に含めるか否かの入力を受け取り、
上記解析部は、入力部が受け取った上記入力に基づき、静的大域変数を解析対象に含めるか否かを決定することを説明した。
【００８９】
また、上記表示部は、上記解析結果と対応するソースコードを並べて表示することを説明した。
【００９０】
また、上記表示部は、上記解析結果を用いて、上記入力部から指定された変数に関連する部分のみを表示することを説明した。
【００９１】
また、上記表示部は、上記解析結果を複数用いて、それぞれの解析結果を並べて表示することを説明した。
【００９２】
実施の形態２．
実施の形態１では、解析結果２２の作成に必要なソースコード２１すべてをその場で解析しており、なおかつ関数定義ファイルリスト２０を事前に準備する必要があった。
これに対して、実施の形態２では、予め解析に必要と思われるソースコード２１のそれぞれに対してソースコード展開部１２により作成される構文木１６０と記号表１６１を記憶装置２に保存するとともに関数定義ファイルリスト２０に関数とソースコードの対応関係を記録することで、解析の高速化を図る。
【００９３】
図２０は、実施の形態２におけるソースコード解析装置１を備える解析システムの機能ブロック図である。
実施の形態１との相違点は、記憶装置２に展開済データ２３が追加されている点と、入力部１０からソースコード展開部１２への矢印が追加された点である。
【００９４】
展開済データ２３は、一時記憶部１６にある構文木１６０と記号表１６１を持つ（図示せず）。
【００９５】
実施の形態２では、ソースコード解析装置１の動作が２つに分かれる。第１の動作は、展開済データ２３の作成であり、第２の動作は展開済データ２３を用いた解析である。
【００９６】
実施の形態２における、ソースコード解析装置１の第１の動作、すなわち展開済データ２３の作成処理について説明する。
入力部１０は、解析システムの使用者からの入力として、ソースコード２１のファイル名を受け取ると、受け取ったファイル名をソースコード展開部１２に渡す。
【００９７】
実施の形態２における関数定義ファイルリスト２０について説明する。
図２１は、実施の形態２における関数定義ファイルリスト２０の構造を示す図である。
関数定義ファイルリスト２０には、ソースコード解析装置１による解析に用いる１つ以上のソースコード２１で定義されている関数の数だけ、関数名２００、ソースファイル名２０１、展開済データ名２０２が存在する。
すなわち、関数定義ファイルリスト２０は、１つ以上の関数名２００、ソースファイル名２０１、展開済データ名２０２から構成される組を備える。
【００９８】
ソースコード展開部１２による展開済データ２３の作成について、図２０、図２１、図２２に基づき説明する。
図２２は、実施の形態２におけるソースコード展開部１２による展開済データ２３作成の動作を示すフローチャートである。
【００９９】
（Ｓ１２０）〜（Ｓ１２２）：図１０と同様のため説明を省略する。
（Ｓ１２４）：ソースコード展開部１２は、構文木１６０、および記号表１６１を用いて、展開済データ２３を作成する。展開済データ２３は、ソースコード２１と同じディレクトリに格納し、ファイル名はソースコードの拡張子を「．ｄａｔ」に変更したものとする。
（Ｓ１２５）：ソースコード展開部１２は、構文木１６０、および記号表１６１を用いて、関数定義ファイルリスト２０に記録する。このとき、関数名２００は構文木１６０、および記号表１６１から取り出した関数定義の関数名であり、関数定義ごとに変更する。また、ソースファイル名２０１は、入力部１０から与えられたファイル名を用いる。展開済データ名２０２はＳ１２４にて記載のものを用いる。
（Ｓ１２６）：ソースコード展開部１２は、処理を完了する。同時に、ソースコード解析装置１の第１の動作も完了する。
【０１００】
実施の形態２における、ソースコード解析装置１の第２の動作、すなわち展開済データ２３を用いた解析処理について説明する。
入力部１０は、解析システムの使用者からの入力として、ソースコード２１のファイル名を受け取ると、受け取ったファイル名をソースコード展開部１２に渡す。
【０１０１】
ソースコード展開部１２による展開済データ２３の読込みについて、図２０、図２１、図２３に基づき説明する。
図２３は、実施の形態２におけるソースコード展開部１２による展開済データ２３読み込みの動作を示すフローチャートである。
【０１０２】
（Ｓ１２０）、（Ｓ１２３）：図１０と同様のため説明を省略する。
（Ｓ１２７）：ソースコード展開部１２は、関数定義ファイルリスト２０から、ソースコード２１のファイル名に対応する展開済データ名２０２を取得し、該当する展開済データ２３を読み込んで、構文木１６０と記号表１６１を一時記憶部１６に格納する。
【０１０３】
実施の形態２における、引数関連情報設定部１３、解析部１４、表示部１５の動作は実施の形態１と同様のため、説明を省略する。
【０１０４】
以上のように、本実施の形態によれば、構文木１６０と記号表１６１を展開済データ２３として記憶装置２に格納し、解析にて展開済データ２３を用いて構文木１６０および記号表１６１を展開することにより、構文木１６０と記号表１６１の作成処理の繰り返しを防ぎ、実施の形態１よりも解析を高速に行えるといった利点がある。
例えば、複数ファイルで構成されるプログラムにて、数ファイルのみ変更して解析を再度行う場合、実施の形態２では、展開済データ２３の再利用が可能であるため、解析を高速に行える。
【０１０５】
さらに、本実施の形態によれば、関数定義ファイルリスト２０を事前に用意するといった手間が省略できるといった利点がある。
【０１０６】
また、上記説明では、展開済データ２３のファイル名を展開済データ名２０２に格納するとしたが、実施の形態２のように展開済データ名２０２がソースファイル名２０１から一意に特定可能であれば、展開済データ名２０２がなくても構わない。
逆に、展開済データ名２０２があれば、展開済データ２３をソースコード２１と異なるディレクトリ格納しても構わない。
【０１０７】
また、上記説明では、構文木１６０と記号表１６１のみ、展開済データ２３に格納するとしたが、解析部１４により解析結果２２に出力される内容のうち、関数内部に閉じているもの、すなわち他の関数から影響を受けない内容について、展開済データ２３に格納し、実施の形態２における解析システムの第２の動作にて再利用しても構わない。
このようにすることで、実施の形態２における解析システムの第２の動作では、関数呼び出しに関する箇所のみ解析すればよく、解析を高速に行えるといった利点がある。
【０１０８】
また、上記説明では、展開済データ２３を常に使用するとしたが、ソースコード２１と展開済データ２３の作成時間を調べて、展開済データ２３がソースコード２１よりも古い場合、展開済データ２３を作り直しても構わない。
このようにすることで、ソースコード２１に対する変更の後、単にソースコード解析装置１を用いた解析を行うだけで、ソースコード２１に対する変更を解析結果２２に反映することが可能になるといった利点がある。
【０１０９】
以上、本実施の形態では、ソースコード展開部が、作成した構文木および記号表と、ソースコードと構文木および記号表の対応関係を不揮発性記憶装置に蓄積し、この動作を行った後の解析では不揮発性記憶装置に蓄積した構文木および記号表を読み込むことを説明した。
【０１１０】
また、解析部は、上記ソースコード展開部が不揮発性記憶装置に蓄積した構文木および記号表と、ソースコードと構文木および記号表の対応関係に加えて、関数呼び出し以外の解析結果も併せて蓄積し、この動作を行った後の解析では、不揮発性記憶装置に蓄積した解析結果を読み込んで別の解析結果の作成に利用することを説明した。
【０１１１】
また、上記ソースコード展開部および解析部は、不揮発性記憶装置に記憶した構文木および記号表と、ソースコードと構文木および記号表の対応関係と、関数呼び出し以外の解析結果の作成時間がソースコードよりも古い場合は、不揮発性記憶装置に記憶した構文木および記号表と、ソースコードと構文木および記号表の対応関係とを、ソースコードから再度作成することを説明した。
【０１１２】
最後に、実施の形態１及び２に示したソースコード解析装置１のハードウェア構成例について説明する。
図２５は、実施の形態１及び２に示すソースコード解析装置１のハードウェア資源の一例を示す図である。
なお、図２５の構成は、あくまでもソースコード解析装置１のハードウェア構成の一例を示すものであり、ソースコード解析装置１のハードウェア構成は図２５に記載の構成に限らず、他の構成であってもよい。
【０１１３】
図２５において、ソースコード解析装置１は、プログラムを実行するＣＰＵ９１１（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサともいう）を備えている。
ＣＰＵ９１１は、バス９１２を介して、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）９１３、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）９１４、通信ボード９１５、表示装置９０１、キーボード９０２、マウス９０３、磁気ディスク装置９２０と接続され、これらのハードウェアデバイスを制御する。
更に、ＣＰＵ９１１は、ＦＤＤ９０４（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｋ  Ｄｒｉｖｅ）、コンパクトディスク装置９０５（ＣＤＤ）、プリンタ装置９０６、スキャナ装置９０７と接続していてもよい。また、磁気ディスク装置９２０の代わりに、光ディスク装置、メモリカード（登録商標）読み書き装置などの記憶装置でもよい。
ＲＡＭ９１４は、揮発性メモリの一例である。ＲＯＭ９１３、ＦＤＤ９０４、ＣＤＤ９０５、磁気ディスク装置９２０の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置の一例である。
通信ボード９１５、キーボード９０２、マウス９０３、スキャナ装置９０７、ＦＤＤ９０４などは、入力装置の一例である。
また、通信ボード９１５、表示装置９０１、プリンタ装置９０６などは、出力装置の一例である。
【０１１４】
通信ボード９１５は、ネットワークに接続されている。例えば、通信ボード９１５は、ＬＡＮ（ローカルエリアネットワーク）、インターネット、ＷＡＮ（ワイドエリアネットワーク）、ＳＡＮ（ストレージエリアネットワーク）などに接続されていても構わない。
【０１１５】
磁気ディスク装置９２０には、オペレーティングシステム９２１（ＯＳ）、ウィンドウシステム９２２、プログラム群９２３、ファイル群９２４が記憶されている。
プログラム群９２３のプログラムは、ＣＰＵ９１１がオペレーティングシステム９２１、ウィンドウシステム９２２を利用しながら実行する。
【０１１６】
また、ＲＡＭ９１４には、ＣＰＵ９１１に実行させるオペレーティングシステム９２１のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。
また、ＲＡＭ９１４には、ＣＰＵ９１１による処理に必要な各種データが格納される。
【０１１７】
また、ＲＯＭ９１３には、ＢＩＯＳ（Ｂａｓｉｃ  Ｉｎｐｕｔ  Ｏｕｔｐｕｔ  Ｓｙｓｔｅｍ）プログラムが格納され、磁気ディスク装置９２０にはブートプログラムが格納されている。
ソースコード解析装置１の起動時には、ＲＯＭ９１３のＢＩＯＳプログラム及び磁気ディスク装置９２０のブートプログラムが実行され、ＢＩＯＳプログラム及びブートプログラムによりオペレーティングシステム９２１が起動される。
【０１１８】
上記プログラム群９２３には、実施の形態１及び２の説明において「〜部」として説明している機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ９１１により読み出され実行される。
【０１１９】
ファイル群９２４には、実施の形態１及び２の説明において、「〜の判断」、「〜の解析」、「〜の計算」、「〜の比較」、「〜の更新」、「〜の設定」、「〜の登録」、「〜の選択」等として説明している処理の結果を示す情報やデータや信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」の各項目として記憶されている。
「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してＣＰＵ９１１によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示などのＣＰＵの動作に用いられる。
抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示のＣＰＵの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリ、レジスタ、キャッシュメモリ、バッファメモリ等に一時的に記憶される。
また、実施の形態１及び２で説明しているフローチャートの矢印の部分は主としてデータや信号の入出力を示し、データや信号値は、ＲＡＭ９１４のメモリ、ＦＤＤ９０４のフレキシブルディスク、ＣＤＤ９０５のコンパクトディスク、磁気ディスク装置９２０の磁気ディスク、その他光ディスク、ミニディスク、ＤＶＤ等の記録媒体に記録される。また、データや信号は、バス９１２や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
【０１２０】
また、実施の形態１及び２の説明において「〜部」として説明しているものは、「〜回路」、「〜装置」、「〜機器」であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明しているものは、ＲＯＭ９１３に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤ等の記録媒体に記憶される。プログラムはＣＰＵ９１１により読み出され、ＣＰＵ９１１により実行される。すなわち、プログラムは、実施の形態１及び２の「〜部」としてコンピュータを機能させるものである。あるいは、実施の形態１及び２の「〜部」の手順や方法をコンピュータに実行させるものである。
【０１２１】
このように、実施の形態１及び２に示すソースコード解析装置１は、処理装置たるＣＰＵ、記憶装置たるメモリ、磁気ディスク等、入力装置たるキーボード、マウス、通信ボード等、出力装置たる表示装置、通信ボード等を備えるコンピュータであり、上記したように「〜部」として示された機能をこれら処理装置、記憶装置、入力装置、出力装置を用いて実現するものである。
【符号の説明】
【０１２２】
１  ソースコード解析装置、２  記憶装置、１０  入力部、１１  ソースファイル特定部、１２  ソースコード展開部、１３  引数関連情報設定部、１４  解析部、１５  表示部、１６  一時記憶部、２０  関数定義ファイルリスト、２１  ソースコード、２２  解析結果、２３  展開済データ、１６０  構文木、１６１  記号表、１６２  引数関連情報、１６３  階層値、１６４  解析結果。
【図１】
2010191598.tif 000003
【図２】
2010191598.tif 000004
【図３】
2010191598.tif 000005
【図４】
2010191598.tif 000006
【図５】
2010191598.tif 000007
【図６】
2010191598.tif 000008
【図７】
2010191598.tif 000009
【図８】
2010191598.tif 000010
【図９】
2010191598.tif 000011
【図１０】
2010191598.tif 000012
【図１１】
2010191598.tif 000013
【図１２】
2010191598.tif 000014
【図１３】
2010191598.tif 000015
【図１４】
2010191598.tif 000016
【図１５】
2010191598.tif 000017
【図１６】
2010191598.tif 000018
【図１７】
2010191598.tif 000019
【図１８】
2010191598.tif 000020
【図１９】
2010191598.tif 000021
【図２０】
2010191598.tif 000022
【図２１】
2010191598.tif 000023
【図２２】
2010191598.tif 000024
【図２３】
2010191598.tif 000025
【図２４】
2010191598.tif 000026
【図２５】
2010191598.tif 000027