(57)【要約】      （修正有）【課題】メモリの干渉を効率的に検出する、プログラムの検査プログラム、検査装置、及び、検査方法を提供する。【解決手段】２つの関数の間で、アクセス処理が干渉するグローバル変数を検査する検査プログラムであって、検査処理は、プログラムのソースコードに基づいて、ソースコードに記述される関数別に解析情報を生成する関数別解析情報生成工程と、少なくともひとつは割り込み関数を示す第１、第２の検査対象関数と、第１、第２の検査対象関数が呼び出し元関数として連鎖的に呼び出す関数との情報を有する第１、第２の関数集合を生成する関数集合生成工程と、解析情報に基づいて第１、第２のグローバル変数集合を生成し、第１、第２のグローバル変数集合間で一致するグローバル変数と、一致するグローバル変数の第１、第２の検査対象関数におけるそれぞれのアクセス処理の属性とを検出するグローバル変数検出工程と、を有する。【選択図】図２
2015022484.tif 000002
【特許請求の範囲】
【請求項１】
２つの関数の間で、アクセス処理が干渉するグローバル変数を検査する、プログラムの検査処理をコンピュータに実行させる、プログラムの検査プログラムであって、
前記検査処理は、
前記プログラムのソースコードに基づいて、前記ソースコードに記述される関数別に、前記関数内でアクセス処理の対象となるグローバル変数、及び、書き込みまたは読み込みを示すアクセス処理の属性を有する解析情報を生成する関数別解析情報生成工程と、
少なくともひとつは割り込み関数を示す第１、第２の検査対象関数と、前記第１、第２の検査対象関数が呼び出し元関数として連鎖的に呼び出す関数との情報を有する第１、第２の関数集合を生成する関数集合生成工程と、
前記解析情報に基づいて、前記第１、第２の関数集合に含まれる各関数の前記グローバル変数を抽出して第１、第２のグローバル変数集合を生成し、前記第１、第２のグローバル変数集合間で一致するグローバル変数と、前記一致するグローバル変数の前記第１、第２の検査対象関数におけるそれぞれのアクセス処理の属性とを検出するグローバル変数検出工程と、を有する検査プログラム。
【請求項２】
請求項１において、
前記グローバル変数検出工程では、前記第１、第２の検査対象関数における前記アクセス処理の属性の組み合わせパターン毎に、前記一致するグローバル変数が検出される検査プログラム。
【請求項３】
請求項１において、
前記グローバル変数検出工程では、前記第１、第２の検査対象関数における検出対象の前記アクセス処理の属性の組み合わせパターンが入力され、前記検出対象の前記アクセス処理の属性の組み合わせパターンの前記第１、第２のグローバル変数集合間で一致するグローバル変数が検出される検査プログラム。
【請求項４】
請求項２または３において、
前記アクセス処理の属性の組み合わせパターンは、前記第１、第２の検査対象関数について共に書き込み処理の属性を対象とするパターンと、前記第１、第２の検査対象関数について共に読み込み処理の属性を対象とするパターンと、前記第１の検査対象関数について書き込み処理の属性であって前記第２の検査対象関数について読み込み処理の属性を対象とするパターンと、前記第１の検査対象関数について読み込み処理の属性であって前記第２の検査対象関数について書き込み処理の属性を対象とするパターンと、を有する検査プログラム。
【請求項５】
請求項１乃至４のいずれかにおいて、
前記関数集合生成工程では、前記第１、第２の検査対象関数を指定する情報が入力される検査プログラム。
【請求項６】
請求項１乃至５のいずれかにおいて、
前記グローバル変数検出工程では、さらに、前記一致するグローバル変数の前記アクセス処理が行われる関数が検出される検査プログラム。
【請求項７】
請求項１乃至６のいずれかにおいて、
前記プログラムの検査処理は、さらに、
前記グローバル変数検出工程において検出された前記一致するグローバル変数と、前記アクセス処理の属性とを出力するグローバル変数出力工程と、を有する検査プログラム。
【請求項８】
請求項１乃至７のいずれかにおいて、
前記関数別解析情報生成工程では、さらに、前記関数内で呼び出される被呼び出し関数の情報を含む前記解析情報を生成し、
前記関数集合生成工程では、前記解析情報に基づいて、前記第１、第２の検査対象関数の第１の被呼び出し関数、及び、当該第１の被呼び出し関数の第２の被呼び出し関数の情報を連鎖的に検出し、前記第１、第２の関数集合を生成する検査プログラム。
【請求項９】
２つの関数の間で、アクセス処理が干渉するグローバル変数を検査する、プログラムの検査方法であって、
前記プログラムのソースコードに基づいて、前記ソースコードに記述される関数別に、前記関数内でアクセス処理の対象となるグローバル変数、及び、書き込みまたは読み込みを示すアクセス処理の属性を有する解析情報を生成する関数別解析情報生成工程と、
少なくともひとつは割り込み関数を示す第１、第２の検査対象関数と、前記第１、第２の検査対象関数が呼び出し元関数として連鎖的に呼び出す関数との情報を有する第１、第２の関数集合を生成する関数集合生成工程と、
前記解析情報に基づいて、前記第１、第２の関数集合に含まれる各関数の前記グローバル変数を抽出して第１、第２のグローバル変数集合を生成し、前記第１、第２のグローバル変数集合間で一致するグローバル変数と、前記一致するグローバル変数の前記第１、第２の検査対象関数におけるそれぞれのアクセス処理の属性とを検出するグローバル変数検出工程と、を有する検査方法。
【請求項１０】
２つの関数の間で、アクセス処理が干渉するグローバル変数を検査する、プログラムの検査装置であって、
前記プログラムのソースコードに基づいて、前記ソースコードに記述される関数別に、前記関数内でアクセス処理の対象となるグローバル変数、及び、書き込みまたは読み込みを示すアクセス処理の属性を有する解析情報を生成する関数別解析情報生成手段と、
少なくともひとつは割り込み関数を示す第１、第２の検査対象関数と、前記第１、第２の検査対象関数が呼び出し元関数として連鎖的に呼び出す関数との情報を有する第１、第２の関数集合を生成する関数集合生成手段と、
前記解析情報に基づいて、前記第１、第２の関数集合に含まれる各関数の前記グローバル変数を抽出して第１、第２のグローバル変数集合を生成し、前記第１、第２のグローバル変数集合間で一致するグローバル変数と、前記一致するグローバル変数の前記第１、第２の検査対象関数におけるそれぞれのアクセス処理の属性とを検出するグローバル変数検出手段と、を有する検査装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの検査プログラム、検査装置、及び、検査方法に関する。
【背景技術】
【０００２】
一般的に、プログラム言語によって記述されたプログラムの実行時、プロセッサに対する割り込みが発生することがある。割り込み処理が発生すると、実行中の処理が停止され、割り込み関数が実行される。そして、割り込み関数の処理が終了すると、割り込みが生じた時点に実行されていた元の処理に復帰する。
【０００３】
例えば、実行中の処理と割り込み関数とで同一のメモリにアクセスする場合、割り込みが発生すると、割り込み処理によって、当該メモリの値が書き換えられてしまうことがある。このように、ある処理と割り込み処理との間において、メモリの干渉が生じ得るプログラムは、非リエントラント性のプログラムと呼ばれる。
【０００４】
非リエントラント性のプログラムにおいて、メモリの干渉が発生すると、実行中の処理の動作が、期待したとおりの動作と異なってしまう。これにより、プログラムのエラー状態が生じる。そこで、プログラムが、非リエントラント性のプログラムであるか否かが検査される（例えば、特許文献１）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００１-１３４４３１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
非リエントラント性のプログラムでは、割り込みのタイミングに依存して、メモリの干渉が生じる。このため、割り込みを任意に発生させた場合であっても、メモリの干渉が発生する場合と、発生しない場合とがある。メモリの干渉が生じるタイミングが稀なタイミングである場合、干渉するメモリの検出に多大な工数を要する。
【０００７】
また、干渉するメモリをプログラムのコードに基づいて検出する場合、検査の対象とする関数と当該関数内で呼び出される全ての関数においてアクセス処理が行われるメモリと、割り込み関数においてアクセス処理が行われるメモリとの間の干渉をすべて調査する必要がある。この作業には、多大な工数を要する。
【０００８】
本発明は、メモリの干渉を効率的に検出するプログラムの検査プログラム、検査装置、及び、検査方法を提供する。
【課題を解決するための手段】
【０００９】
第１の側面は、２つの関数の間で、アクセス処理が干渉するグローバル変数を検査する、プログラムの検査処理をコンピュータに実行させる、プログラムの検査プログラムであって、前記検査処理は、前記プログラムのソースコードに基づいて、前記ソースコードに記述される関数別に、前記関数内でアクセス処理の対象となるグローバル変数、及び、書き込みまたは読み込みを示すアクセス処理の属性を有する解析情報を生成する関数別解析情報生成工程と、少なくともひとつは割り込み関数を示す第１、第２の検査対象関数と、前記第１、第２の検査対象関数が呼び出し元関数として連鎖的に呼び出す関数との情報を有する第１、第２の関数集合を生成する関数集合生成工程と、前記解析情報に基づいて、前記第１、第２の関数集合に含まれる各関数の前記グローバル変数を抽出して第１、第２のグローバル変数集合を生成し、前記第１、第２のグローバル変数集合間で一致するグローバル変数と、前記一致するグローバル変数の前記第１、第２の検査対象関数におけるそれぞれのアクセス処理の属性とを検出するグローバル変数検出工程と、を有する。
【発明の効果】
【００１０】
第１の側面によれば、メモリの干渉が効率的に検出される。
【図面の簡単な説明】
【００１１】
【図１】本実施の形態例におけるプログラムの検査装置の一例を示す図である。
【図２】本実施の形態例におけるプログラムの検査装置のブロック図を例示する図である。
【図３】グローバル変数の干渉が発生する入力プログラムを例示する図である。
【図４】本実施の形態例におけるプログラムの検査装置の処理概要を説明する図である。
【図５】入力プログラムのソースコードの一例である。
【図６】字句解析情報ＤＢの一例を示す図である。
【図７】関数別解析情報ＤＢの生成処理について説明する第１のフローチャート図である。
【図８】関数別解析情報ＤＢの生成処理について説明する第２のフローチャート図である。
【図９】関数別解析情報ＤＢの一例を示す図である。
【図１０】関数集合ＤＢの生成処理の流れを説明する第１のフローチャート図である。
【図１１】関数集合ＤＢの生成処理の流れを説明する第２のフローチャート図である。
【図１２】関数集合ＤＢの一例を示す図である。
【図１３】グローバル変数の検出処理の流れを説明する第１のフローチャート図である。
【図１４】グローバル変数の検出処理の流れを説明する第２のフローチャート図である。
【図１５】グローバル変数の検出処理の流れを説明する第３のフローチャート図である。
【図１６】グローバル変数の検出処理の流れを説明する第４のフローチャート図である。
【図１７】グローバル変数の検出処理の流れを説明する第５のフローチャート図である。
【図１８】検出されたグローバル変数の情報の出力例を示す図である。
【発明を実施するための形態】
【００１２】
以下、図面にしたがって本発明の実施の形態について説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
【００１３】
［プログラムの検査装置］
図１は、本実施の形態例におけるプログラムの検査装置１０の一例を示す図である。図１のプログラムの検査装置１０は、例えば、記憶装置１１、プロセッサ１２、Ｉ／Ｏ制御装置１３、メモリ１４、入力装置１５、出力装置１６を有する。各部は、バス１７を介して互いに接続される。入力装置１５は、例えば、キーボードやマウス等を示し、出力装置１６は、例えば、ディスプレイ等の表示画面を示す。Ｉ／Ｏ制御装置１３は、プロセッサ１２の指示に基づいて、記憶装置１１、入力装置１５、出力装置１６の制御を行う。
【００１４】
また、メモリ１４には、本実施の形態例におけるプログラムの検査プログラムＰＲが記憶される。プログラムの検査プログラムＰＲは、例えば、入力装置１５からの指示によってＲＡＭ（Random Access Memory）にロードされ、プロセッサ１２と協働してプログラムの検査処理を実現する。なお、プログラムの検査プログラムＰＲは、１つのプログラムによって構成されてもよいし、複数のプログラムによって構成されてもよい。また、字句解析情報ＤＢｄ１、関数別解析情報ＤＢｄ２、関数集合ＤＢｄ３は、プログラムの検査プログラムＰＲによって生成され、記憶装置１１に格納される。ただし、字句解析情報ＤＢｄ１、関数別解析情報ＤＢｄ２、関数集合ＤＢｄ３は、プログラムの検査装置１０からアクセス可能な外部の記憶装置に格納されてもよい。
【００１５】
［プログラムの検査装置のブロック図］
図２は、本実施の形態例におけるプログラムの検査装置１０のブロック図を例示する図である。図２のプログラムの検査装置１０は、字句解析・意味解析部２１、関数別解析情報作成部２２、関数集合作成部２３、変数集合一致判定部２４を有する。図２における破線で囲まれた各部は、例えば、プログラムの検査プログラムＰＲの処理に対応する。ただし、プログラムの検査プログラムＰＲは、字句解析・意味解析部２１を含んでいてもよい。
【００１６】
図２の字句解析・意味解析部２１は、検査対象の入力プログラムＳＣのソースコードを解析し、各コードを種別分して字句解析情報ＤＢｄ１に記憶する。字句解析・意味解析部２１は、例えば、一般的なコンパイラを示す。関数別解析情報作成部２２は、字句解析情報ＤＢｄ１に基づいて、関数毎の解析情報を生成して関数別解析情報ＤＢｄ２に記憶する。関数集合作成部２３は、関数別解析情報ＤＢｄ２に基づいて、呼び出し関数毎に、当該呼び出し関数と、呼び出し関数が呼び出す関数との名前を有する関数リストを生成し、関数集合ＤＢｄ３に記憶する。変数集合一致判定部２４は、関数別解析情報ＤＢｄ２と関数集合ＤＢｄ３とを参照して、入力装置１５から名前が入力される２つの検査対象関数における、グローバル変数のアクセスの干渉を検出し、出力装置１６に出力する。
【００１７】
［割り込み処理の一例］
図３は、グローバル変数のアクセス処理の干渉が発生し得る入力プログラムＳＣを例示する図である。図３の入力プログラムＳＣの例において、関数Ｂは割り込み関数である。割り込み関数とは、プロセッサ１２に割り込みが生じたときに、現在実行している処理（命令）を停止して実行される関数を示す。そして、割り込み関数の処理が終了すると、割り込みが生じた時点で実行されていた元の処理に復帰される。また、図３の例において、変数Ｃはグローバル変数である。グローバル変数は、入力プログラムＳＣにおける全ての関数においてアクセス可能な変数を示す。これに対して、ローカル変数は、宣言された関数においてのみアクセス可能な変数である。
【００１８】
図３の入力プログラムＳＣの例において、関数Ａが呼び出され、関数Ａ内で関数Ｄが呼び出される。具体的に、関数Ｄでは、グローバル変数Ｃに値１０が書き込まれ、グローバル変数Ｃに値１が加算された値１１がローカル変数ａｎｓに書き込まれる。即ち、割り込みが発生しない場合、変数ａｎｓの値は１１となる。一方、割り込み関数Ｂでは、グローバル変数Ｃの値が０に初期化される。図３の例において、関数Ｄの実行中に割り込みが発生すると、割り込み関数Ｂが呼び出される。例えば、関数Ｄにおけるグローバル変数Ｃへの値１０の書き込み処理の直後に割り込みが発生した場合、割り込み関数Ｂによってグローバル変数Ｃに値０が書き込まれる。そして、関数Ｄの再開時、値０が格納されるグローバル変数Ｃに値１が加算され、変数ａｎｓは値１となる。即ち、割り込みが発生する場合、変数ａｎｓの値は１となる。
【００１９】
このように、割り込み発生の有無に応じて、変数ａｎｓの値が変動する。これは、関数Ｄと割り込み関数Ｂとの間で、グローバル変数Ｃのアクセス処理が干渉しているためである。これにより、関数Ａにおける処理の結果が期待した値にならず、入力プログラムＳＣが正しく動作しない場合がある。
【００２０】
そこで、本実施の形態例におけるプログラムの検査装置１０は、プログラムのソースコードに基づいて、ソースコードに記述される関数別に、関数内でアクセス処理の対象となるグローバル変数、及び、書き込みまたは読み込みを示すアクセス処理の属性を有する解析情報を生成する。また、プログラムの検査装置１０は、少なくともひとつは割り込み関数を示す第１、第２の検査対象関数と、第１、第２の検査対象関数が呼び出し元関数として連鎖的に呼び出す関数との情報を有する第１、第２の関数集合を生成する。そして、プログラムの検査装置１０は、解析情報に基づいて、第１、第２の関数集合に含まれる各関数のグローバル変数を抽出して第１、第２のグローバル変数集合を生成し、第１、第２のグローバル変数集合間で一致するグローバル変数と、一致するグローバル変数の第１、第２の検査対象関数におけるそれぞれのアクセス処理の属性とを検出する。
【００２１】
これにより、プログラムの検査装置１０は、プログラムが有する２つの関数間でアクセス処理が干渉する可能性があるグローバル変数を、効率的に検出することができる。そして、ユーザは、検出されたグローバル変数の情報に基づいて、アクセス処理の干渉が生じないようにプログラムを修正することができる。この結果、プログラムの障害が効率的に回避される。
【００２２】
［プログラムの検査装置の処理概要］
図４は、本実施の形態例におけるプログラムの検査装置１０の処理概要について説明する図である。各工程Ｓ１１〜Ｓ１４の処理の詳細については、別の図に基づいて後述する。
【００２３】
プログラムの検査装置１０の字句解析・意味解析部２１は、まず、入力プログラムＳＣのソースコードに基づいて、字句解析情報ＤＢｄ１を生成する（Ｓ１１）。字句解析・意味解析部２１は、は、コンパイラの手法に基づいて、ソースコードを解析することができる。字句解析情報ＤＢｄ１は、関数の開始処理及び終了処理、関数の呼び出し処理、グローバル変数の読み込み処理、書き込み処理を示すコードを、ソースコードの記述に沿って保持する。続いて、プログラムの検査装置１０の関数別解析情報作成部２２は、字句解析情報ＤＢｄ１に基づいて、関数別解析情報ＤＢｄ２を生成する（Ｓ１２）。関数別解析情報ＤＢｄ２は、関数毎に、当該関数内でアクセス処理が行われるグローバル変数と、当該グローバル変数のアクセス処理の属性、及び、当該関数内で呼び出される１つまたは複数の呼び出し関数の情報を有する。
【００２４】
次に、プログラムの検査装置１０の関数集合作成部２３は、入力装置１５から名前が入力される２つの検査対象関数（第１の検査対象関数、第２の検査対象関数）について、関数別解析情報ＤＢｄ２に基づいて、関数集合ＤＢｄ３を生成する（Ｓ１３）。２つの検査対象関数のうち、少なくともいずれかは、割り込み関数である。また、関数集合ＤＢｄ３は、検査対象関数と、検査対象関数が連鎖的に呼び出す関数との名前のリストを有する。そして、プログラムの検査装置１０の変数集合一致判定部２４は、関数別解析情報ＤＢｄ２及び関数集合ＤＢｄ３を参照して、２つの調査対象の関数の間で干渉するグローバル変数、及び、アクセス処理の属性を検出する（Ｓ１４）。
【００２５】
なお、工程Ｓ１４において、入力情報として、さらに、検出対象のアクセス処理の組み合わせパターンが入力されてもよい。検出対象のアクセス処理の組み合わせパターンは、例えば、パターン「第１の検査対象関数：書き込み処理／第２の検査対象関数：書き込み処理」、パターン「第１の検査対象関数：読み込み処理／第２の検査対象関数：読み込み処理」、パターン「第１の検査対象関数：書き込み処理／第２の検査対象関数：読み込み処理」、パターン「第１の検査対象関数：読み込み処理／第２の検査対象関数：書き込み処理」を有する。プログラムの検査装置１０は、アクセス処理の組み合わせパターンに応じて、第１、第２の検査対象関数の間で干渉が発生する可能性を有するグローバル変数を検出することができる。
【００２６】
［プログラムの例］
図５は、入力プログラムＳＣのソースコードＣＤの一例である。図５のソースコードＣＤには、６つの関数ｆｕｎｃ１〜ｆｕｎｃ６が記述される。また、図５のソースコードには、４つのグローバル変数ｖａｒ１〜ｖａｒ４について、読み込み処理、または書き込み処理が記述される。なお、入力プログラムＳＣは、いずれの言語で記述されてもよい。
【００２７】
具体的に、関数ｆｕｎｃ１（２行目〜６行目）では、グローバル変数ｖａｒ１への値０の書き込み処理（４行目）と、関数ｆｕｎｃ２の呼び出し処理（５行目）とが記述される。また、関数ｆｕｎｃ２（８行目〜１２行目）では、関数ｆｕｎｃ３、関数ｆｕｎｃ４の呼び出し処理（１０行目、１１行目）が記述される。関数ｆｕｎｃ３（１４行目〜１６行目）では、処理が記述されていない。そして、関数ｆｕｎｃ４（１８行目〜２１行目）では、グローバル変数ｖａｒ３、ｖａｒ４の値が読み出された上、加算され、グローバル変数ｖａｒ２に書き込まれる処理（２０行目）が記述される。また、関数ｆｕｎｃ５（２３行目〜２７行目）では、グローバル変数ｖａｒ３への値１０の書き込み処理（２５行目）と、関数ｆｕｎｃ６の呼び出し処理（２６行目）とが記述される。そして、関数ｆｕｎｃ６（２９行目〜３２行目）には、グローバル変数ｖａｒ１への値２の書き込み処理（３１行目）が記述される。
【００２８】
つまり、図５のソースコードＳＣにおいて、関数ｆｕｎｃ１から関数ｆｕｎｃ２が呼び出され、さらに、関数ｆｕｎｃ２から関数ｆｕｎｃ３、ｆｕｎｃ４が呼び出される。また、ソースコードＳＣにおいて、関数ｆｕｎｃ５から関数ｆｕｎｃ６が呼び出される。この例において、例えば、関数ｆｕｎｃ５は、割り込み関数である。また、図５のソースコードＳＣにおいて、グローバル変数ｖａｒ１、ｖａｒ３は、複数の関数によってアクセス処理が行われる。
【００２９】
初めに、プログラムの検査装置１０の字句解析・意味解析部２１は、図５に示すような、入力プログラムＳＣのソースコードＳＣに基づいて、字句解析情報ＤＢｄ１を生成する（図４のＳ１１）。ここで、字句解析情報ＤＢｄ１の具体例について説明する。
【００３０】
［字句解析情報ＤＢの具体例］
図６は、字句解析情報ＤＢｄ１の一例を示す図である。プログラムの検査装置１０の字句解析・意味解析部２１は、図５のソースコードＣＤの２行目を解析し、関数ｆｕｎｃ１の開始コードであることを検知する。そして、字句解析・意味解析部２１は、字句解析情報ＤＢｄ１の１行目に、種別：関数開始を、関数名／変数名：関数ｆｕｎｃ１を書き込む。続いて、字句解析・意味解析部２１は、字句解析情報ＤＢｄ１の処理行１０１を次行に遷移させる。
【００３１】
次に、字句解析・意味解析部２１は、ソースコードＣＤの４行目を解析してグローバル変数ｖａｒ１の書き込み処理が記述されたコードであることを検知する。そして、字句解析・意味解析部２１は、字句解析情報ＤＢｄ１の２行目に、種別：グローバル変数書き込みを、関数名／変数名：変数ｖａｒ１を書き込む。同様にして、続いて、字句解析・意味解析部２１は、ソースコードＣＤの５行目を解析して、関数ｆｕｎｃ２の読み込み処理が記述されたコードであることを検知し、字句解析情報ＤＢｄ１の３行目に、種別：関数呼び出しを、関数名／変数名：関数ｆｕｎｃ２を書き込む。そして、次に、字句解析・意味解析部２１は、ソースコードＣＤの６行目を解析して関数ｆｕｎｃ１の終了コードであることを検知し、字句解析情報ＤＢｄ１の４行目に、種別：関数終了、関数名／変数名：関数ｆｕｎｃ１を書き込む。
【００３２】
同様にして、図５のソースコードＣＤに基づいて、関数ｆｕｎｃ２の関数開始、関数ｆｕｎｃ３、関数ｆｕｎｃ４の呼び出し、関数ｆｕｎｃ２の終了が検知され、字句解析情報ＤＢｄ１に書き込まれる。他の関数ｆｕｎｃ３〜ｆｕｎｃ６のコード情報についても同様にして、字句解析情報ＤＢｄ１に書き込まれる。このようにして、ソースコードＣＤの記述に沿って、関数の開始処理及び終了処理、関数の呼び出し処理、グローバル変数の読み込み処理、書き込み処理を示す各コードが検出され、字句解析情報ＤＢｄ１に書き込まれる。
【００３３】
続いて、プログラムの検査装置１０の関数別解析情報作成部２２は、字句解析情報ＤＢｄ１に基づいて、関数別解析情報ＤＢｄ２を生成する（図４のＳ１２）。続いて、関数別解析情報ＤＢｄ２の生成処理について説明する。
【００３４】
［関数別解析情報ＤＢの生成処理（図４のＳ１２）］
図７は、関数別解析情報ＤＢｄ２の生成処理について説明する第１のフローチャート図である。プログラムの検査装置１０の関数別解析情報作成部２２は、字句解析情報ＤＢｄ１を参照して、字句解析情報ＤＢｄ１における１行目を処理行１０１とする（Ｓ２１）。続いて、関数別解析情報作成部２２は、処理行１０１の種別が関数開始を示すか否かを判定する（Ｓ２２）。処理行１０１の種別が関数開始を示さない場合（Ｓ２２のＮＯ）、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１の最後尾の行に達していないときに、再び、工程Ｓ２１の処理に戻る（Ｓ２８）。一方、処理行１０１の種別が関数開始を示す場合（Ｓ２２のＹＥＳ）、関数別解析情報作成部２２は、処理行１０１の関数名を対象関数名とした行を関数別解析情報ＤＢｄ２に追加し、関数別解析情報ＤＢｄ２における処理行１０２として設定する（Ｓ２３）。そして、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１における処理行１０１を次行に移動する（Ｓ２４）。
【００３５】
続いて、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１における処理行１０１の種別が関数呼び出しを示すか否かを判定する（Ｓ２５）。処理行１０１の種別が関数呼び出しを示す場合（Ｓ２５のＹＥＳ）、関数別解析情報作成部２２は、処理行１０１の関数名を、関数別解析情報ＤＢｄ２における処理行１０２の呼び出し関数名集合の要素に追加する（Ｓ２６）。そして、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１における処理行１０１を次行に移動する（Ｓ２７）。一方、処理行１０１の種別が関数呼び出しを示さない場合（Ｓ２５のＮＯ）、関数別解析情報作成部２２は、工程Ｓ２６、Ｓ２７の処理を行わない。
【００３６】
図８は、関数別解析情報ＤＢｄ２の生成処理について説明する第２のフローチャート図である。続いて、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１における処理行１０１の種別がグローバル変数の書き込み処理を示すか否かを判定する（Ｓ２９）。処理行１０１の種別がグローバル変数の書き込み処理を示す場合（Ｓ２９のＹＥＳ）、関数別解析情報作成部２２は、処理行１０１の変数名を、関数別解析情報ＤＢｄ２における処理行１０２の書き込み変数名集合の要素に追加する（Ｓ３０）。そして、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１における処理行１０１を次行に移動する（Ｓ３１）。一方、処理行１０１の種別がグローバル変数の書き込み処理を示さない場合（Ｓ２９のＮＯ）、関数別解析情報作成部２２は、工程Ｓ３０、Ｓ３１の処理を行わない。
【００３７】
続いて、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１における処理行１０１の種別がグローバル変数の読み込み処理を示すか否かを判定する（Ｓ３２）。処理行１０１の種別がグローバル変数の読み込み処理を示す場合（Ｓ３２のＹＥＳ）、関数別解析情報作成部２２は、処理行１０１の変数名を、関数別解析情報ＤＢｄ２における処理行１０２の読み込み変数名集合の要素に追加する（Ｓ３３）。そして、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１における処理行１０１を次行に移動する（Ｓ３４）。一方、処理行１０１の種別がグローバル変数の読み込み処理を示さない場合（Ｓ３２のＮＯ）、関数別解析情報作成部２２は、工程Ｓ３３、Ｓ３４の処理を行わない。
【００３８】
続いて、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１における処理行１０１の種別が関数終了を示すか否かを判定する（Ｓ３５）。処理行１０１の種別が関数終了を示さない場合（Ｓ３５のＮＯ：３０）、関数別解析情報作成部２２は、再び、工程Ｓ２５の処理に戻る。一方、字句解析情報ＤＢｄ１における処理行１０１の種別が関数終了を示す場合（Ｓ３５のＹＥＳ）、関数別解析情報作成部２２は、処理行１０１を次行に移動する（Ｓ３６：１０）。そして、関数別解析情報作成部２２は、処理行１０１が字句解析情報ＤＢｄ１の最後尾の行に達していない場合（Ｓ２８）、再び、工程Ｓ２１の処理に戻る。
【００３９】
［関数別解析情報ＤＢの具体例］
図９は、関数別解析情報ＤＢｄ２の一例を示す図である。図９の関数別解析情報ＤＢｄ２は、図６の字句解析情報ＤＢｄ１に基づいて生成される。具体的に、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１の処理行１０１を参照して、関数開始種別であることを検知する（Ｓ２２のＹＥＳ）。これにより、関数別解析情報ＤＢｄ２の処理行１０２に対象関数名として関数ｆｕｎｃ１の名前が格納される（Ｓ２３）。続いて、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１の２行目に遷移した処理行１０１を参照して、グローバル変数書き込み種別であることを検知する（Ｓ２５のＮＯ、Ｓ２９のＹＥＳ）。これにより、関数別解析情報ＤＢｄ２における対象関数名ｆｕｎｃ１の書き込み変数名集合に、グローバル変数ｖａｒ１の名前が格納される（Ｓ３０）。
【００４０】
続いて、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１の３行目に遷移した処理行１０１を参照して、関数呼び出し種別であることを検知する（Ｓ３２のＮＯ、Ｓ３５のＮＯ、Ｓ２５のＹＥＳ）。これにより、関数別解析情報ＤＢｄ２における対象関数名ｆｕｎｃ１の呼び出し関数名集合に、関数ｆｕｎｃ２の名前が格納される（Ｓ２６）。同様にして、関数別解析情報作成部２２は、字句解析情報ＤＢｄ１の４行目に遷移した処理行１０１を参照して、関数終了種別であることを検知する（Ｓ２９のＮＯ、Ｓ３２のＮＯ、Ｓ３５のＹＥＳ）。このようにして、関数別解析情報ＤＢｄ２に、対象関数名ｆｕｎｃ１における呼び出し関数名集合として関数ｆｕｎｃ２、書き込み変数名集合としてｖａｒ１の情報が格納される。
【００４１】
同様にして、字句解析情報ＤＢｄ１に基づいて、他の関数ｆｕｎｃ２〜ｆｕｎｃ６についても、それぞれ、呼び出し関数名集合、書き込み変数名集合、読み込み変数名集合の情報が、関数別解析情報ＤＢｄ２に格納される。
【００４２】
続いて、プログラムの検査装置１０の関数集合作成部２３は、関数別解析情報ＤＢｄ２に基づいて、関数集合ＤＢｄ３を生成する（図４のＳ１３）。続いて、関数集合ＤＢｄ３の生成処理について説明する。
【００４３】
［関数集合ＤＢの生成処理（図４のＳ１３）］
図１０は、関数集合ＤＢｄ３の生成処理の流れを説明する第１のフローチャート図である。プログラムの検査装置１０の関数集合作成部２３は、まず、入力装置１５から入力された検査対象の関数名のうち、１つの検査対象の関数名を読み出す（Ｓ４１）。続いて、関数集合作成部２３は、関数別解析情報ＤＢｄ２から、検査対象の関数名と同一の対象関数名を検知し（Ｓ４２）、検知した行を処理行に設定する。続いて、関数集合作成部２３は、処理行が設定されたか否かを判定する（Ｓ４３）。
【００４４】
処理行が設定されない場合（Ｓ４３のＮＯ）、関数集合作成部２３は、検査対象の関数名の情報が関数別解析情報ＤＢｄ２内に存在しない旨の情報を出力し、処理を終了する（Ｓ４４）。これは、例えば、入力された、検査対象の関数名に誤りがあることを示す。一方、処理行が設定された場合（Ｓ４３のＹＥＳ）、関数集合作成部２３は、検出された処理行の対象関数名を関数集合ＤＢｄ３に追加する（Ｓ４５）。
【００４５】
図１１は、関数集合ＤＢｄ３の生成処理の流れを説明する第２のフローチャート図である。図１０のフローチャート図に続いて、関数集合作成部２３は、関数集合ＤＢｄ３における対象関数名について、工程Ｓ５２〜工程Ｓ５９の処理を繰り返す（Ｓ５１）。具体的に、関数集合作成部２３は、検出された対象関数名をキーとして、関数別解析情報ＤＢｄ２の対象関数名を探索する（Ｓ５２）。続いて、関数集合作成部２３は、関数別解析情報ＤＢｄ２における、検出された対象関数名の呼び出し関数名集合の要素分、工程Ｓ５４〜Ｓ５８の処理を繰り返す（Ｓ５３）。
【００４６】
まず、関数集合作成部２３は、選択した要素である対象の呼び出し関数名をキーとして、関数別解析情報ＤＢｄ２の対象関数名を探索する（Ｓ５４）。対象関数名が存在しない場合（Ｓ５５のＮＯ）、関数集合作成部２３は、呼び出し関数名が関数別解析情報ＤＢｄ２に登録されていない旨の表示を行う（Ｓ５６）。一方、対象関数名が存在する場合（Ｓ５５のＹＥＳ）、続いて、関数集合作成部２３は、関数集合ＤＢｄ３に対象関数名が既に格納されているか否かを判定する（Ｓ５７）。関数集合ＤＢｄ３に対象関数名が未格納の場合（Ｓ５７のＮＯ）、関数集合作成部２３は、対象の呼び出し関数名を、関数集合ＤＢｄ３に追加する（Ｓ５８）。続いて、関数集合作成部２３は、処理行の呼び出し関数名集合の要素分、工程Ｓ５４〜Ｓ５８の処理を繰り返したか否かを判定する（Ｓ５９）。繰り返しが完了していない場合（Ｓ５９のＮＯ）、関数集合作成部２３は、呼び出し関数名集合における別の要素の対象関数名について、工程Ｓ５４〜Ｓ５８の処理を行う。
【００４７】
一方、繰り返しが完了した場合（Ｓ５９のＹＥＳ）、関数集合作成部２３は、関数集合ＤＢｄ３に新たに追加された対象関数名について、さらに、工程Ｓ５２〜Ｓ５９の処理を行う（Ｓ６０）。そして、関数集合作成部２３は、関数集合ＤＢｄ３に追加された全ての対象関数名について工程Ｓ５２〜Ｓ５９の処理を行った場合、処理を終了する。
【００４８】
これにより、関数別解析情報ＤＢｄ２に基づいて、呼び出し元関数である検査対象の関数名と、検査対象の関数が連鎖的に呼び出す全ての関数名とのリストを有する関数集合ＤＢｄ３が生成される。また、関数集合作成部２３は、入力装置１５から入力された別の検査対象の関数名について、図１０、図１１のフローチャート図に基づいて、新たな関数集合ＤＢｄ３を生成する。即ち、１つの検査対象の関数名について、１つの関数集合ＤＢｄ３が生成される。
【００４９】
［関数集合ＤＢの具体例］
図１２は、関数集合ＤＢｄ３の一例を示す図である。図１２の関数集合ＤＢｄ３−１は関数ｆｕｎｃ１、関数集合ＤＢｄ３−２は関数ｆｕｎｃ５の関数リストである。まず、検査対象の関数ｆｕｎｃ１の関数集合ＤＢｄ３−１を生成する場合を例示する。関数集合作成部２３は、図９の関数別解析情報ＤＢｄ２から、検査対象の関数ｆｕｎｃ１と一致する対象関数名を検知し（図１０のＳ４２、Ｓ４３）、検知された処理行の対象関数名である関数ｆｕｎｃ１を関数集合ＤＢｄ３−１に追加する（図１０のＳ４５）。続いて、関数集合作成部２３は、関数ｆｕｎｃ１をキーとして、関数別解析情報ＤＢｄ２の対象関数名を探索し（図１１のＳ５１、Ｓ５２）、呼び出し関数名集合の要素として、関数ｆｕｎｃ２を検出する（図１１のＳ５３）。
【００５０】
続いて、関数集合作成部２３は、検出した関数ｆｕｎｃ２について、関数別解析情報ＤＢｄ２の対象関数名を探索する（図１１のＳ５４）。この場合、関数別解析情報ＤＢｄ２の対象関数名に関数ｆｕｎｃ２が存在するため（図１１のＳ５５のＹＥＳ）、関数集合作成部２３は、さらに、関数集合ＤＢｄ３−１に関数ｆｕｎｃ２の名前が存在するか否かを判定する（図１１のＳ５７）。関数集合ＤＢｄ３−１に、関数ｆｕｎｃ２の名前が存在しないため（図１１のＳ５７のＮＯ）、関数集合作成部２３は、関数ｆｕｎｃ２の名前を関数集合ＤＢｄ３−１に追加する（図１１のＳ５８）。この場合、図９の関数別解析情報ＤＢｄ２における対象関数名ｆｕｎｃ１の呼び出し関数名集合の要素は関数ｆｕｎｃ２のみであるため、関数集合作成部２３は、続いて、関数集合ＤＢｄ３−１における次の対象関数名、即ち、関数ｆｕｎｃ２を対象関数名として、工程Ｓ５２〜Ｓ５９の処理を行う（図１１のＳ６０）。
【００５１】
同様にして、関数集合作成部２３は、関数ｆｕｎｃ２をキーとして、関数別解析情報ＤＢｄ２の対象関数名を探索し、呼び出し関数名集合の要素として、関数ｆｕｎｃ３、ｆｕｎｃ４を検出する。関数ｆｕｎｃ３、ｆｕｎｃ４は、関数別解析情報ＤＢｄ２の対象関数名に存在し、関数集合ＤＢｄ３−１には存在しない。このため、関数ｆｕｎｃ３、ｆｕｎｃ４の名前が、関数集合ＤＢｄ３−１に追加される。そして、関数集合作成部２３は、検出した関数ｆｕｎｃ３、ｆｕｎｃ４をキーとして、関数別解析情報ＤＢｄ２の対象関数名を探索し（図１１のＳ５１、Ｓ５２）、呼び出し関数名集合の要素を検出する（図１１のＳ５３）。この場合、関数別解析情報ＤＢｄ２において、関数ｆｕｎｃ３、ｆｕｎｃ４の呼び出し関数名集合の要素が存在しないため、関数集合ＤＢｄ３−１の処理が終了する。これにより、検査対象の関数ｆｕｎｃ１と、関数ｆｕｎｃ１が連鎖的に呼び出す全ての関数ｆｕｎｃ２〜ｆｕｎｃ４との名前を有する関数集合ＤＢｄ３−１が生成される。
【００５２】
別の検査対象の関数である関数ｆｕｎｃ５についても、図１０、図１１のフローチャート図に基づいて、関数集合ＤＢｄ３−２が生成される。関数集合ＤＢｄ３−２は、検査対象の関数ｆｕｎｃ５と、関数ｆｕｎｃ５から連鎖的に呼び出される関数ｆｕｎｃ６とを有する。なお、関数集合ＤＢｄ３は、入力プログラムＳＣにおける全ての関数について生成されてもよいし、検査対象の関数についてのみ生成されてもよい。
【００５３】
そして、プログラムの検査装置１０の変数集合一致判定部２４は、関数別解析情報ＤＢｄ２及び関数集合ＤＢｄ３を参照して、２つの調査対象の関数の間で干渉するグローバル変数を検出する（Ｓ１４）。続いて、グローバル変数を検出処理について説明する。
［グローバル変数の検出処理（図４のＳ１４）］
図１３は、グローバル変数の検出処理の流れを説明する第１のフローチャート図である。第１〜第５のフローチャート図に基づいて、グローバル変数の検出処理の流れが説明される。この例において、検査対象の２つの関数を、第１の検査対象関数、第２の検査対象関数と称する。本実施の形態例では、例えば、第１の検査対象関数として関数ｆｕｎｃ１の名前が、第２の検査対象関数として関数ｆｕｎｃ５の名前が入力される。
【００５４】
プログラムの検査装置１０の変数集合一致判定部２４は、第１の検査対象関数を呼び出し元関数とする関数集合ＤＢｄ３が有する全ての関数について、関数別解析情報ＤＢｄ２における書き込み変数名集合を集めた変数名集合３１と、読み込み変数名集合を集めた変数名集合４１とを作成する（Ｓ７１）。図９の関数別解析情報ＤＢｄ２、及び、図１２の関数集合ＤＢｄ３に基づく場合、関数ｆｕｎｃ１（第１の検査対象関数）を呼び出し元関数とする関数集合ＤＢｄ３−１の関数ｆｕｎｃ１〜ｆｕｎｃ４について、関数別解析情報ＤＢｄ２の書き込み変数名集合を集めた変数名集合３１は、グローバル変数ｖａｒ１、ｖａｒ２である。また、関数ｆｕｎｃ１〜ｆｕｎｃ４について、関数別解析情報ＤＢｄ２の読み込み変数名集合を集めた変数名集合４１は、グローバル変数ｖａｒ３、ｖａｒ４である。
【００５５】
続いて、変数集合一致判定部２４は、第２の検査対象関数を呼び出し元関数とする関数集合ＤＢｄ３が有する全ての関数について、関数別解析情報ＤＢｄ２における書き込み変数名集合を集めた変数名集合３２と、読み込み変数名集合を集めた変数名集合４２とを作成する（Ｓ７２）。図９の関数別解析情報ＤＢｄ２、及び、図１２の関数集合ＤＢｄ３に基づく場合、関数ｆｕｎｃ５（第２の検査対象関数）を呼び出し元関数とする関数集合ＤＢｄ３−２の関数ｆｕｎｃ５、ｆｕｎｃ６について、関数別解析情報ＤＢｄ２の書き込み変数名集合を集めた変数名集合３２は、グローバル変数ｖａｒ１、ｖａｒ３である。また、関数ｆｕｎｃ５、ｆｕｎｃ６について、関数別解析情報ＤＢｄ２の読み込み変数名集合を集めた変数名集合４２は、空である。
【００５６】
続いて、変数集合一致判定部２４は、検査対象の関数である第１、第２の検査対象関数について、検出対象のアクセス処理の組み合わせパターンの選択を、入力装置１５から受け付ける（Ｓ７３）。工程Ｓ７３において、例えば、「第１の検査対象関数：書き込み処理／第２の検査対象関数：読み込み処理」の組み合わせパターンが選択される。この場合、工程Ｓ７４の処理が行われる。
【００５７】
任意の組み合わせパターンが指定可能になることにより、プログラムの検査装置１０は、検出の重要性の低い、組み合わせパターンを検出の対象外とすることができる。例えば、組み合わせパターン「第１の検査対象関数：読み込み処理／第２の検査対象関数：読み込み処理」によると、第１、第２の検査対象関数の関連関数において、共に読み込み処理が行われるグローバル変数が検出される。この場合、検出されたグローバル変数に起因して、障害が発生する可能性が低い。そこで、ユーザは、所望の組み合わせパターンを検出対象として、当該組み合わせパターンのアクセス処理下で干渉が生じ得るグローバル変数のみを検出させることができる。
【００５８】
そして、工程Ｓ７４の処理として、変数集合一致判定部２４は、変数名集合３１と変数名集合４２との間で、一致するグローバル変数名の集合７１を作成する。この場合、第１の検査対象関数及び関連関数において書き込み処理が行われるグローバル変数と、第２の検査対象関数及び関連関数において読み込み処理が行われるグローバル変数との間で、干渉が生じ得るグローバル変数が検出される。
【００５９】
前述したとおり、図９の関数別解析情報ＤＢｄ２、及び、図１２の関数集合ＤＢｄ３に基づく場合、第１の検査対象関数を呼び出し元関数とする関数集合ＤＢｄ３が有する全ての関数の書き込み変数名集合の変数名集合３１は、グローバル変数ｖａｒ１、ｖａｒ２である。また、第２の検査対象関数を呼び出し元関数とする関数集合ＤＢｄ３が有する全ての関数の読み込み変数名集合の変数名集合４２は、空である。そこで、変数集合一致判定部２４は、変数名集合３１（ｖａｒ１、ｖａｒ２）と、空の変数名集合４２との間で、一致するグローバル変数名の集合７１を作成する。この場合、一致するグローバル変数が存在しないため、集合７１は空である。
【００６０】
また、例えば、第１の検査対象関数の関連関数における読み込み処理対象のグローバル変数、第２の検査対象関数における書き込み処理対象のグローバル変数の組み合わせが選択された場合、変数集合一致判定部２４は、変数名集合４１と変数名集合３２との間で、一致するグローバル変数名の集合７２を作成する（Ｓ７５）。図９の関数別解析情報ＤＢｄ２、及び、図１２の関数集合ＤＢｄ３に基づく場合、第１の検査対象関数を呼び出し元関数とする関数集合ＤＢｄ３が有する全ての関数の読み込み変数名集合の変数名集合４１は、グローバル変数ｖａｒ３、ｖａｒ４である。また、第２の検査対象関数を呼び出し元関数とする関数集合ＤＢｄ３が有する全ての関数の書き込み変数名集合の変数名集合３２は、グローバル変数ｖａｒ１、ｖａｒ３である。そこで、変数集合一致判定部２４は、変数名集合４１（グローバル変数ｖａｒ３、ｖａｒ４）と、変数名集合３２（グローバル変数ｖａｒ１、ｖａｒ３）との間で、一致するグローバル変数名の集合７２（グローバル変数ｖａｒ３）を作成する。
【００６１】
また、例えば、第１の検査対象関数の関連関数における書き込み処理対象のグローバル変数、第２の検査対象関数における書き込み処理対象のグローバル変数の組み合わせが選択された場合、変数集合一致判定部２４は、変数名集合３１と変数名集合３２との間で、一致するグローバル変数名の集合７３を作成する（Ｓ７６）。図９の関数別解析情報ＤＢｄ２、及び、図１２の関数集合ＤＢｄ３に基づく場合、変数集合一致判定部２４は、変数名集合３１（グローバル変数ｖａｒ１、ｖａｒ２）と、変数名集合３２（グローバル変数ｖａｒ１、ｖａｒ３）との間で、一致するグローバル変数名の集合７３（グローバル変数ｖａｒ１）を作成する。
【００６２】
また、例えば、第１の検査対象関数の関連関数における読み込み処理対象のグローバル変数、第２の検査対象関数における読み込み処理対象のグローバル変数の組み合わせが選択された場合、変数集合一致判定部２４は、変数名集合４１と変数名集合４２との間で、一致するグローバル変数名の集合７４を作成する（Ｓ７７）。図９の関数別解析情報ＤＢｄ２、及び、図１２の関数集合ＤＢｄ３に基づく場合、変数集合一致判定部２４は、変数名集合４１（グローバル変数ｖａｒ３、ｖａｒ４）と、空の変数名集合４２との間で、一致するグローバル変数名の集合７４を作成する。この場合、一致するグローバル変数が存在しないため、集合７４は空である。
【００６３】
［第１の検査対象関数：書き込み処理／第２の検査対象関数：読み込み処理］
図１４は、グローバル変数の検出処理の流れを説明する第２のフローチャート図である。図１４のフローチャート図は、図１３の工程７４に続く処理を示す。変数集合一致判定部２４は、工程Ｓ７４において生成した変数名の集合７１が空か否かを判定する（Ｓ８１）。変数名の集合７１が空の場合（Ｓ８１のＹＥＳ）、変数集合一致判定部２４は、第１の検査対象関数の関数集合における書き込み対象のグローバル変数（変数名集合３１）、第２の検査対象関数の関数集合における読み込み対象のグローバル変数（変数名集合４２）との間で、一致するグローバル変数が存在しない旨、表示する。
【００６４】
一方、変数名の集合７１が空ではない場合（Ｓ８１のＮＯ）、変数集合一致判定部２４は、変数名の集合７１におけるそれぞれのグローバル変数について、工程Ｓ８４〜Ｓ８８の処理を行う。まず、変数集合一致判定部２４は、変数名の集合７１における対象のグローバル変数の名前を表示する（Ｓ８４）。続いて、変数集合一致判定部２４は、関数別解析情報ＤＢｄ２を参照し、第１の検査対象関数の関数集合ＤＢｄ３が有する各関数のうち、対象のグローバル変数が書き込み変数名集合に含まれる関数を検出する（Ｓ８５）。そして、変数集合一致判定部２４は、検出した関数の名前を表示する（Ｓ８６）。
【００６５】
また、変数集合一致判定部２４は、関数別解析情報ＤＢｄ２を参照し、第２の検査対象関数の関数集合ＤＢｄ３が有する各関数のうち、対象のグローバル変数が読み込み変数名集合に含まれる関数を検出する（Ｓ８７）。そして、変数集合一致判定部２４は、検出した関数の名前を表示する（Ｓ８８）。変数名の集合７１における全てのグローバル変数について工程Ｓ８４〜Ｓ８８の処理を行うと、変数集合一致判定部２４は処理を終了する。
【００６６】
図９の関数別解析情報ＤＢｄ２、及び、図１２の関数集合ＤＢｄ３に基づく場合、変数名の集合７１は空である（Ｓ８１のＹＥＳ）。したがって、変数集合一致判定部２４は、関数ｆｕｎｃ１（第１の検査対象関数）の関数集合における書き込み対象のグローバル変数、関数ｆｕｎｃ５（第２の検査対象関数）の関数集合における読み込み対象のグローバル変数との間で、一致するグローバル変数が存在しない旨、表示する。
【００６７】
［第１の検査対象関数：読み込み処理／第２の検査対象関数：書き込み処理］
図１５は、グローバル変数の検出処理の流れを説明する第３のフローチャート図である。図１５のフローチャート図は、図１３の工程７５に続く処理を示す。変数集合一致判定部２４は、工程Ｓ７５において生成した変数名の集合７２が空か否かを判定する（Ｓ９１）。変数名の集合７２が空の場合（Ｓ９１のＹＥＳ）、変数集合一致判定部２４は、第１の検査対象関数の関数集合における読み込み対象のグローバル変数（変数名集合４１）、第２の検査対象関数の関数集合における書き込み対象のグローバル変数（変数名集合３２）との間で、一致するグローバル変数が存在しない旨、表示する。
【００６８】
一方、変数名の集合７２が空ではない場合（Ｓ９１のＮＯ）、変数集合一致判定部２４は、変数名の集合７２におけるそれぞれのグローバル変数について、工程Ｓ９４〜Ｓ９８の処理を行う。まず、変数集合一致判定部２４は、変数名の集合７２における対象のグローバル変数の名前を表示する（Ｓ９４）。続いて、変数集合一致判定部２４は、関数別解析情報ＤＢｄ２を参照し、第１の検査対象関数の関数集合ＤＢｄ３が有する各関数のうち、対象のグローバル変数が読み込み変数名集合に含まれる関数を検出する（Ｓ９５）。そして、変数集合一致判定部２４は、検出した関数の名前を表示する（Ｓ９６）。
【００６９】
また、変数集合一致判定部２４は、関数別解析情報ＤＢｄ２を参照し、第２の検査対象関数の関数集合ＤＢｄ３が有する各関数のうち、対象のグローバル変数が書き込み変数名集合に含まれる関数を検出する（Ｓ９７）。そして、変数集合一致判定部２４は、検出した関数の名前を表示する（Ｓ９８）。変数名の集合７２における全てのグローバル変数について工程Ｓ９４〜Ｓ９８の処理を行うと、変数集合一致判定部２４は処理を終了する。
【００７０】
図９の関数別解析情報ＤＢｄ２、及び、図１２の関数集合ＤＢｄ３に基づく場合、変数名の集合７２はグローバル変数ｖａｒ３を有する。そこで、変数集合一致判定部２４は、関数別解析情報ＤＢｄ２を参照し、関数ｆｕｎｃ１（第１の検査対象関数）の関数集合ＤＢｄ３−１が有する関数ｆｕｎｃ１〜ｆｕｎｃ４のうち、グローバル変数ｖａｒ３が読み込み変数名集合に含まれる関数ｆｕｎｃ４を検出し、表示する（Ｓ９４〜Ｓ９６）。また、変数集合一致判定部２４は、関数別解析情報ＤＢｄ２を参照し、関数ｆｕｎｃ５（第２の検査対象関数）の関数集合ＤＢｄ３−２が有する関数ｆｕｎｃ５、ｆｕｎｃ６のうち、グローバル変数ｖａｒ３が書き込み変数名集合に含まれる関数ｆｕｎｃ５を検出し、表示する（Ｓ９７〜Ｓ９８）。
【００７１】
［第１の検査対象関数：書き込み処理／第２の検査対象関数：書き込み処理］
図１６は、グローバル変数の検出処理の流れを説明する第４のフローチャート図である。図１６のフローチャート図は、図１３の工程７６に続く処理を示す。変数集合一致判定部２４は、工程Ｓ７６において生成した変数名の集合７３が空か否かを判定する（Ｓ１０１）。変数名の集合７３が空の場合（Ｓ１０１のＹＥＳ）、変数集合一致判定部２４は、第１の検査対象関数の関数集合における書き込み対象のグローバル変数（変数名集合３１）、第２の検査対象関数の関数集合における書き込み対象のグローバル変数（変数名集合３２）との間で、一致するグローバル変数が存在しない旨、表示する。
【００７２】
一方、変数名の集合７３が空ではない場合（Ｓ１０１のＮＯ）、変数集合一致判定部２４は、変数名の集合７３におけるそれぞれのグローバル変数について、工程Ｓ１０４〜Ｓ１０８の処理を行う。まず、変数集合一致判定部２４は、変数名の集合７３における対象のグローバル変数の名前を表示する（Ｓ１０４）。続いて、変数集合一致判定部２４は、関数別解析情報ＤＢｄ２を参照し、第１の検査対象関数、及び、第２の検査対象関数の関数集合ＤＢｄ３が有する各関数のうち、対象のグローバル変数が書き込み変数名集合に含まれる関数を検出し、表示する（Ｓ１０５〜Ｓ１０７）。変数名の集合７３における全てのグローバル変数について工程Ｓ１０４〜Ｓ１０８の処理を行うと、変数集合一致判定部２４は処理を終了する。
【００７３】
図９の関数別解析情報ＤＢｄ２、及び、図１２の関数集合ＤＢｄ３に基づく場合、変数名の集合７３はグローバル変数ｖａｒ１を有する。そこで、変数集合一致判定部２４は、関数別解析情報ＤＢｄ２を参照し、関数ｆｕｎｃ１（第１の検査対象関数）の関数集合ＤＢｄ３−１が有する関数ｆｕｎｃ１〜ｆｕｎｃ４のうち、グローバル変数ｖａｒ１が書き込み変数名集合に含まれる関数ｆｕｎｃ１を検出し、表示する（Ｓ１０４〜Ｓ１０６）。また、変数集合一致判定部２４は、関数別解析情報ＤＢｄ２を参照し、関数ｆｕｎｃ５（第２の検査対象関数）の関数集合ＤＢｄ３−２が有する関数ｆｕｎｃ５、ｆｕｎｃ６のうち、グローバル変数ｖａｒ１が書き込み変数名集合に含まれる関数ｆｕｎｃ６を検出し、表示する（Ｓ１０７〜Ｓ１０８）。
【００７４】
［第１の検査対象関数：読み込み処理／第２の検査対象関数：読み込み処理］
図１７は、グローバル変数の検出処理の流れを説明する第５のフローチャート図である。図１７のフローチャート図は、図１３の工程７７に続く処理を示す。変数集合一致判定部２４は、工程Ｓ７７において生成した変数名の集合７４が空か否かを判定する（Ｓ１１１）。変数名の集合７４が空の場合（Ｓ１１１のＹＥＳ）、変数集合一致判定部２４は、第１の検査対象関数の関数集合における読み込み対象のグローバル変数（変数名集合４１）、第２の検査対象関数の関数集合における読み込み対象のグローバル変数（変数名集合４２）との間で、一致するグローバル変数が存在しない旨、表示する。
【００７５】
一方、変数名の集合７４が空ではない場合（Ｓ１１１のＮＯ）、変数集合一致判定部２４は、変数名の集合７４におけるそれぞれのグローバル変数について、工程Ｓ１１４〜Ｓ１１８の処理を行う。まず、変数集合一致判定部２４は、変数名の集合７４における対象のグローバル変数の名前を表示する（Ｓ１１４）。続いて、変数集合一致判定部２４は、関数別解析情報ＤＢｄ２を参照し、第１の検査対象関数、及び、第２の検査対象関数の関数集合ＤＢｄ３が有する各関数のうち、対象のグローバル変数が読み込み変数名集合に含まれる関数を検出し、表示する（Ｓ１１５〜Ｓ１１７）。変数名の集合７４における全てのグローバル変数について工程Ｓ１１４〜Ｓ１１８の処理を行うと、変数集合一致判定部２４は処理を終了する。
【００７６】
図９の関数別解析情報ＤＢｄ２、及び、図１２の関数集合ＤＢｄ３に基づく場合、変数名の集合７４は空である（Ｓ１１１のＹＥＳ）。したがって、変数集合一致判定部２４は、関数ｆｕｎｃ１（第１の検査対象関数）の関数集合における読み込み対象のグローバル変数、関数ｆｕｎｃ５（第２の検査対象関数）の関数集合における読み込み対象のグローバル変数との間で、一致するグローバル変数が存在しない旨、表示する。
【００７７】
［検出したグローバル変数の情報の出力例］
図１８は、検出されたグローバル変数の情報の出力例を示す図である。この例では、アクセス処理の全ての組み合わせパターンが入力された場合における出力例を示す。図１３〜図１７にかけてフローチャート図に基づいて説明してきたとおり、グローバル変数ｖａｒ３について、関数ｆｕｎｃ１から呼び出される関数ｆｕｎｃ４における書き込み処理と、関数ｆｕｎｃ５における読み込み処理との間で干渉が発生し得る（図１５）。そこで、プログラムの検査装置１０は、図１８の出力例Ｍ１に示すように、グローバル変数ｖａｒ３は関数ｆｕｎｃ１から呼び出された関数ｆｕｎｃ４の読み込み処理と、関数ｆｕｎｃ５の書き込み処理との間で、干渉が生じる可能性がある旨、表示する。
【００７８】
また、グローバル変数ｖａｒ１について、関数ｆｕｎｃ１における書き込み処理と、関数ｆｕｎｃ５から呼び出される関数ｆｕｎｃ６における書き込み処理との間で干渉が発生し得る（図１７）。そこで、プログラムの検査装置１０は、図１８の出力例Ｍ２に示すように、グローバル変数ｖａｒ１は関数ｆｕｎｃ１の書き込み処理と、関数ｆｕｎｃ５から呼び出された関数ｆｕｎｃ６の書き込み処理との間で、干渉が生じる可能性がある旨、表示する。
【００７９】
このように、本実施の形態例におけるプログラムの検査装置１０は、組み合わせパターン毎に、干渉が発生する可能性があるグローバル変数を検出する。これにより、ユーザは、干渉が発生する可能性のあるグローバル変数に加えて、プログラムにおける当該グローバル変数のアクセスの処理状態をあわせて検知することができる。これにより、ユーザは、より効率的に、プログラムの情報を検知しプログラムを修正することができる。なお、図１３〜図１７のフローチャート図において、検出対象のアクセス処理の組み合わせパターンが入力される（図１３のＳ７３）。ただし、プログラムの検査装置１０は、全ての組み合わせパターンを対象として、干渉が発生する可能性があるグローバル変数を検出してもよい。
【００８０】
なお、図１８の例において、例えば、表示例Ｍ１における関数ｆｕｎｃ４のように、検出されたグローバル変数ｖａｒ１に対して処理が行われる関数の名前が表示される。ただし、検出されたグローバル変数に対して処理が行われる関数の名前は、必ずしも出力される必要はない。また、本実施の形態例において、プログラムの検査装置１０に、第１、第２の検査対象関数が入力される。しかし、プログラムの検査装置１０は、入力プログラムＳＣに記述される全ての関数を対象として、少なくともいずれかは割り込み関数を示す２つの関数の全て組み合わせを抽出し、干渉が発生し得る可能性のあるグローバル変数を検出してもよい。これにより、入力プログラムＳＣにおいて、干渉が発生し得る可能性のあるグローバル変数が網羅的に検出される。
【００８１】
以上のように、本実施の形態例における検査処理は、プログラムのソースコードに基づいて、ソースコードに記述される関数別に、関数内でアクセス処理の対象となるグローバル変数、及び、書き込みまたは読み込みを示すアクセス処理の属性を有する解析情報を生成する関数別解析情報生成工程を有する。また、検査処理は、少なくともひとつは割り込み関数を示す第１、第２の検査対象関数と、第１、第２の検査対象関数が呼び出し元関数として連鎖的に呼び出す関数との情報を有する第１、第２の関数集合を生成する関数集合生成工程を有する。そして、検査処理は、解析情報に基づいて、第１、第２の関数集合に含まれる各関数のグローバル変数を抽出して第１、第２のグローバル変数集合を生成し、第１、第２のグローバル変数集合間で一致するグローバル変数と、一致するグローバル変数の第１、第２の検査対象関数におけるそれぞれのアクセス処理の属性とを検出するグローバル変数検出工程と、を有する。
【００８２】
このように、本実施の形態例におけるプログラムの検査装置１０は、プログラムのソースコードに基づいて、２つの関数間でアクセス処理が干渉するグローバル変数を効率的に、容易に検出することができる。また、本実施の形態例におけるプログラム検査用の装置は、呼び出し元の関数内でアクセス処理が行われるグローバル変数に加えて、呼び出し元の関数が呼び出す関数内でアクセス処理が行われるグローバル変数を対象として、２つの関数の間においてアクセス処理が干渉するグローバル変数を検出する。これにより、２つの関数の間においてアクセス処理が干渉する可能性のあるグローバル変数が、網羅的に検出可能になる。
【００８３】
さらに、本実施の形態例におけるプログラムの検査装置１０によると、２つの関数の間でアクセス処理が干渉するグローバル変数の情報に加えて、当該グローバル変数に対して行われるアクセス処理の属性（書き込み処理、読み込み処理）の情報が検出される。これにより、ユーザは、干渉が発生する可能性のあるグローバル変数に加えて、プログラムにおける当該グローバル変数のアクセスの処理状態をあわせて検知することができる。また、プログラムの検査装置１０は、プログラムのソースコード以外の情報を必要とすることなく、２つの関数間でアクセス処理が干渉するグローバル変数を検出することができる。これにより、ユーザの負荷が減少すると共に、プログラムの検査が実行可能になる。
【００８４】
また、本実施の形態例の検査処理におけるグローバル変数検出工程では、第１、第２の検査対象関数におけるアクセス処理の属性の組み合わせパターン毎に、一致するグローバル変数が検出される。このように、本実施の形態例におけるプログラムの検査装置１０は、アクセス処理の属性の組み合わせパターン毎に、干渉の可能性があるグローバル変数を検出することができる。これにより、ユーザは、アクセス処理の属性の組み合わせパターンに対応して、干渉の可能性があるグローバル変数を検知することができる。これにより、ユーザは、グローバル変数のアクセスの処理状態を組み合わせパターン毎に検知可能になることにより、プログラムにおけるグローバル変数のアクセス処理の状態をより効率的に把握可能になる。
【００８５】
また、本実施の形態例の検査処理におけるグローバル変数検出工程では、第１、第２の検査対象関数における検出対象のアクセス処理の属性の組み合わせパターンが入力され、検出対象のアクセス処理の属性の組み合わせパターンの第１、第２のグローバル変数集合間で一致するグローバル変数が検出される。
【００８６】
これにより、本実施の形態例におけるプログラムの検査装置１０は、検出対象の組み合わせパターンのアクセス処理下において干渉が発生する可能性があるグローバル変数のみを検出することができる。即ち、ユーザは、検出する必要のある組み合わせパターンのアクセス処理下において干渉が発生する可能性があるグローバル変数のみを検出することができる。また、プログラムの検査装置１０は、検出する必要のない組み合わせパターンを検出の対象外にすることができる。これにより、検出の不要なグローバル変数の出力が回避され、グローバル変数に係るプログラムの不要な確認処理が回避される。
【００８７】
また、本実施の形態例の検査処理において、アクセス処理の属性の組み合わせパターンは、第１、第２の検査対象関数について共に書き込み処理の属性を対象とするパターンと、第１、第２の検査対象関数について共に読み込み処理の属性を対象とするパターンと、第１の検査対象関数について書き込み処理の属性であって第２の検査対象関数について読み込み処理の属性を対象とするパターンと、第１の検査対象関数について読み込み処理の属性であって第２の検査対象関数について書き込み処理の属性を対象とするパターンと、を有する。これにより、ユーザは、アクセス処理の属性の組み合わせパターンに応じて、干渉の可能性があるグローバル変数を検知することができる。
【００８８】
また、本実施の形態例の検査処理における関数集合生成工程では、第１、第２の検査対象関数を指定する情報が入力される。これにより、ユーザは、任意の２つの検査対象関数を指定して、当該２つの検査対象関数の間で干渉が発生する可能性があるグローバル変数を検知することができる。また、本実施の形態例におけるプログラムの検査装置１０は、第１、第２の検査対象関数内でアクセス処理が行われるグローバル変数に加えて、第１、第２の検査対象関数が連鎖的に呼び出す関数内でアクセス処理が行われるグローバル変数も対象として、２つの関数の間においてアクセス処理が干渉するグローバル変数を検出する。このため、ユーザは、任意の２つの検査対象関数を指定するだけで、第１、第２の検査対象関数から呼び出される被呼び出し関数についても対象として、アクセス処理が干渉する可能性のあるグローバル変数を簡易に、網羅的に検出することができる。
【００８９】
また、本実施の形態例の検査処理におけるグローバル変数検出工程では、さらに、一致するグローバル変数のアクセス処理が行われる関数が検出される。これにより、ユーザは、検出されたグローバル変数の処理が実際に記述される関数の情報を特定することができ、効率的に、プログラムの修正を行うことができる。
【００９０】
また、本実施の形態例の検査処理は、さらに、グローバル変数検出工程において検出された一致するグローバル変数と、アクセス処理の属性とを出力するグローバル変数出力工程と、を有する。これにより、プログラムの検査装置１０は、検出したグローバル変数の情報、グローバル変数のアクセス処理の属性を任意の出力先に出力することができる。
【００９１】
また、本実施の形態例の検査処理における関数別解析情報生成工程では、さらに、関数内で呼び出される被呼び出し関数の情報を含む解析情報が生成される。そして、関数集合生成工程では、解析情報に基づいて、第１、第２の検査対象関数の第１の被呼び出し関数、及び、当該第１の被呼び出し関数の第２の被呼び出し関数の情報が連鎖的に検出され、第１、第２の関数集合が生成される。これにより、プログラムの検査装置１０は、第１、第２の検査対象関数と、第１、第２の検査対象関数から連鎖的に呼び出される関数とを有する関数リストを効率的に生成することができる。
【００９２】
［変形例］
図６の例において、プログラムの検査装置１０は、入力プログラムＳＣのソースコードＣＤに基づいて、字句解析情報ＤＢｄ１を生成する（図４のＳ１１）。ただし、プログラムの検査装置１０は、入力プログラムＳＣのソースコードＣＤの代わりに、プロセッサ１２が入力プログラムＳＣを実行した実行記録に基づいて、字句解析情報ＤＢｄ１を生成してもよい。実行記録には、実行した命令のアドレス、メモリの書き込みアドレス、メモリの読み込みアドレス等が含まれる。これにより、プログラムの検査装置１０は、ソースコードＣＤの代わりに、実行記録を解析して、関数の開始処理及び終了処理、関数の呼び出し処理、グローバル変数の読み込み処理、書き込み処理を示すコードを識別し、字句解析情報ＤＢｄ１を生成することができる。
【００９３】
これにより、プログラムの検査装置１０は、入力プログラムＳＣのソースコードＣＤが存在しない場合であっても、２つの関数間でアクセス処理が干渉するグローバル変数を効率的に、容易に検出することができる。また、プログラムの検査装置１０は、実行記録に基づくことにより、ソースコードＣＤの解析では検知できなかったポインタ経由のグローバル変数へのアクセス処理を検知可能になる。これにより、プログラムの検査装置１０は、より高精度に、２つの関数間でアクセス処理が干渉するグローバル変数を検出することができる。
【００９４】
以上の実施の形態をまとめると、次の付記のとおりである。
【００９５】
（付記１）
２つの関数の間で、アクセス処理が干渉するグローバル変数を検査する、プログラムの検査処理をコンピュータに実行させる、プログラムの検査プログラムであって、
前記検査処理は、
前記プログラムのソースコードに基づいて、前記ソースコードに記述される関数別に、前記関数内でアクセス処理の対象となるグローバル変数、及び、書き込みまたは読み込みを示すアクセス処理の属性を有する解析情報を生成する関数別解析情報生成工程と、
少なくともひとつは割り込み関数を示す第１、第２の検査対象関数と、前記第１、第２の検査対象関数が呼び出し元関数として連鎖的に呼び出す関数との情報を有する第１、第２の関数集合を生成する関数集合生成工程と、
前記解析情報に基づいて、前記第１、第２の関数集合に含まれる各関数の前記グローバル変数を抽出して第１、第２のグローバル変数集合を生成し、前記第１、第２のグローバル変数集合間で一致するグローバル変数と、前記一致するグローバル変数の前記第１、第２の検査対象関数におけるそれぞれのアクセス処理の属性とを検出するグローバル変数検出工程と、を有する検査プログラム。
【００９６】
（付記２）
付記１において、
前記グローバル変数検出工程では、前記第１、第２の検査対象関数における前記アクセス処理の属性の組み合わせパターン毎に、前記一致するグローバル変数が検出される検査プログラム。
【００９７】
（付記３）
付記１において、
前記グローバル変数検出工程では、前記第１、第２の検査対象関数における検出対象の前記アクセス処理の属性の組み合わせパターンが入力され、前記検出対象の前記アクセス処理の属性の組み合わせパターンの前記第１、第２のグローバル変数集合間で一致するグローバル変数が検出される検査プログラム。
【００９８】
（付記４）
付記２または３において、
前記アクセス処理の属性の組み合わせパターンは、前記第１、第２の検査対象関数について共に書き込み処理の属性を対象とするパターンと、前記第１、第２の検査対象関数について共に読み込み処理の属性を対象とするパターンと、前記第１の検査対象関数について書き込み処理の属性であって前記第２の検査対象関数について読み込み処理の属性を対象とするパターンと、前記第１の検査対象関数について読み込み処理の属性であって前記第２の検査対象関数について書き込み処理の属性を対象とするパターンと、を有する検査プログラム。
【００９９】
（付記５）
付記１乃至４のいずれかにおいて、
前記関数集合生成工程では、前記第１、第２の検査対象関数を指定する情報が入力される検査プログラム。
【０１００】
（付記６）
付記１乃至５のいずれかにおいて、
前記グローバル変数検出工程では、さらに、前記一致するグローバル変数の前記アクセス処理が行われる関数が検出される検査プログラム。
【０１０１】
（付記７）
付記１乃至６のいずれかにおいて、
前記プログラムの検査処理は、さらに、
前記グローバル変数検出工程において検出された前記一致するグローバル変数と、前記アクセス処理の属性とを出力するグローバル変数出力工程と、を有する検査プログラム。
【０１０２】
（付記８）
付記１乃至７のいずれかにおいて、
前記関数別解析情報生成工程では、さらに、前記関数内で呼び出される被呼び出し関数の情報を含む前記解析情報を生成し、
前記関数集合生成工程では、前記解析情報に基づいて、前記第１、第２の検査対象関数の第１の被呼び出し関数、及び、当該第１の被呼び出し関数の第２の被呼び出し関数の情報を連鎖的に検出し、前記第１、第２の関数集合を生成する検査プログラム。
【０１０３】
（付記９）
付記８において、
前記関数別解析情報生成工程では、前記ソースコードに記述される前記関数の開始コード及び終了コード、前記被呼び出し関数の呼び出しコード、前記グローバル変数の書き込み処理コード及び読み込み処理コードを検出し、前記関数の開始コードから前記終了コードの間に記述される、前記被呼び出し関数の呼び出しコードを前記被呼び出し関数の情報、前記グローバル変数の書き込み処理コード、前記読み込み処理コードを前記アクセス処理の対象となるグローバル変数、及び、前記アクセス処理の属性として検出し、前記解析情報を生成する検査プログラム。
【０１０４】
（付記１０）
２つの関数の間で、アクセス処理が干渉するグローバル変数を検査する、プログラムの検査方法であって、
前記プログラムのソースコードに基づいて、前記ソースコードに記述される関数別に、前記関数内でアクセス処理の対象となるグローバル変数、及び、書き込みまたは読み込みを示すアクセス処理の属性を有する解析情報を生成する関数別解析情報生成工程と、
少なくともひとつは割り込み関数を示す第１、第２の検査対象関数と、前記第１、第２の検査対象関数が呼び出し元関数として連鎖的に呼び出す関数との情報を有する第１、第２の関数集合を生成する関数集合生成工程と、
前記解析情報に基づいて、前記第１、第２の関数集合に含まれる各関数の前記グローバル変数を抽出して第１、第２のグローバル変数集合を生成し、前記第１、第２のグローバル変数集合間で一致するグローバル変数と、前記一致するグローバル変数の前記第１、第２の検査対象関数におけるそれぞれのアクセス処理の属性とを検出するグローバル変数検出工程と、を有する検査方法。
【０１０５】
（付記１１）
２つの関数の間で、アクセス処理が干渉するグローバル変数を検査する、プログラムの検査装置であって、
前記プログラムのソースコードに基づいて、前記ソースコードに記述される関数別に、前記関数内でアクセス処理の対象となるグローバル変数、及び、書き込みまたは読み込みを示すアクセス処理の属性を有する解析情報を生成する関数別解析情報生成手段と、
少なくともひとつは割り込み関数を示す第１、第２の検査対象関数と、前記第１、第２の検査対象関数が呼び出し元関数として連鎖的に呼び出す関数との情報を有する第１、第２の関数集合を生成する関数集合生成手段と、
前記解析情報に基づいて、前記第１、第２の関数集合に含まれる各関数の前記グローバル変数を抽出して第１、第２のグローバル変数集合を生成し、前記第１、第２のグローバル変数集合間で一致するグローバル変数と、前記一致するグローバル変数の前記第１、第２の検査対象関数におけるそれぞれのアクセス処理の属性とを検出するグローバル変数検出手段と、を有する検査装置。
【符号の説明】
【０１０６】
１０：プログラムの検査装置、１１：記憶装置、１２：プロセッサ、１３：Ｉ／Ｏ制御装置、１４：メモリ、１５：入力装置、１６：出力装置、ＰＲ：プログラムの検査プログラム、
２１：字句解析・意味解析部、２２：関数別解析情報作成部、２３：関数集合作成部、２４：変数集合一致判定部
【図１】
2015022484.tif 000003
【図２】
2015022484.tif 000004
【図３】
2015022484.tif 000005
【図４】
2015022484.tif 000006
【図５】
2015022484.tif 000007
【図６】
2015022484.tif 000008
【図７】
2015022484.tif 000009
【図８】
2015022484.tif 000010
【図９】
2015022484.tif 000011
【図１０】
2015022484.tif 000012
【図１１】
2015022484.tif 000013
【図１２】
2015022484.tif 000014
【図１３】
2015022484.tif 000015
【図１４】
2015022484.tif 000016
【図１５】
2015022484.tif 000017
【図１６】
2015022484.tif 000018
【図１７】
2015022484.tif 000019
【図１８】
2015022484.tif 000020