(57)【要約】【課題】並行・並列プログラムにおける競合状態を検出するための競合状態検出処理追加プログラム、競合状態検出処理追加装置、競合状態検出処理追加方法を提供する。【解決手段】並行・並列動作を行うプログラム中で共有変数の読み込み処理と共有変数の書き込み処理とを検出する共有変数利用処理検出ステップと、共有変数利用処理検出ステップにより検出された共有変数の読み込み処理における該共有変数の値と、共有変数利用処理検出ステップにより検出された該共有変数の書き込み処理の直前における該共有変数の値との比較を行い、値が一致しない場合に所定の動作を行わせる処理を追加処理として、プログラムの処理に追加する処理追加ステップとをコンピュータに実行させる。【選択図】図１
2007257397.tif 000002
【特許請求の範囲】
【請求項１】
並行・並列動作を行うプログラムの処理に対する競合状態の検出の処理の追加をコンピュータに実行させる競合状態検出処理追加プログラムであって、
前記プログラム中で共有変数の読み込み処理と共有変数の書き込み処理とを検出する共有変数利用処理検出ステップと、
前記共有変数利用処理検出ステップにより検出された共有変数の読み込み処理における該共有変数の値と、前記共有変数利用処理検出ステップにより検出された該共有変数の書き込み処理の直前における該共有変数の値との比較を行い、値が一致しない場合に所定の動作を行わせる処理を追加処理として、前記プログラムの処理に追加する処理追加ステップと
をコンピュータに実行させる競合状態検出処理追加プログラム。
【請求項２】
請求項１に記載の競合状態検出処理追加プログラムにおいて、
前記追加処理は、前記共有変数利用処理検出ステップにより検出された共有変数の読み込み処理で読み込まれた値を第１変数値として記憶する第１処理と、前記共有変数利用処理検出ステップにより前記第１処理の後に検出された該共有変数の書き込み処理の直前において、前記共有変数の値を読み込んで値を第２変数値とし、前記第１変数値と前記第２変数値との比較を行い、該処理の結果、前記第１変数値と前記第２変数値が一致しない場合に所定の動作を行わせる第２処理であることを特徴とする競合状態検出処理追加プログラム。
【請求項３】
請求項２に記載の競合状態検出処理追加プログラムにおいて、
前記共有変数利用処理検出ステップは、前記プログラムにおける命令の実行順に、該命令が前記共有変数の読み込み処理または前記共有変数の書き込み処理であるものを検出することを特徴とする競合状態検出処理追加プログラム。
【請求項４】
並行・並列動作を行うプログラムの処理に対する競合状態の検出の処理の追加を行う競合状態検出処理追加装置であって、
前記プログラム中で共有変数の読み込み処理と共有変数の書き込み処理とを検出する共有変数利用処理検出部と、
前記共有変数利用処理検出部により検出された共有変数の読み込み処理における該共有変数の値と、前記共有変数利用処理検出部により検出された該共有変数の書き込み処理の直前における該共有変数の値との比較を行い、値が一致しない場合に所定の動作を行わせる処理を追加処理として、前記プログラムの処理に追加する処理追加部と
を備える競合状態検出処理追加装置。
【請求項５】
並行・並列動作を行うプログラムの処理に対する競合状態の検出の処理の追加を実行する競合状態検出処理追加方法であって、
前記プログラム中で共有変数の読み込み処理と共有変数の書き込み処理とを検出する共有変数利用処理検出ステップと、
前記共有変数利用処理検出ステップにより検出された共有変数の読み込み処理における該共有変数の値と、前記共有変数利用処理検出ステップにより検出された該共有変数の書き込み処理の直前における該共有変数の値との比較を行い、値が一致しない場合に所定の動作を行わせる処理を追加処理として、前記プログラムの処理に追加する処理追加ステップと
を実行する競合状態検出処理追加方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、並行・並列プログラムにおける競合状態を検出するための競合状態検出処理追加プログラム、競合状態検出処理追加装置、競合状態検出処理追加方法に関するものである。
【背景技術】
【０００２】
複数のタスクの処理が同時に進行する並行・並列プログラムは、１つのタスクしか同時に実行しない逐次プログラムと比較して、正しく作成することが困難である。その理由の一つとして、競合状態（race condition）がある。競合状態とは、最終的な結果が実行系列によって変わってしまう状態のことで、ほとんどはプログラムの欠陥によるものである。競合状態は、複数のタスクから読み書きされる変数（共有変数）に対して発生する。よくある例は、２つのタスクが並行・並列して、共有変数から値を読み込んで、計算し、結果を書き込む処理を実行する場合、２つのタスクの実行順序に依存して結果が変化するというものである。
【０００３】
プログラムに競合状態がないことを確認する方法として、通常のテストによる検証方法と形式的検証による検証方法がある。
【０００４】
なお、本発明の関連ある従来技術として、並行動作するプログラム間の競合状態を発生させる方式がある（例えば、特許文献１参照）。
【特許文献１】特開１１−２３８００２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、通常のテストによる検証方法は、逐次プログラムでのテストと同様に、入力系列を与えて、出力が正しいことを調べる方法である。この場合、競合状態以外の要因で出力が間違っている場合もあるので、原因を特定することが困難であるという問題がある。
【０００６】
また、形式的検証による検証方法は、検証したい項目（プロパティ）を与える必要がある。しかし、競合状態の有無を検出するプロパティを作成するのは難しく、設計者が作成する必要があるとともに、設計者の技量が必要であった。
【０００７】
本発明は上述した問題点を解決するためになされたものであり、並行・並列プログラムにおける競合状態を検出するための競合状態検出処理追加プログラム、競合状態検出処理追加装置、競合状態検出処理追加方法を提供することを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決するため、本発明は、並行・並列動作を行うプログラムの処理に対する競合状態の検出の処理の追加をコンピュータに実行させる競合状態検出処理追加プログラムであって、前記プログラム中で共有変数の読み込み処理と共有変数の書き込み処理とを検出する共有変数利用処理検出ステップと、前記共有変数利用処理検出ステップにより検出された共有変数の読み込み処理における該共有変数の値と、前記共有変数利用処理検出ステップにより検出された該共有変数の書き込み処理の直前における該共有変数の値との比較を行い、値が一致しない場合に所定の動作を行わせる処理を追加処理として、前記プログラムの処理に追加する処理追加ステップとをコンピュータに実行させるものである。
【０００９】
また、本発明に係る競合状態検出処理追加プログラムにおいて、前記追加処理は、前記共有変数利用処理検出ステップにより検出された共有変数の読み込み処理で読み込まれた値を第１変数値として記憶する第１処理と、前記共有変数利用処理検出ステップにより前記第１処理の後に検出された該共有変数の書き込み処理の直前において、前記共有変数の値を読み込んで値を第２変数値とし、前記第１変数値と前記第２変数値との比較を行い、該処理の結果、前記第１変数値と前記第２変数値が一致しない場合に所定の動作を行わせる第２処理であることを特徴とするものである。
【００１０】
また、本発明に係る競合状態検出処理追加プログラムにおいて、前記共有変数利用処理検出ステップは、前記プログラムのソースコードの解析を行うことにより、前記共有変数の書き込み処理と前記共有変数の読み込み処理を検出することを特徴とするものである。
【００１１】
また、本発明に係る競合状態検出処理追加プログラムにおいて、前記処理追加ステップは、前記プログラムのソースコード、中間コード、ネイティブコードのいずれかに前記追加処理を追加することを特徴とするものである。
【００１２】
また、本発明に係る競合状態検出処理追加プログラムにおいて、前記処理追加ステップは、前記プログラムのソースコードに、前記第２処理をａｓｓｅｒｔ文として追加することを特徴とするものである。
【００１３】
また、本発明に係る競合状態検出処理追加プログラムにおいて、前記処理追加ステップは、前記追加処理を、形式的検証ツールにより要求される言語で前記共有変数に対するプロパティとして記述し、追加することを特徴とするものである。
【００１４】
また、本発明に係る競合状態検出処理追加プログラムにおいて、前記共有変数利用処理検出ステップは、前記プログラムにおける命令の実行順に、該命令が前記共有変数の読み込み処理または前記共有変数の書き込み処理であるものを検出することを特徴とするものである。
【００１５】
また、本発明に係る競合状態検出処理追加プログラムにおいて、前記処理追加ステップは、前記共有変数利用処理検出ステップにより共有変数の読み込み処理が検出された場合、該共有変数の読み込み処理に前記第１処理を追加し、前記共有変数利用処理検出ステップにより共有変数の書き込み処理が検出された場合、該共有変数の書き込み処理に前記第２処理を追加することを特徴とするものである。
【００１６】
また、本発明に係る競合状態検出処理追加プログラムにおいて、前記所定の動作は、前記プログラムの動作を停止させ、前記競合状態に関する情報を出力することを特徴とするものである。
【００１７】
また、本発明は、並行・並列動作を行うプログラムの処理に対する競合状態の検出の処理の追加を行う競合状態検出処理追加装置であって、前記プログラム中で共有変数の読み込み処理と共有変数の書き込み処理とを検出する共有変数利用処理検出部と、前記共有変数利用処理検出部により検出された共有変数の読み込み処理における該共有変数の値と、前記共有変数利用処理検出部により検出された該共有変数の書き込み処理の直前における該共有変数の値との比較を行い、値が一致しない場合に所定の動作を行わせる処理を追加処理として、前記プログラムの処理に追加する処理追加部とを備えたものである。
【００１８】
また、本発明に係る競合状態検出処理追加装置において、前記追加処理は、前記共有変数利用処理検出部により検出された共有変数の読み込み処理で読み込まれた値を第１変数値として記憶する第１処理と、前記共有変数利用処理検出部により前記第１処理の後に検出された該共有変数の書き込み処理の直前において、前記共有変数の値を読み込んで値を第２変数値とし、前記第１変数値と前記第２変数値との比較を行い、該処理の結果、前記第１変数値と前記第２変数値が一致しない場合に所定の動作を行わせる第２処理であることを特徴とするものである。
【００１９】
また、本発明に係る競合状態検出処理追加装置において、前記共有変数利用処理検出部は、前記プログラムのソースコードの解析を行うことにより、前記共有変数の書き込み処理と前記共有変数の読み込み処理を検出することを特徴とするものである。
【００２０】
また、本発明に係る競合状態検出処理追加装置において、前記処理追加部は、前記プログラムのソースコード、中間コード、ネイティブコードのいずれかに前記追加処理を追加することを特徴とするものである。
【００２１】
また、本発明に係る競合状態検出処理追加装置において、前記処理追加部は、前記プログラムのソースコードに、前記第２処理をａｓｓｅｒｔ文として追加することを特徴とするものである。
【００２２】
また、本発明に係る競合状態検出処理追加装置において、前記処理追加部は、前記追加処理を、形式的検証ツールにより要求される言語で前記共有変数に対するプロパティとして記述し、追加することを特徴とするものである。
【００２３】
また、本発明に係る競合状態検出処理追加装置において、前記共有変数利用処理検出部は、前記プログラムにおける命令の実行順に、該命令が前記共有変数の読み込み処理または前記共有変数の書き込み処理であるものを検出することを特徴とするものである。
【００２４】
また、本発明に係る競合状態検出処理追加装置において、前記処理追加部は、前記共有変数利用処理検出部により共有変数の読み込み処理が検出された場合、該共有変数の読み込み処理に前記第１処理を追加し、前記共有変数利用処理検出部により共有変数の書き込み処理が検出された場合、該共有変数の書き込み処理に前記第２処理を追加することを特徴とするものである。
【００２５】
また、本発明に係る競合状態検出処理追加装置において、前記所定の動作は、前記プログラムの動作を停止させ、前記競合状態に関する情報を出力することを特徴とするものである。
【００２６】
また、本発明は、並行・並列動作を行うプログラムの処理に対する競合状態の検出の処理の追加を実行する競合状態検出処理追加方法であって、前記プログラム中で共有変数の読み込み処理と共有変数の書き込み処理とを検出する共有変数利用処理検出ステップと、前記共有変数利用処理検出ステップにより検出された共有変数の読み込み処理における該共有変数の値と、前記共有変数利用処理検出ステップにより検出された該共有変数の書き込み処理の直前における該共有変数の値との比較を行い、値が一致しない場合に所定の動作を行わせる処理を追加処理として、前記プログラムの処理に追加する処理追加ステップとを実行するものである。
【発明の効果】
【００２７】
本発明によれば、並行・並列プログラムにおける競合状態を容易に検出することができる。
【発明を実施するための最良の形態】
【００２８】
本発明は、並行・並列プログラムの競合状態として最も多いパターンであるｒｅａｄ−ｍｏｄｉｆｙ−ｗｒｉｔｅパターンを検出するものである。ｒｅａｄ−ｍｏｄｉｆｙ−ｗｒｉｔｅパターンは、共有変数の値の読み込み、計算、書き込みの一連の処理を行っている最中に、他のタスクが値を書き込む可能性があるため、競合状態が発生してしまうというものである。
【００２９】
以下、本発明の実施の形態について図面を参照しつつ説明する。
【００３０】
実施の形態１．
本実施の形態においては、ソースコードを変更する競合状態検出処理追加装置について説明する。
【００３１】
まず、本実施の形態に係る競合状態検出処理追加装置の構成について説明する。
【００３２】
図１は、実施の形態１に係る競合状態検出処理追加装置の構成の一例を示すブロック図である。この競合状態検出処理追加装置は、コード解析部１１（共有変数利用処理検出部）、コード変更部１２（処理追加部）を備える。コード解析部１１は、入力ソースコードに対するコード解析を行う。コード変更部１２は、コード解析部１１によるコード解析結果に基づいて、入力ソースコードの変更を行い、その結果を出力ソースコードとして出力する。
【００３３】
次に、本実施の形態に係る競合状態検出処理追加装置の動作について説明する。
【００３４】
図２は、実施の形態１に係る競合状態検出処理追加装置の動作の一例を示すフローチャートである。まず、コード解析部１１は、共有変数抽出処理を行い、共有変数とその共有変数を読み書きする箇所を抽出する（Ｓ２１）（共有変数利用処理検出ステップ）。
【００３５】
次に、コード変更部１２は、共有変数を読み書きする箇所に基づいて、入力ソースコード中の共有変数を読み込む箇所に、読み込んだ値をローカル変数に記憶するコードを追加する（Ｓ２２）。次に、コード変更部１２は、共有変数を読み書きしている箇所に基づいて、入力ソースコード中の共有変数に書き込む箇所の直前に、共有変数の読み込み時に値を記憶したローカル変数と、共有変数の現在の値が一致するという条件のａｓｓｅｒｔ文を追加し（Ｓ２３）、その結果を出力ソースコードとして出力し、このフローを終了する。
【００３６】
なお、処理追加ステップは、本実施の形態における処理Ｓ２２，Ｓ２３に対応する。
【００３７】
次に、共有変数抽出処理について説明する。
【００３８】
図３は、実施の形態１に係る共有変数抽出処理の動作の一例を示すフローチャートである。まず、コード解析部１１は、共有変数になる可能性のある変数を抽出する（Ｓ３１）。ここで、共有変数になる可能性のある変数を抽出するための規則について説明する。
【００３９】
Ｃ言語において、共有変数となる可能性のある変数は、内部結合または外部結合を持つ変数である。言い換えると、ｓｔａｔｉｃ宣言されていないローカル変数を除く全ての変数である。共有変数となる可能性のある変数を抽出するための規則を以下に示す。
【００４０】
・ｓｔａｔｉｃまたはｅｘｔｅｒｎ付きで宣言された変数
・ファイルスコープで、かつ、記憶クラス指定子（ｓｔａｔｉｃ、ｅｘｔｅｒｎ）なしで宣言された変数
【００４１】
Ｊａｖａ（登録商標）言語において、共有変数となる可能性のある変数は、クラス変数とインスタンス変数である。
【００４２】
次に、コード解析部１１は、更に制御フロー解析を行うことにより、共有変数となる可能性のある変数から真の共有変数を抽出する（Ｓ３２）。制御フロー解析によれば、共有変数となる可能性のある変数が、実際にスレッド間で共有されることがあるか否かを判定することができる。例えば、ｓｔａｔｉｃ宣言された変数が、１つのスレッドからしかアクセスされないのであれば、コード解析部１１は、共有変数ではないと判断する。ここで、共有変数となる可能性のある変数のすべてを、共有変数として扱うことにより、処理を簡単にしても良い。次に、コード解析部１１は、共有変数を読み書きしている箇所を抽出する（Ｓ３３）。
【００４３】
図４は、実施の形態１に係る入力ソースコードの一例を示す図である。入力ソースコードの４行目の記述は、読み込みと書き込みを行うものであるが、処理Ｓ３３において書き込みの直前にａｓｓｅｒｔ文を追加する必要があるため、読み込みと書き込みの処理を分離したソースコードである変換ソースコードに変換する。図５は、実施の形態１に係る変換ソースコードの一例を示す図である。変換ソースコードにおいては読み込み（４行目、５行目）と書き込み（６行目）が分離されている。図６は、実施の形態１に係る出力ソースコードの一例を示す図である。出力ソースコードにおいては、書き込み（７行目）の直前にａｓｓｅｒｔ文（６行目）が追加されている。
【００４４】
なお、ローカル変数は、マルチスレッドプログラムにおけるスレッドローカル変数のようなものでも良い。また、ａｓｓｅｒｔ文は、Ｃ言語などにおいて標準で用意されているａｓｓｅｒｔ（）関数以外であっても良く、例えば、競合状態を検出したときに競合状態に関する情報を出力したり、記憶したりするような処理でも良い。
【００４５】
本実施の形態によれば、ソースコードに競合状態の検出を行う機能を追加することにより、このソースコードが実行され、競合状態が発生した場合、ａｓｓｅｒｔ文で実行が停止し、競合状態を検出することができる。
【００４６】
実施の形態２．
本実施の形態においては、競合状態検出処理追加ルーチンを埋め込むコンパイラを実行する競合状態検出処理追加装置について説明する。
【００４７】
まず、本実施の形態に係る競合状態検出処理追加装置の構成について説明する。
【００４８】
図７は、実施の形態２に係る競合状態検出処理追加装置の構成の一例を示すブロック図である。この競合状態検出処理追加装置は、コード解析部２１（共有変数利用処理検出部）、コード生成部２２（処理追加部）を備える。コード解析部２１は、入力ソースコードに対するコード解析を行う。コード生成部２２は、コード解析部２１によるコード解析結果に基づいて、競合状態検出ルーチンを埋め込んだネイティブコードを生成し、出力する。
【００４９】
次に、本実施の形態に係る競合状態検出処理追加装置の動作について説明する。
【００５０】
図８は、実施の形態２に係る競合状態検出処理追加装置の動作の一例を示すフローチャートである。まず、コード解析部２１は、入力ソースコードに対して字句解析を行い（Ｓ４１）、字句解析の結果に対して構文解析を行い（Ｓ４２）、構文解析の結果に対して意味解析を行う（Ｓ４３）。次に、コード解析部２１は、実施の形態１と同様、共有変数抽出処理を行い、共有変数とその共有変数を読み書きする箇所を抽出する（Ｓ４４）（共有変数利用処理検出ステップ）。
【００５１】
次に、コード生成部２２は、コード解析部２１によるコード解析結果に基づいて中間コードを生成し（Ｓ５１）、中間コードに対して競合状態検出ルーチン埋め込み処理を行い（Ｓ５２）（処理追加ステップ）、得られた中間コードの最適化を行い（Ｓ５３）、得られた中間コードからネイティブコードを生成し（Ｓ５４）、このフローを終了する。このフローを従来のコンパイラと比較すると、処理Ｓ４１，Ｓ４２，Ｓ４３，Ｓ５１，Ｓ５３，Ｓ５４は同様の処理であるが、処理Ｓ５２が追加されたことが異なる。
【００５２】
次に、競合状態検出ルーチン埋め込み処理について説明する。
【００５３】
図９は、実施の形態２に係る競合検出ルーチン埋め込み処理の動作の一例を示すフローチャートである。まず、コード生成部２２は、共有変数を読み込む命令の後に、スタックに値を記憶する命令を追加する（Ｓ６２）。次に、コード生成部２２は、共有変数に書き込む命令を、次に示す命令群に置き換え（Ｓ６３）、このフローを終了する。
【００５４】
命令ａ．スタックから値を読み出す命令
命令ｂ．共有変数から値を読み出す命令
命令ｃ．命令ａで得られた値と命令ｂで得られた値を比較する命令
命令ｄ．一致した場合に、値を書き込む命令、
一致しなかった場合に、予め用意された競合発見後の処理ルーチンにジャンプする命令
【００５５】
競合発見後の処理ルーチンは、実施の形態１のａｓｓｅｒｔ文と同様、プログラムの停止や、競合状態に関する情報の出力を行うものである。
【００５６】
なお、本実施の形態において、コンパイラの動作における中間コードの生成（Ｓ５１）と最適化（Ｓ５３）の間に、競合検出ルーチンを埋め込む処理（Ｓ５２）を追加したが、最適化（Ｓ５３）とネイティブコードの生成（Ｓ５４）の間や、ネイティブコードの生成（Ｓ５４）の後などに、競合状態検出ルーチンを埋め込む処理（Ｓ５２）を行っても良い。
【００５７】
本実施の形態によれば、コンパイラにより競合状態検出ルーチンを埋め込むことにより、実行時に競合状態が発生した場合、競合発見後の処理ルーチンが実行され、競合状態を検出することができる。
【００５８】
実施の形態３．
本実施の形態においては、競合状態を検出するＶＭ（Virtual Machine）を実行する競合状態検出処理追加装置について説明する。
【００５９】
まず、本実施の形態に係る競合状態検出処理追加装置の構成について説明する。
【００６０】
図１０は、実施の形態３に係る競合状態検出処理追加装置の構成の一例を示すブロック図である。この競合状態検出処理追加装置は、コード解析部３１、競合状態検出処理追加部３２（共有変数利用処理検出部、処理追加部）、コード実行部３３を備える。コード解析部３１は、入力されたバイトコード（中間コード）を読み込み、命令を一つずつ出力する。競合状態検出処理追加部３２は、コード解析部３１から取得した命令毎の競合状態判定処理を行うとともに、競合状態が検出されなかった命令を出力する。コード実行部３３は、競合状態検出処理追加部３２から取得した命令を実行し、実行結果を出力する。
【００６１】
次に、競合状態検出処理追加部３２の動作について説明する。
【００６２】
図１１は、実施の形態３に係る競合状態検出処理追加部の動作の一例を示すフローチャートである。競合状態検出処理追加部３２は、ｒｅａｄ命令によるｒｅａｄ対象アドレスとｒｅａｄした値を記憶する表を持つ。まず、競合状態検出処理追加部３２は、コード解析部３１から取得した命令がｒｅａｄ命令であるか否かの判断を行う（Ｓ７１）。
【００６３】
ｒｅａｄ命令である場合（Ｓ７１，Ｙ）、競合状態検出処理追加部３２は、ｒｅａｄ対象アドレスとｒｅａｄした値を表に記憶し（Ｓ７２）、このフローを終了し、コード実行部３３はｒｅａｄ命令を実行する。一方、ｒｅａｄ命令でない場合（Ｓ７１，Ｎ）、競合状態検出処理追加部３２は、コード解析部３１から取得した命令がｗｒｉｔｅ命令であるか否かの判断を行う（Ｓ８１）。ｗｒｉｔｅ命令でない場合（Ｓ８１，Ｎ）、このフローを終了し、コード実行部３３に命令を実行させる。
【００６４】
一方、ｗｒｉｔｅ命令である場合（Ｓ８１，Ｙ）、競合状態検出処理追加部３２は、表を参照し（Ｓ８２）、表においてｗｒｉｔｅ対象アドレスと同じアドレスがあるか否かの判断を行う（Ｓ８３）。同じアドレスがない場合（Ｓ８３，Ｎ）、このフローを終了し、コード実行部３３はｗｒｉｔｅ命令を実行する。一方、同じアドレスがある場合（Ｓ８３，Ｙ）、表におけるそのアドレスに対応する値と主記憶におけるそのアドレスに対応する値とが一致するか否かの判断を行う（Ｓ８４）。一致する場合（Ｓ８４，Ｙ）、このフローを終了し、コード実行部３３はｗｒｉｔｅ命令を実行する。一方、一致しない場合（Ｓ８４，Ｎ）、競合状態検出処理追加部３２は、競合状態に関する警告を出力し（Ｓ８５）、このフローを終了する。
【００６５】
なお、共有変数利用処理検出ステップは、本実施の形態における処理Ｓ７１，Ｓ８１に対応する。また、処理追加ステップは、本実施の形態における処理Ｓ７２，Ｓ８１〜Ｓ８５に対応する。
【００６６】
本実施の形態によれば、ＶＭが競合状態を検出することにより、実行時に警告を出力し、競合状態を検出することができる。
【００６７】
実施の形態４．
本実施の形態においては、ソースコードにプロパティを追加する競合状態検出処理追加装置について説明する。
【００６８】
プロパティは、プログラムが満たすべき性質のことである。本実施の形態において、プロパティは、共有変数に対するプロパティであり、書き込み処理直前の共有変数の値が、その直前の読み込み処理で得られた値と一致することを示す。
【００６９】
まず、本実施の形態に係る競合状態検出処理追加装置の構成について説明する。
【００７０】
図１２は、実施の形態４に係る競合状態検出処理追加装置の構成の一例を示すブロック図である。図１１において、図１と同一符号は図１に示された対象と同一又は相当物を示しており、ここでの説明を省略する。図１と比較すると図１１は、コード変更部１２の代わりにプロパティ追加部４２（処理追加部）を備える。プロパティ追加部４２は、コード解析部１１によるコード解析結果に基づいて、入力ソースコードにプロパティを追加したものを出力ソースコードとして出力する。
【００７１】
次に、本実施の形態に係る競合状態検出処理追加装置の動作について説明する。
【００７２】
図１３は、実施の形態４に係る競合状態検出処理追加装置の動作の一例を示すフローチャートである。まず、コード解析部１１は、実施の形態１と同様の共有変数抽出処理を行い、共有変数とその共有変数を読み書きする箇所を抽出する（Ｓ２１）（共有変数利用処理検出ステップ）。次に、プロパティ追加部４２は、共有変数を読み書きする箇所に基づいて、共有変数に対するプロパティ記述を入力ソースコードに埋め込み（Ｓ９２）（処理追加ステップ）、このフローを終了する。プロパティ記述は、形式的検証ツールにより要求される言語で、共有変数に対する条件を記述したものである。出力ソースコードをこの形式的検証ツールに入力することにより、プロパティ記述の条件が判定される。
【００７３】
例えば、図５のソースコードに対して、共有変数ｃｏｕｎｔｅｒに対するプロパティ記述は、「ｃｏｕｎｔｅｒ＝ｃ１を実行する前には、必ずｃｏｕｎｔｅｒ＝＝ｃ０が成り立つ」という条件である。
【００７４】
なお、本実施の形態においては、入力ソースコードにプロパティ記述を埋め込むとしたが、入力ソースコードと異なるファイルにプロパティ記述を作成しても良い。また、実施の形態１の競合状態検出処理追加装置により出力された出力ソースコード（ａｓｓｅｒｔ文が追加されたもの）を、ａｓｓｅｒｔ文をプロパティ記述として解釈する形式的検証ツールに入力しても良い。
【００７５】
本実施の形態によれば、共有変数の条件をプロパティとして追加することにより、形式的検証ツールを用いて競合状態を検出することができる。
【００７６】
また、本実施の形態に係る競合状態検出処理追加装置は、情報処理装置に容易に適用することができ、情報処理装置の性能をより高めることができる。ここで、情報処理装置には、例えばＰＣ（Personal Computer）、サーバ、ワークステーション等が含まれ得る。
【００７７】
更に、競合状態検出処理追加装置を構成するコンピュータにおいて上述した各ステップを実行させるプログラムを、競合状態検出処理追加プログラムとして提供することができる。上述したプログラムは、コンピュータにより読取り可能な記録媒体に記憶させることによって、競合状態検出処理追加装置を構成するコンピュータに実行させることが可能となる。ここで、上記コンピュータにより読取り可能な記録媒体としては、ＲＯＭやＲＡＭ等のコンピュータに内部実装される内部記憶装置、ＣＤ−ＲＯＭやフレキシブルディスク、ＤＶＤディスク、光磁気ディスク、ＩＣカード等の可搬型記憶媒体や、コンピュータプログラムを保持するデータベース、或いは、他のコンピュータ並びにそのデータベースや、更に回線上の伝送媒体をも含むものである。
【００７８】
（付記１）  並行・並列動作を行うプログラムの処理に対する競合状態の検出の処理の追加をコンピュータに実行させる競合状態検出処理追加プログラムであって、
前記プログラム中で共有変数の読み込み処理と共有変数の書き込み処理とを検出する共有変数利用処理検出ステップと、
前記共有変数利用処理検出ステップにより検出された共有変数の読み込み処理における該共有変数の値と、前記共有変数利用処理検出ステップにより検出された該共有変数の書き込み処理の直前における該共有変数の値との比較を行い、値が一致しない場合に所定の動作を行わせる処理を追加処理として、前記プログラムの処理に追加する処理追加ステップと
をコンピュータに実行させる競合状態検出処理追加プログラム。
（付記２）  付記１に記載の競合状態検出処理追加プログラムにおいて、
前記追加処理は、前記共有変数利用処理検出ステップにより検出された共有変数の読み込み処理で読み込まれた値を第１変数値として記憶する第１処理と、前記共有変数利用処理検出ステップにより前記第１処理の後に検出された該共有変数の書き込み処理の直前において、前記共有変数の値を読み込んで値を第２変数値とし、前記第１変数値と前記第２変数値との比較を行い、該処理の結果、前記第１変数値と前記第２変数値が一致しない場合に所定の動作を行わせる第２処理であることを特徴とする競合状態検出処理追加プログラム。
（付記３）  付記１または付記２に記載の競合状態検出処理追加プログラムにおいて、
前記共有変数利用処理検出ステップは、前記プログラムのソースコードの解析を行うことにより、前記共有変数の書き込み処理と前記共有変数の読み込み処理を検出することを特徴とする競合状態検出処理追加プログラム。
（付記４）  付記１乃至付記３のいずれかに記載の競合状態検出処理追加プログラムにおいて、
前記処理追加ステップは、前記プログラムのソースコード、中間コード、ネイティブコードのいずれかに前記追加処理を追加することを特徴とする競合状態検出処理追加プログラム。
（付記５）  付記２に記載の競合状態検出処理追加プログラムにおいて、
前記処理追加ステップは、前記プログラムのソースコードに、前記第２処理をａｓｓｅｒｔ文として追加することを特徴とする競合状態検出処理追加プログラム。
（付記６）  付記１乃至付記５のいずれかに記載の競合状態検出処理追加プログラムにおいて、
前記処理追加ステップは、前記追加処理を、形式的検証ツールにより要求される言語で前記共有変数に対するプロパティとして記述し、追加することを特徴とする競合状態検出処理追加プログラム。
（付記７）  付記２に記載の競合状態検出処理追加プログラムにおいて、
前記共有変数利用処理検出ステップは、前記プログラムにおける命令の実行順に、該命令が前記共有変数の読み込み処理または前記共有変数の書き込み処理であるものを検出することを特徴とする競合状態検出処理追加プログラム。
（付記８）  付記７に記載の競合状態検出処理追加プログラムにおいて、
前記処理追加ステップは、前記共有変数利用処理検出ステップにより共有変数の読み込み処理が検出された場合、該共有変数の読み込み処理に前記第１処理を追加し、前記共有変数利用処理検出ステップにより共有変数の書き込み処理が検出された場合、該共有変数の書き込み処理に前記第２処理を追加することを特徴とする競合状態検出処理追加プログラム。
（付記９）  付記１乃至付記８のいずれかに記載の競合状態検出処理追加プログラムにおいて、
前記所定の動作は、前記プログラムの動作を停止させ、前記競合状態に関する情報を出力することを特徴とする競合状態検出処理追加プログラム。
（付記１０）  並行・並列動作を行うプログラムの処理に対する競合状態の検出の処理の追加を行う競合状態検出処理追加装置であって、
前記プログラム中で共有変数の読み込み処理と共有変数の書き込み処理とを検出する共有変数利用処理検出部と、
前記共有変数利用処理検出部により検出された共有変数の読み込み処理における該共有変数の値と、前記共有変数利用処理検出部により検出された該共有変数の書き込み処理の直前における該共有変数の値との比較を行い、値が一致しない場合に所定の動作を行わせる処理を追加処理として、前記プログラムの処理に追加する処理追加部と
を備える競合状態検出処理追加装置。
（付記１１）  付記１０に記載の競合状態検出処理追加装置において、
前記追加処理は、前記共有変数利用処理検出部により検出された共有変数の読み込み処理で読み込まれた値を第１変数値として記憶する第１処理と、前記共有変数利用処理検出部により前記第１処理の後に検出された該共有変数の書き込み処理の直前において、前記共有変数の値を読み込んで値を第２変数値とし、前記第１変数値と前記第２変数値との比較を行い、該処理の結果、前記第１変数値と前記第２変数値が一致しない場合に所定の動作を行わせる第２処理であることを特徴とする競合状態検出処理追加装置。
（付記１２）  付記１０または付記１１に記載の競合状態検出処理追加装置において、
前記共有変数利用処理検出部は、前記プログラムのソースコードの解析を行うことにより、前記共有変数の書き込み処理と前記共有変数の読み込み処理を検出することを特徴とする競合状態検出処理追加装置。
（付記１３）  付記１０乃至付記１２のいずれかに記載の競合状態検出処理追加装置において、
前記処理追加部は、前記プログラムのソースコード、中間コード、ネイティブコードのいずれかに前記追加処理を追加することを特徴とする競合状態検出処理追加装置。
（付記１４）  付記１１に記載の競合状態検出処理追加装置において、
前記処理追加部は、前記プログラムのソースコードに、前記第２処理をａｓｓｅｒｔ文として追加することを特徴とする競合状態検出処理追加装置。
（付記１５）  付記１０乃至付記１４のいずれかに記載の競合状態検出処理追加装置において、
前記処理追加部は、前記追加処理を、形式的検証ツールにより要求される言語で前記共有変数に対するプロパティとして記述し、追加することを特徴とする競合状態検出処理追加装置。
（付記１６）  付記１１に記載の競合状態検出処理追加装置において、
前記共有変数利用処理検出部は、前記プログラムにおける命令の実行順に、該命令が前記共有変数の読み込み処理または前記共有変数の書き込み処理であるものを検出することを特徴とする競合状態検出処理追加装置。
（付記１７）  付記１６に記載の競合状態検出処理追加装置において、
前記処理追加部は、前記共有変数利用処理検出部により共有変数の読み込み処理が検出された場合、該共有変数の読み込み処理に前記第１処理を追加し、前記共有変数利用処理検出部により共有変数の書き込み処理が検出された場合、該共有変数の書き込み処理に前記第２処理を追加することを特徴とする競合状態検出処理追加装置。
（付記１８）  付記１９乃至付記１７のいずれかに記載の競合状態検出処理追加装置において、
前記所定の動作は、前記プログラムの動作を停止させ、前記競合状態に関する情報を出力することを特徴とする競合状態検出処理追加装置。
（付記１９）  並行・並列動作を行うプログラムの処理に対する競合状態の検出の処理の追加を実行する競合状態検出処理追加方法であって、
前記プログラム中で共有変数の読み込み処理と共有変数の書き込み処理とを検出する共有変数利用処理検出ステップと、
前記共有変数利用処理検出ステップにより検出された共有変数の読み込み処理における該共有変数の値と、前記共有変数利用処理検出ステップにより検出された該共有変数の書き込み処理の直前における該共有変数の値との比較を行い、値が一致しない場合に所定の動作を行わせる処理を追加処理として、前記プログラムの処理に追加する処理追加ステップと
を実行する競合状態検出処理追加方法。
（付記２０）  付記１９に記載の競合状態検出処理追加方法において、
前記追加処理は、前記共有変数利用処理検出ステップにより検出された共有変数の読み込み処理で読み込まれた値を第１変数値として記憶する第１処理と、前記共有変数利用処理検出ステップにより前記第１処理の後に検出された該共有変数の書き込み処理の直前において、前記共有変数の値を読み込んで値を第２変数値とし、前記第１変数値と前記第２変数値との比較を行い、該処理の結果、前記第１変数値と前記第２変数値が一致しない場合に所定の動作を行わせる第２処理であることを特徴とする競合状態検出処理追加方法。
【図面の簡単な説明】
【００７９】
【図１】実施の形態１に係る競合状態検出処理追加装置の構成の一例を示すブロック図である。
【図２】実施の形態１に係る競合状態検出処理追加装置の動作の一例を示すフローチャートである。
【図３】実施の形態１に係る共有変数抽出処理の動作の一例を示すフローチャートである。
【図４】実施の形態１に係る入力ソースコードの一例を示す図である。
【図５】実施の形態１に係る変換ソースコードの一例を示す図である。
【図６】実施の形態１に係る出力ソースコードの一例を示す図である。
【図７】実施の形態２に係る競合状態検出処理追加装置の構成の一例を示すブロック図である。
【図８】実施の形態２に係る競合状態検出処理追加装置の動作の一例を示すフローチャートである。
【図９】実施の形態２に係る競合検出ルーチン埋め込み処理の動作の一例を示すフローチャートである。
【図１０】実施の形態３に係る競合状態検出処理追加装置の構成の一例を示すブロック図である。
【図１１】実施の形態３に係る競合状態検出処理追加部の動作の一例を示すフローチャートである。
【図１２】実施の形態４に係る競合状態検出処理追加装置の構成の一例を示すブロック図である。
【図１３】実施の形態４に係る競合状態検出処理追加装置の動作の一例を示すフローチャートである。
【符号の説明】
【００８０】
１１  コード解析部、１２  コード変更部、２１  コード解析部、２２  コード生成部、３１  コード解析部、３２  競合状態検出処理追加部、３３  コード実行部、４２  プロパティ追加部。
【図１】
2007257397.tif 000003
【図２】
2007257397.tif 000004
【図３】
2007257397.tif 000005
【図４】
2007257397.tif 000006
【図５】
2007257397.tif 000007
【図６】
2007257397.tif 000008
【図７】
2007257397.tif 000009
【図８】
2007257397.tif 000010
【図９】
2007257397.tif 000011
【図１０】
2007257397.tif 000012
【図１１】
2007257397.tif 000013
【図１２】
2007257397.tif 000014
【図１３】
2007257397.tif 000015