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