制御ソフトウェアを解析して、割込み関数を判定する割込み関数判定手段と、前記制御ソフトウェアを解析して、前記割込み関数判定手段により判定された前記割込み関数がアクセスする変数のうち、書き込みアクセスする変数を少なくとも1つ含む変数を判定対象変数とし、該判定対象変数にアクセスする関数である判定対象関数が、該判定対象変数に複数回のアクセスを行う間に前記割込み関数による割込みが可能であるか否かを判定して判定結果を出力する処理を行う処理手段と、を備えていることを特徴とするソフトウェア解析装置。前記制御ソフトウェアを解析して各関数が呼び出す関数を判定し、関数ツリー情報として保存する関数ツリー情報保存手段をさらに備えており、前記処理手段は、前記判定対象関数の処理を解析して、前記割込み関数による割込みが可能であるか否かを判定し、前記判定対象関数の処理から、前記割込み関数による割込みが可能であるか否かを判定できない場合、前記関数ツリー情報から前記判定対象関数を呼び出す関数を判定し、該呼び出す関数の処理を解析して前記割込み関数による割込みが可能であるか否かを判定することを特徴とする請求項1に記載のソフトウェア解析装置。前記処理手段は、前記割込み関数による割込みが可能であるか否かを示す割込み制御レジスタへの設定を行う前記制御ソフトウェアの命令から、前記割込み関数による割込みが可能であるか否かを判定することを特徴とする請求項1又は2に記載のソフトウェア解析装置。前記制御レジスタの設定は、割込みマスクおよび割込みレベルの設定を含み、前記割込みレベルの設定値が、前記割込みマスクの設定値より高い値である場合に、前記処理手段は、割込みが可能であると判定することを特徴とする請求項3に記載のソフトウェア解析装置。前記制御レジスタの設定は、さらに、割込み可/不可の設定を含み、前記割込み可/不可の設定が割込み可能であることを示し、かつ、前記割込みレベルの設定値が、前記割込みマスクの設定値より高い値である場合に、前記処理手段は、割込みが可能であると判定することを特徴とする請求項4に記載のソフトウェア解析装置。前記処理手段は、前記割込み関数が書き込みアクセスする変数を前記判定対象変数と判定し、前記判定対象関数が、前記判定対象変数に読み出しアクセスし、その次に前記判定対象変数に読み出し又は書き込みアクセスするまでに、前記割込み関数による割込みが可能であるか否かを判定することを特徴とする請求項1から5のいずれか1項に記載のソフトウェア解析装置。前記処理手段は、前記割込み関数が、条件分岐のために第1の変数に読み出しアクセスを行う場合、前記第1の変数および前記第1の変数への前記読み出しアクセスの後に書き込みアクセスをする第2の変数を前記判定対象変数と判定し、前記判定対象関数が、前記第2の変数に書き込みアクセスし、その次に前記第1の変数に書き込みアクセスするまでに、前記割込み関数による割込みが可能であるか否かを判定することを特徴とする請求項1から5のいずれか1項に記載のソフトウェア解析装置。前記制御ソフトウェアを解析して、各関数がアクセスする変数および該アクセスが書き込みアクセスであるか読み出しアクセスであるかを示す情報を含む関数アクセス情報を保存する関数アクセス情報保存手段をさらに備えており、前記処理手段は、前記判定対象変数および前記判定対象関数の判定に、前記関数アクセス情報を利用することを特徴とする請求項1から7のいずれか1項に記載のソフトウェア解析装置。請求項1から8のいずれか1項に記載のソフトウェア解析装置としてコンピュータを機能させることを特徴とするプログラム。しかしながら、特許文献1及び2に記載の方法では、特別なハードウェア基板を作成する必要がありコスト高となる。さらに、デバッグ期間中に、並行アクセスによる問題を発生させることができない可能性もある。本発明は、装置の制御ソフトウェアに関し、特別なハードウェア基板を使用することなく、並行アクセスによる問題が生じる可能性があるか否かを解析するソフトウェア解析装置及びそのためのプログラムを提供するものである。本発明によるソフトウェア解析装置は、制御ソフトウェアを解析して、割込み関数を判定する割込み関数判定手段と、制御ソフトウェアを解析して、前記割込み関数判定手段により判定された割込み関数がアクセスする変数のうち、書き込みアクセスする変数を少なくとも1つ含む変数を判定対象変数とし、当該判定対象変数にアクセスする関数である判定対象関数が、当該判定対象変数に複数回のアクセスを行う間に割込み関数による割込みが可能であるか否かを判定して判定結果を出力する処理を行う処理手段と、を備えていることを特徴とする。特別なハードウェア基板を使用することなく、並行アクセスによる問題が生じる可能性を判定することができる。第一実施形態本発明においてソフトウェア解析装置は、コンピュータシステム201上でプログラムを実行することで実現でき、そのハードウェア構成を図2に示す。図2の本体部202のハードディスク202cには、ソフトウェア解析装置の各機能を実現するためのプログラムが格納される。中央処理部CPU202aは、プログラム及び各種データを主記憶部202bにロードして実行することで、コンピュータシステム201はソフトウェア解析装置として動作する。なお、表示装置203は、本体部202からの指示により画面表示を行う。また、キーボード204は、このコンピュータシステム201にユーザの指示や文字情報を入力するためのものである。さらに、マウス205は、表示装置203上の任意の位置を指定することによりその位置に表示されていたアイコン等に応じた指示を入力するためのものである。図3は、本実施形態の説明に使用するプログラムであり、図4は、図3のプログラムに対応するアセンブラコードを示している。図3のプログラムにおいては、関数mainと、割込みにより呼び出される関数int_00以下、割込み関数と呼ぶ。と、関数mainから呼び出される関数aの3つの関数が存在する。関数mainのC13行の処理は、割込みレベルの設定であり、C15行の処理は、割込み状態の設定である。以下、図5を用いて、割込みレベルと、割込み状態の設定について説明する。図5は、割込みに関する制御レジスタであり、IL0~IL2ビットが割込みレベルを、ILM0~ILM2とIEビットが割込み状態を示している。なお、ILM0~ILM2ビットは割込みマスクを、IEビットは割込みの可/不可を示している。本実施形態においては、IEビットの設定値が0である場合は割込み不可を示し、設定値が1である場合は割込み可を示すものとする。また、割込みレベルについてはIL2が、割込み状態についてはILM2がMSBであるものとする。割込みは、IEビットが割込み可能を示し、かつ、割込みレベルの設定値が割込みマスクの設置値より高い強い値であるときのみ実行される。なお、本実施形態においては、値が小さい程、高い強いものとする。つまり、割込みレベルが2で、割込みマスクが0である場合は、IEビットの値に拘わらず割込みは禁止となる。一方、割込みレベルが2で、割込みマスクが3である場合は、IEビットが割込み可を示している場合には割込みが可能であり、IEビットが割込み不可を示している場合には割込みが不可となる。図3のC13行の処理においては、割込みレベルに3を、つまり、IL2に0を、IL1に1を、IL0に0を設定している。また、C15行の処理においては、割込み状態に7を設定している。つまり、ILM2に0を、ILM1に1を、ILM0に1を、IEに1を設定しており、これは、割込みマスクに値3を設定し、割込み可/不可を割込み可に設定するものである。関数mainは、C14行の処理で変数xに3を設定して、C16行の処理で関数aを呼出す。関数aは、xが0であればyを1に設定し、xが3であればyを2に設定する。また、割込み関数int_00は、xを1だけ減ずる処理を行う。例えば、関数mainでxに3を設定後、関数aを呼び出すと、図4のA04行の処理、つまり、xが0であるか否かを判定する処理において、xが0ではないためA08行に移行する。その後、A11行において、xが3であるか否かの判定が行われる。xは3であるため、A12行の処理においてはA16行に移行せず、A13行及びA14行の処理においてyに2が設定される。しかしながら、A12行の実行後、A14行が実行されるまでの間に、割込み関数int_00が実行されると、x=2、y=2と言う値になり、誤動作を引き起こす可能性が生じる。つまり、例えば、割込み関数が、ある変数に書き込みアクセスを行い、かつ、割込まれる側の関数が当該変数に読み出しアクセスを複数回行う場合、割込み関数の呼び出しタイミングによっては、並行アクセスによる問題が生じる。本実施形態は、その様な可能性があるか否かを解析するものである。図6は、本実施形態におけるソフトウェア解析装置の機能ブロック成図であり、図1は、ソフトウェア解析装置が実行する解析処理のフローチャートである。割込関数判定部1は、S1において、制御ソフトウェアを解析して割込みベクタテーブルを生成し、割込み関数を判定する。割込みベクタテーブルとは、割込み要因と、その要因の発生により処理するコードの先頭アドレス、つまり割込み関数の対応関係を示すものである。図7に、例示的な、割込みベクタテーブルを示す。符号601で示す行のアドレスは、ハードウェア割込み要因に対応するアドレスで、このアドレスに対応する割込みが発生した場合に、符号602が示すラベル名に対応する処理、つまり、符号603で示す処理に分岐する。符号603は、符号604で示す行において、関数int_00を呼び出している。割込関数判定部1は、割込みベクタテーブルに基づき、割込み要因と、その割込み要因が発生した時に呼び出される関数、つまり、割込み関数についての情報を取得して記憶部5に保存する。続いて、関数アクセス情報保存部2は、S2において、制御ソフトウェアの各関数について、関数がアクセスする変数と、その種別及び回数を判定する。なお、アクセス種別とは、変数に対する読み出し又は書き込みである。この処理は、アセンブラコードを解析することにより行うことができる。具体的には、データ転送命令や、1つの命令でデータの読み出し、値の変更及び書き込みを行う、インクリメント又はデクリメント操作といった更新命令や、変数の値により分岐する条件分岐命令等により、変数へのアクセスと、その種別を判定することができる。図4のアセンブラコードにおいて、A03行及びA09行は、変数xに対する読み出しアクセスであり、A06及びA14行の処理は、それぞれ、変数yに対する値1及び2の書き込みアクセスである。また、A23行の処理は、割込み制御レジスタの割込みレベルへの値2の書き込みアクセスであり、A25行の処理は変数xへの値3の書き込みアクセスであり、A26行の処理は、割込み制御レジスタの割込み状態への値7の書き込みアクセスである。さらに、A33行は、変数xを読み出した後、変数xを1だけ減ずる書き込みアクセスである。関数アクセス情報保存部2は、各関数がアクセスする変数、種別及びその回数を、関数アクセス情報として記憶部5に保存する。なお、本実施形態において、A33行に示す様なインクリメント又はデクリメント操作は書き込みアクセスとして取り扱う。続いて、関数ツリー情報保存部3は、S3において、制御ソフトウェアを解析して関数の呼び出し関係を判定して、関数の呼び出し関係を示す関数ツリー情報を作成して記憶部5に保存する。図8は、関数ツリー情報の作成処理のフローチャートである。S11において、関数ツリー情報保存部3は、制御ソフトウェアのコードから、関数を呼び出す呼出し処理を抽出する。S12において、関数ツリー情報保存部3は、呼出しが関数名により行われているか、ポインタにより行われているかを判定する。関数名で呼び出されている場合、関数ツリー情報保存部3は、S15において、関数と、その関数が呼び出す他の関数との関係を保存する。なお、S12において、ポインタで呼び出しが行われている場合、関数ツリー情報保存部3は、S13において、ポインタが関数ポインタ固定値テーブルを示しているか否かを判定する。ポインタが関数ポインタ固定値テーブルを示している場合、関数ツリー情報保存部3は、S15において、関数ポインタ固定値テーブルから呼び出される関数名を判定して保存する。また、S13において、ポインタが関数ポインタ固定値テーブルを示していない場合、関数ツリー情報保存部3は、S14において、ポインタが、関数ポインタテーブルが書き込まれるメモリを示しているか否かを判定する。関数ポインタテーブルが書き込まれるメモリを示している場合、関数ツリー情報保存部3は、S15において、メモリから呼び出される関数名を判定して保存する。以上の様に、関数と、その関数により呼び出される関数の関係を判定する。ある関数に呼び出される関数が、更に呼び出す関数を調べることにより、制御ソフトウェアの関数の呼び出し関係の全体を示すツリー情報を生成することができる。例えば、図3及び図4に示すコードから、関数mainが、関数aを関数名で呼び出すことと、割込み関数int_00は、他の関数を呼び出さないことが判定される。図1に戻り、処理部4は、S4において、割込み関数が書き込みアクセスする変数を判定して、判定対象変数とする。この処理は、関数アクセス情報保存部2が生成した関数アクセス情報を利用することができる。例えば、図3及び図4に示すプログラムの割込み関数int_00においては、変数xが判定対象変数と判定される。なお、S4の処理において、割込み関数が他の関数を呼び出す場合には、呼び出した他の関数における処理も割込み関数による処理として扱う。続いて、処理部4は、判定対象変数に複数回読み出しアクセスする関数を、S5において判定して、判定対象関数とする。例えば、図3及び図4に示すプログラムにおいて関数aは変数xが0ではない場合、変数xに読み出しアクセスを2回行うので判定対象関数として判定される。なお、この処理も、関数アクセス情報保存部2が生成した関数アクセス情報を利用することができる。最後に、処理部4は、S5にて判定した判定対象関数それぞれについて、並行アクセスによる問題が生じる可能性を判定する。図9は、処理部4が、S6において実行する判定処理のフローチャートである。まず、処理部4は、S22において、判定対象関数及び判定対象関数が呼び出す関数の処理を順に解析する。そして、判定対象関数が判定対象変数に複数回の読み出しアクセスを行う間に、判定対象変数に書き込みアクセスする割込み関数による割込みが可能であるか否かを判定する。つまり、判定対象関数が判定対象変数に読み出しアクセスし、次に判定対象関数が判定対象変数に読み出しアクセスするまでに、当該割込み関数による割込みが可能であるか否かを判定する。なお、判定対象関数からの処理に条件分岐がある場合には、各分岐のパターンに対してその処理を解析する。複数回の読み出しアクセスの間、当該割込み関数による割込みが可能である場合、処理部4は、並行アクセスによる問題が生じる可能性が有ると判定する。一方、当該割込み関数による割込みが不可である場合、処理部4は、並行アクセスによる問題が生じる可能性が無いと判定する。問題が生じる可能性の有無を判定できた場合、処理部4は、S23において、判定可能であると判定して、判定結果、つまり、問題が生じる可能性の有無を図示しない出力部経由で出力して処理を終了する。一方、連続する読み出しアクセスの間に当該割込み関数による割込みが可能である否かを判定できない場合、処理部4は、S23において判定不可と判定する。この場合、処理部4は、S24において、判定対象関数を呼び出す関数を、判定対象関数に変更してS23の処理を繰り返す。なお、このとき処理部4は、関数ツリー情報保存部3が生成した関数ツリー情報に基づき判定対象関数を呼び出す関数を判定する。例えば、図3及び図4のプログラムにおいて、S5の処理で関数aが判定対象関数として判定されているため、図4のA01行からA18行の処理を順に実行する。A01行からA18行の処理においては、変数xが0以外の値であると、判定対象変数である変数xに対する読み出しアクセスが2回続けて行われる。しかしながら、割込み制御レジスタに対する設定がなく、割込みレベル及び割込み状態共に未定義であるため、割込み関数int_00の実行が可能であるか否かが判定できない。したがって、S23では判定不可となり、処理部4は、S24において関数aを呼び出す関数mainを判定対象関数とする。関数mainにおいては、割込みレベルを値2に、割込みマスクを値3に、割込み可/不可を割込み可に設定しているため、処理部4は、関数aにおける変数xへの2回の読み出しアクセスの間、割込み関数int_00が実行され得ることを認識する。したがって、処理部4は、S23において、並行アクセスによる問題が生じ得ると判定する。第二実施形態続いて、第二実施形態について第一実施形態との相違点を中心に説明する。第一実施形態は、判定対象変数に対する複数回の読み出しアクセスの間に、判定対象変数に書き込みアクセスを行う割込み関数の実行が可能であるか否かを判定するものであった。本実施形態は、判定対象変数に対する読み出しアクセス後、書き込みアクセスを行うまでの間に、割込み関数が判定対象変数への書き込みアクセスを実行し得るか否かを判定する。図10に本実施形態で使用するプログラムを、図11に図10のプログラムに対応するアセンブラコードを示す。図10のプログラムにおいては、関数mainと、割込み関数int_00と、関数mainから呼び出される関数a及び関数bの4つの関数が存在する。関数mainのC10行及びC13行の処理は、第一実施形態と同じく、割込みレベル及び割込み状態の設定である。C14行の処理は、funcに関数bのアドレス情報を書き込むものであり、C16行のif文がTrueであるときの処理は、funcと言うRAMの値を用いたポインタ呼び出しである。また、C07行において、tableAに関数aを格納することが宣言されており、C17行の処理は、tableAを示すポインタ呼出しである。したがって、関数ツリー情報保存部3は、図8のS13の処理で、関数mainが関数bを呼び出すことを判定し、図8のS14の処理で、関数mainが関数aを呼び出すことを判定する。関数mainは、C11行の処理で変数xに3を設定して、C16行及びC17行の処理で、変数xの値に応じて関数a又はbを呼出す。関数aは、xに2を設定し、関数bは、xに3を設定する。また、割込み関数int_00は、xを1だけ減ずる処理を行う。例えば、関数mainのif文により呼び出す関数を判定後、呼出した関数を実行するまでに、割込みが生じるものとする。この場合、割込み関数int_00が変数xを更新したとしても、割り込み前の変数xの値に基づき呼び出された関数が、さらに、その変数xを上書きすることになり問題が生じ得る。なお、図11のアセンブラコードにおいて、変数への読み出しアクセスは、A23行、A25行及びA09行の処理であり、変数への書き込みアクセスは、それぞれ、A06、A12、A19、A21、A22、A24及びA41行の処理である。図11のプログラムにおいて、割込み関数int_00は変数xに対する書き込みアクセスをA41行で実行するため、図1のS4において判定対象変数は、変数xとなる。また、変数xに対して複数回のアクセスを行うのは関数mainであるため、図1のS5において判定対象関数は関数mainとなる。したがって、処理部4は、S6において、関数mainの処理を順に解析し、図9のif文の実行において変数xに対して読み出しアクセスを実行した後、関数a又はbを読み出して変数xに対する書き込みアクセスを行うことを認識する。さらに、割込みレベルを値2に、割込みマスクを値3に、割込み可/不可を割込み可に設定しているため、処理部4は、変数xへ読み出しアクセスから書き込みアクセスの間に、割込み関数int_00が実行され得ることを認識する。したがって、処理部4は、並行アクセスによる問題が生じ得ると判定する。第三実施形態続いて、第三実施形態について第一実施形態との相違点を中心に説明する。図12に本実施形態で使用するプログラムを、図13に図12のプログラムに対応するアセンブラコードを示す。図12のプログラムにおいては、関数mainと、割込み関数int_00と、関数mainから呼び出される関数aの3つの関数が存在する。関数mainのC08行及びC11行の処理は、第一実施形態と同じく、割込みレベル及び割込み状態の設定である。関数mainは、C09行の処理で変数xに3を設定し、C10行の処理で変数yに1を設定する。その後、C12行の処理で関数aを呼び出す。関数aは、C03行の処理で変数xに値2を、C04行の処理で変数yに0を設定する。また、割込み関数int_00は、yが0以外であれば、xに1を設定する処理を行う。例えば、関数mainで変数x及びyに値3及び1を設定後、関数aのC03行とC04行の処理の間に割込みが生じるものとする。この場合、割込み関数int_00が変数xを1に更新し、よって、変数x及びyは、それぞれ、値1及び0となり、これは、関数a及び割込み関数int_00のいずれの実行結果とも異なるものである。本実施形態はこの様な問題を検出するためのものである。したがって、本実施形態においては、判定対象変数は2つであり、一方が条件分岐の判定のために割込関数において読み出される第1の変数であり、他方は、その後に書き込みアクセスされる第2の変数である。なお、第2の変数は第1の変数とは異なる変数である。処理部4は、図1のS4において、条件分岐に使用される第1の変数に対する読み出しアクセス後に、第2の変数への書き込みアクセスを割込み関数が行う場合、その2つの変数を判定対象変数と判定する。この処理は、処理部4が割込み関数の処理を解析することにより行うことができる。また、問題が発生する可能性があるのは、第2の変数、第1の変数の順で書き込みアクセスを行う間に、割込みが発生することである。したがって、処理部4は、図1のS5において、関数アクセス情報に基づき、第1の変数及び第2の変数の両方に書き込みアクセスする関数を判定対象関数として選択する。なお、図12のアセンブラコードにおいて、変数への読み出しアクセスはA23行の処理であり、変数への書き込みアクセスは、それぞれ、A04、A06、A12、A14、A16、A17及びA26行の処理である。図12及び図13のプログラムにおいて、割込み関数int_00は変数yに対する読み出しアクセスをA23行で実行後、A26行で変数xに対する書き込みアクセスを実行する。したがって、図1のS4において、判定対象変数は、第1の変数y及び第2の変数xとなる。また、関数mainは、変数xに対する1回の書き込みアクセスと、変数yに対する1回の書き込みアクセス、つまり、判定対象変数に対する計2回のアクセスを行う。さらに、関数aも、変数xに対する1回の書き込みアクセスと、変数yに対する1回の書き込みアクセス、つまり、判定対象変数に対する計2回のアクセスを行う。したがって、図1のS5において、判定対象変数に複数回のアクセスを行う判定対象関数として、関数main及び関数aが判定される。しかしながら、関数ツリー情報により、関数mainが関数aを呼び出すことが分かるため、関数mainのみを判定対象関数とする。したがって、処理部4は、S6において、関数mainの処理を順に解析し、関数aの呼出し後、変数x、yの順で書き込みアクセスを行うことを認識する。さらに、第一実施形態と同様に、割込みレベルを値2に、割込みマスクを値3に、割込み可/不可を割込み可に設定しているため、処理部4は、並行アクセスによる問題が生じ得ると判定する。上述した様に、特別なハードウェア基板を使用することなく、並行アクセスによる問題が生じる可能性を判定することができる。なお、判定対象変数は、第一及び第二実施形態においては、割込み関数が書き込みアクセスする変数であり、第三実施形態においては、条件分岐の判定のために読み出しアクセスする変数と、その後に書き込みアクセスする変数であった。しかしながら、割込み関数が変数に書き込みアクセスする場合には、並行アクセスにより問題が生じ得る。したがって、判定対象変数の選択基準は、書き込みアクセスする変数を少なくとも1つ含むものであれば、それ以外の任意の所定の選択基準を適用することができる。また、割込み関数による割込みを禁止すべき、判定対象関数による判定対象変数へのアクセス順序及びその種別についても、上記実施形態で述べた具体例以外にも種々のパターンが存在することは当業者には明らかである。さらに、上述した実施形態においては、図1のS5の処理に置いて、判定対象関数は、判定対象変数に複数回アクセスする関数としていた。このため、関数アクセス情報保存部2は、各関数がアクセスする変数、種別及びその回数を関数アクセス情報として記憶部5に保存していた。しかしながら、判定対象変数にアクセスする関数を、その回数に拘わりなく判定対象関数として選択する形態であっても良い。この場合、処理部4は、S6の処理において、判定対象関数が判定対象変数への所定のパターンでのアクセスを行うことを判定する。さらに、関数アクセス情報保存部2を設けず、よって、判定対象関数及び判定対象変数の判定に関数アクセス情報を使用しない形態とすることもできる。この場合、処理部4は、判定対象変数及び判定対象の関数の判定を制御ソフトウェを解析することで行う。その他の実施形態また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェアプログラムを、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータまたはCPUやMPU等がプログラムを読み出して実行する処理である。