(57)【要約】【課題】本発明は、検証者に対して有用な情報を適切に提供することができるソースコード検証システムを提供する。【解決手段】本発明は、プログラムに含まれる依存関係に関する依存関係データと、同種の情報を扱う変数である冗長系変数のグループを示す冗長系変数データに基づいて、冗長系変数を含む依存関係からプログラムが競合状態を起こす可能性を検出する不具合検出手段と、前記不具合に関する情報を出力する検査結果出力手段を備えることを特徴とする。【選択図】図２
2018151718.tif 000002
【特許請求の範囲】
【請求項１】
プログラムに含まれる依存関係に関する依存関係データと、同種の情報を扱う変数である冗長系変数のグループを示す冗長系変数データに基づいて、冗長系変数を含む依存関係からプログラムが競合状態による不具合を起こす可能性を検出する不具合検出手段と、
前記不具合に関する情報を出力する検査結果出力手段と、
を備えることを特徴とする、ソースコード検証システム。
【請求項２】
前記不具合検出手段は、不具合に関与する変数を特定し、前記検査結果出力手段が前記不具合に関与する変数を出力することを特徴とする、請求項１に記載のソースコード検証システム。
【請求項３】
前記検査結果出力手段は、前記検査結果出力手段から出力される前記不具合に関与する変数を前記依存関係データのグラフで表示することを特徴とする、請求項２に記載のソースコード検証システム。
【請求項４】
前記依存関係データのグラフはツリーであることを特徴とする、請求項３に記載のソースコード検証システム。
【請求項５】
前記不具合箇所検出手段は、前記プログラムの実行単位の優先度に関する情報に基づいて、前記不具合に関与する変数から、前記プログラムの実行単位の優先度により不具合にならない変数を除外することを特徴とする、請求項１に記載のソースコード検証システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はソースコード検証システムに関する。
【背景技術】
【０００２】
情報制御システムでは、プログラムの処理の実行タイミングにより発生する不具合が存在することがある。プログラムに並列または並行に実行される複数の実行単位（プロセス、スレッド、タスクなど）があり、それら実行単位処理順序により出力に異常が発生する事象を競合状態という。
【０００３】
競合状態を起こすプログラムの動作の一つに、データ競合がある。データ競合は、並列または並行に実行される複数の実行単位が同一の変数へアクセスし、かつ一つ以上のアクセスは書き込みである時に、データの内容が保障されていないことである。このようなタイミングに依存する不具合は発見が難しく、発生しても再現性がないことで原因究明が難しい場合が多い。
【０００４】
タイミングに依存する不具合の検出に有用な情報の一つに、プログラム依存関係がある。プログラム依存関係は、データ（変数）に影響を与える処理（ステートメント）間の関係を表すものであり、グラフで表現される。プログラム依存関係には、データ依存関係と制御依存関係がある。プログラムに変数ａ，ｂ，ｃがあり、処理がｂ＝ａ，ｃ＝ｂとある時には、ｂ＝ａからｃ＝ｂにデータ依存関係がある。また、処理がｉｆ（ａ＞0）｛ｂ＝ｃ｝とある時には、ａ＞0からｂ＝ｃに制御依存関係がある。プログラム依存関係を関数間で繋いだものをシステム依存関係という。プログラム依存関係やシステム依存関係はステートメント単位であるが、これらを変数単位で表現したものを変数依存関係という。
【０００５】
上記の依存関係を用いてタイミングに依存する不具合を検出する技術として、特許文献１では、変数依存関係上である実行単位Ｃに属する変数ｃが、異なる実行単位Ａに属する変数ａと、異なる実行単位Ｂに属する変数ｂとの間に依存関係を持つ（ｃがａとｂに依存する）ときに、実行単位Ａ，Ｂ，Ｃの実行優先順位や実行周期を比較し、評価している。例えば、実行単位Ａ，Ｂ，Ｃの優先度がＬ（低）、Ｈ（高）、Ｈ（高）と異なる場合には整合性が無いと評価し、優先度が一致する場合には整合性があると評価する。整合性がない場合、不具合の可能性があるとして通知する。また、ＡとＢやＡとＣの実行周期を比較し、相違しているかを評価している。周期が相違する場合、不具合の可能性があるとして通知する。
【０００６】
しかし、タイミングに依存する不具合は、特許文献１の方法では適切に検出できない場合がある。例えば、実行単位Ａの１回の実行中に２回読み込まれる変数ｘが、異なる実行単位Ｂに一回書き込まれ、かつ実行単位Ｂの優先度が実行単位Ａより高い時に、実行単位Ａの２回の読み込みの間に、タスクの開始や割り込み等で実行単位Ｂが起動して実行単位Ｂの書き込みが発生すると、変数ｘの一貫性が損なわれ、データ競合の不具合が発生しうる。逆に実行単位Ａの優先度が実行単位Ｂより高い時には、優先度は「不整合」（一致しない）であるが、不具合は発生しない。データ競合の可能性を検出するには、まず異なる実行単位間での変数への多重アクセスを検出することが必要であり、その上で、優先度の考慮は偽陽性の抑制に有用である。特許文献２では、一つの変数に複数の書き込みまたは読み込みが重なる時のデータ競合に関する不具合の候補を検出する。この技術は、異なる実行単位にまたがる変数依存関係の接続状態から、データ競合の発生しうるプログラムの箇所を示す。
【０００７】
変数依存関係の解析方法は、一例として、特許文献２で示されている。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２０１３−２５４３７１号公報
【特許文献２】特開２０１６−９１１３８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
情報制御システムでは、システムの高信頼化のために、システムの一部を冗長化することがある。冗長化の例として、センサなどサブシステムに障害が発生したことを検出したり、障害が発生した後でもシステム全体の機能を維持したりするために、前記サブシステムの予備装置をバックアップとして配置する。冗長化されたシステムでは、プログラムも対応して冗長化されることがある。例えば、二重化されたセンサからデータを取得し、取得されたデータから制御のための演算を行うまでの処理を２セット用意し、２つの処理結果を突き合わせる。この２つの処理には、同種の情報を扱う変数がペアで用意される。本明細書では、冗長化されたサブシステムにある同種情報を扱う変数を冗長系変数と呼ぶ。
【００１０】
冗長系変数が一致しない場合には、対応するサブシステムに障害が発生していることが判明し、障害対応処理を行うことができる。この冗長系変数でも競合状態が発生しうる。冗長系変数の読み込み処理と書き込み処理のタイミングによっては、冗長系変数間の一貫性が失われるためである。競合状態の影響の例として、２つの処理間の一致性判定結果の正確性が失われ、システムの出力は設計から乖離する。特許文献２で検出できる不具合は、対象が同一変数への多重アクセスに限定されている。
【００１１】
このため、上記の従来技術では、冗長系変数間の競合状態により不具合が発生する場合に不具合を検出することができないという問題がある。
【００１２】
そこで、本発明は、冗長系変数間の競合状態による不具合の可能性を検出し、検証者に対して有用な情報を適切に提供することができるソースコード検証システムを提供することを目的とする。
【課題を解決するための手段】
【００１３】
本発明は、プログラムに含まれる依存関係に関する依存関係データと、同種の情報を扱う変数である冗長系変数のグループを示す冗長系変数データとに基づいて、冗長系変数を含む依存関係からプログラムが競合状態を起こす可能性を検出する不具合検出手段と、前記不具合に関する情報を出力する検査結果出力手段と、を備えることを特徴とする。
【発明の効果】
【００１４】
本発明によれば、検証者に対して有用な情報を適切に提供することができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の実施形態に係るシステム構成。
【図２】ソースコード検証プログラムの構成。
【図３】ソースコード検証プログラムの処理フロー。
【図４】競合状態検査の処理フロー。
【図５】サンプルコード。
【図６】サンプルコードの冗長系変数データ。
【図７】サンプルコードの変数依存関係のグラフ。
【図８】サンプルコードの検査結果の出力ファイル。
【発明を実施するための形態】
【００１６】
以下、図面を用いて本発明の実施形態について説明を行う。
【実施例１】
【００１７】
図１は、本実施形態に係るソースコード検証システムの構成図である。このソースコード検証システムは、ソフトウェアツールとして実現されている。各機能はソフトウェアとして実装されており、表示画面、主演算装置、主記憶装置（メインメモリ）、ハードディスク等の記憶媒体、キーボードやポインティングデバイス等の入力装置を備えるコンピュータ上で実行される。
【００１８】
ソースコード検証システムを実現するソフトウェアは、ソースコード検証プログラム１２０として、コンピュータ１１０のＲＯＭ１１３に格納されており、ＣＰＵ１１１により読み出されて実行される。コンピュータ１１０はソースコード検証プログラム１２０によって規定された処理を実行する。検査対象であるソースコードなどのファイルは、コンピュータ１１０上のハードディスク１１４に格納されている。ソースコード検証プログラム１２０に対するユーザ操作は、キーボードなどの入力装置１３０から行うことができる。ソースコード検証プログラム１２０による出力は、ディスプレイなどの表示装置１４０への表示や、ハードディスク１１４へのデータファイルの生成として成されるが、図示しない外部コンピュータへのネットワークを介した出力、ＣＤ−ＲＯＭなどの外部記憶媒体へのデータファイル形式での書き込みによる出力であってもよい。
【００１９】
図２は、ＲＯＭ１１３に格納されたソースコード検証プログラム１２０の構成を示している。ソースコード検証プログラム１２０は、ハードディスク１１４に格納されたソースコード２００と、実行単位情報２１０と、冗長系変数データ２２０とを入力とし、不具合箇所の候補を表示装置１４０にて表示し、ファイルとしてハードディスク１１４に出力する。実行単位情報２１０は各実行単位の優先度（Ｐｒｉｏ）と実行開始点（Ｓｔａｒｔｉｎｇ＿Ｐｔ）の情報を含めている。実行開始点（Ｓｔａｒｔｉｎｇ＿Ｐｔ）は、ソースコード２００が実行形式にコンパイルされ、リアルタイムＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）などにより実行される時、最初に実行される点（Ｃ言語では関数）である。
【００２０】
ソースコード検証プログラム１２０は、依存関係解析部２３０、冗長系変数検索部２４０、同一変数検索部２５０、競合状態検査部２６０、結果表示部２７０、結果出力部２８０とからなる。依存関係解析部２３０は、実行単位情報２１０に基づいてソースコード２００の依存関係を解析し、その依存関係から、ユーザが指定した変数に関連する変数依存関係（Ｄｅｐ）を抽出する。
【００２１】
冗長系変数検索部２４０は、冗長系変数データ２２０と、依存関係解析部２３０により抽出された変数依存関係（Ｄｅｐ）とから、その変数依存関係（Ｄｅｐ）にある冗長系変数を検索し、同種情報を扱う冗長系変数のグループごとに、冗長系変数のある箇所（Ｒｅｄ＿Ｖａｒ）を出力する。
【００２２】
同一変数検索部２５０は、依存関係解析部２３０により抽出された変数依存関係（Ｄｅｐ）から、その変数依存関係上に複数回出現する同一変数を検索し、その同一変数のある箇所（Ｓａｍｅ＿Ｖａｒ）を変数ごとに出力する。競合状態検査部２６０は、依存関係解析部２３０により抽出された変数依存関係（Ｄｅｐ）と、冗長系変数検索部２４０により発見された冗長系変数のある箇所（Ｒｅｄ＿Ｖａｒ）と、同一変数検索部２５０により発見された同一変数のある箇所（Ｓａｍｅ＿Ｖａｒ）とから、冗長系変数や同一変数の競合状態が発生しうる箇所（Ｒａｃｅ＿Ｉｎｆｏ）を不具合箇所の候補として検出する。
【００２３】
結果表示部２７０は、競合状態検査部２６０により検出された不具合箇所の候補（Ｒａｃｅ＿Ｉｎｆｏ）を、表示装置１４０にて、依存関係をグラフ化したツリー上に表示する。結果出力部２８０は、競合状態検査部２６０により検出された不具合箇所の候補（Ｒａｃｅ＿Ｉｎｆｏ）をファイルとしてハードディスク１１４に出力する。
【００２４】
図３は、ソースコード検証プログラム１２０が実行する処理フローである。ステップ３００で処理が開始される。
【００２５】
ステップ３１０にて依存関係解析部２３０は、実行単位優先度（Ｐｒｉｏ）と実行開始点（Ｓｔａｒｔｉｎｇ＿Ｐｔ）を含む実行単位情報２１０に基づいて、ソースコード２００の依存関係を解析し、その依存関係から、ユーザが指定した変数に関連する変数依存関係（Ｄｅｐ）を抽出する。
【００２６】
ステップ３２０にて同一変数検索部２５０は、依存関係解析部２３０により抽出された変数依存関係（Ｄｅｐ）を入力とし、その依存関係上に複数回出現する同一変数を検索し、その同一変数のある箇所（Ｓａｍｅ＿Ｖａｒ）を出力する。
【００２７】
ステップ３３０にて冗長系変数検索部２４０は、冗長系変数データ２２０と、依存関係解析部２３０により抽出された変数依存関係（Ｄｅｐ）とから、その変数依存関係（Ｄｅｐ）にある冗長系変数を検索し、同種情報を扱う冗長系変数のグループごとに、冗長系変数のある箇所（Ｒｅｄ＿Ｖａｒ）を出力する。
【００２８】
ステップ３４０にて競合状態検査部２６０は、依存関係解析部２３０により抽出された変数依存関係（Ｄｅｐ）と、冗長系変数検索部２４０により発見された冗長系変数のある箇所（Ｒｅｄ＿Ｖａｒ）と、同一変数検索部２５０により発見された同一変数のある箇所（Ｓａｍｅ＿Ｖａｒ）とに基づいて、冗長系変数や同一変数の競合状態が発生しうる箇所（Ｒａｃｅ＿Ｉｎｆｏ）を不具合箇所の候補として検出する。ステップ３５０にて結果表示部２７０は、競合状態検査部２６０により検出された不具合箇所の候補（Ｒａｃｅ＿Ｉｎｆｏ）を表示装置１４０にて依存関係をグラフ化したツリー上で表示する。ステップ３６０にて結果表示部２８０は、前記不具合箇所の候補（Ｒａｃｅ＿Ｉｎｆｏ）をファイルとしてハードディスク１１４に出力する。
【００２９】
図４は、競合状態検査部２６０によるステップ３４０の処理を詳細化したフローである。この処理は、冗長系変数検索部２４０により発見された冗長系変数のグループや、同一変数検索部２５０により発見された同一変数それぞれについてについて実行される。
【００３０】
ここで「変数１」と「変数２」は、冗長系変数であれば同種情報を扱う異なる変数（変数名などが異なる）であり、同一変数であれば同じ変数であれば同じ変数であるが、どちらの場合も、ソースコードの異なる位置に記載されたものを指している。
【００３１】
また、図４のフローでは冗長系変数や同一変数の出現数は２つの時を扱っているが、３つ以上ある場合は、任意ペアごとにこの処理を実行すると良い。また、冗長系変数や同一変数のグループは一つに限定されていない。冗長系変数や同一変数のグループが複数ある場合は、グループごとにこの処理を実行すれば良い。
【００３２】
ステップ４００で処理が開始される。
【００３３】
ステップ４１０では、依存関係解析部２３０により抽出された変数依存関係から、変数１に影響されている（間接影響も含む）変数を抽出する。ここで間接影響とは、異なる実行単位の間に存在する依存関係のことである。
【００３４】
ステップ４２０では、前記依存関係から、変数２に影響されている（間接影響も含む）変数を抽出する。ステップ４２５では、ステップ４１０で抽出された変数とステップ４２０で抽出された変数とに共通する変数があるかを判定する。共通する変数があれば、ステップ４３０へ進む。そうでなければ、ステップ４９０へ進む。
【００３５】
ステップ４３０では、ステップ４１０で抽出された変数とステップ４２０で抽出された変数とに共通して存在し、かつ変数１，２に最も近い変数（以降では「共通影響変数」と呼ぶ）を抽出する。
【００３６】
ステップ４４０では、変数１から共通影響変数への依存関係に間接影響があるかを判定する。間接影響があれば、ステップ４５０へ進む。そうでなければ、ステップ４９０へ進む。
【００３７】
ステップ４５０では、変数２から共通影響変数への依存関係に間接影響があるかを判定する。変数２と共通影響変数間の依存関係に間接影響があれば、ステップ４６０へ進む。そうでなければ、ステップ４９０へ進む。
【００３８】
ステップ４６０では、実行単位情報２１０に実行単位優先度情報があるかを判定する。実行単位情報２１０に実行単位優先度情報があれば、ステップ４７０へ進む。そうでなければ、ステップ４８０へ進む。
【００３９】
ステップ４７０では、ステップ４４０やステップ４５０にて検出された間接影響において、書き込み側は優先されるか、つまり書き込み側の優先度が読み込み側の優先度より高いかを、前記実行単位優先度情報から判定する。書き込み側の優先度は、間接影響の依存先（影響を与える側）の変数が属する実行単位の値を利用する。書き込み側が優先されれば、ステップ４８０へ進む。そうでなければ、ステップ４９０へ進む。
【００４０】
ステップ４８０では、対象とした冗長系変数や同一変数について、競合状態による不具合の可能性を検出する。また、共通影響変数を競合状態による影響が発生する箇所として、ステップ４４０やステップ４５０で検出された間接影響の前後の変数を競合状態に関与する書き込み変数と読み込み変数として、検出する。ステップ４９０にて本フローを終了する。
【００４１】
以上の構成と処理により、同一変数だけでなく、冗長系変数のグループについても競合状態が発生しうるかを判定し、発生箇所を検出できる。また、実行単位優先度情報に基づいて、実行単位の優先順位を考慮することにより、競合状態の検査結果の偽陽性を減らすことができる。
【００４２】
図５は検証対象となるサンプルグログラムのソースコード２００の一部を示している。本実施例では、ソースコードはＣ言語で記述されているものとする。ソースファイル５１０、５２０、５３０からなるソースコードの構成を以下に説明する。主処理は関数ｆｕｎｃである。関数ｉｎｐｕｔは割込みにより実行される設定となっており、二重化センサ値ＤＩ０、ＤＩ１をそれぞれ変数ａ，ｂに代入する。センサが正常に動作する時には、二重化センサ値ＤＩ０、ＤＩ１の値は同じであるが、その値はいつでも変化しうる。関数ｆｕｎｃでは、変数ａ、ｂを２倍する処理をそれぞれ関数ｃａｌｃ１，ｃａｌｃ２で冗長に行い、２つの計算結果ｘ１，ｘ２を比較して、一致していれば計算結果を確定させて変数ｘに代入し、一致していなければエラー対処を関数ｅｒｒ＿ｈａｎｄｌｅで行なう。実行単位情報２１０は図５に示されていないが、実行開始点は関数ｆｕｎｃと関数ｉｎｐｕｔであり、関数ｆｕｎｃは優先度１、関数ｉｎｐｕｔは優先度２で、関数ｉｎｐｕｔの優先度は関数ｆｕｎｃのそれより高い。
【００４３】
図６は、図５のサンプルソースコードの冗長系変数データファイル６００であり、図２の冗長系変数データ２２０に対応している。本実施例では、冗長系変数データはＸＭＬで記述されているものとする。冗長系変数データ６００の構成を以下に説明する。要素ｒｅｄｕｎｄａｎｔ＿ｖａｒｓは冗長系変数データの全体を意味する。要素ｖａｒｓｅｔは一組の冗長系変数を意味する。要素ｖａｒｓｅｔにｖａｒ１，ｆｎ１，ｐａｔｈ１，ｖａｒ２，ｆｎ２，ｐａｔｈ２六つの属性がある。ｖａｒ１とｖａｒ２は冗長系変数の変数名を意味する。ｆｎ１とｆｎ２は冗長系変数がローカル変数の時、冗長系変数が定義された関数名を意味する。ｐａｔｈ１とｐａｔｈ２は冗長系変数がスタティック変数の時、冗長系変数が定義されたファイルを意味する。冗長系変数はグローバル変数であれば、ｆｎ１，ｆｎ２，ｐａｔｈ１，ｐａｔｈ２の入力は不要である。ファイル６００に示すように、グローバル変数ａとｂは冗長系変数のグループに指定されている。
【００４４】
図７は、図５のサンプルソースコードを依存関係解析部２３０が解析し、変数ｘをルートとするツリーとして抽出した変数依存関係データをグラフ化したツリー７００である。変数依存関係データやツリー７００にて、ノードは変数を示しており、変数は記述位置や属する実行単位で区別されている。例えばｘ＠０１６は、０１６行目の変数ｘを意味している。各変数が属する実行単位や関数は図には示されていないが、データには含まれる。ツリー７００では、ｉｆ文のような制御構文もノードとして扱っている。斜め線のついている変数ノードは、当該ノードがツリーの他の箇所に既出であり、下位ノードを省略していることを意味している。矢印が依存関係を示しており、ここでは矢印の元が依存先つまり変数値に影響を与える方、矢印の先が依存元つまり影響を受ける方である。これはデータ依存関係と制御依存関係の両方を含む。また実線の矢印は依存先と依存元の変数が同一の実行単位に含まれることを意味し、破線の矢印は依存先と依存元の変数が異なる実行単位に属することを意味する。
【００４５】
競合状態検査部２６０はステップ４１０からステップ４８０までの処理にて、ツリー７００に示された変数依存関係にある冗長系変数の競合状態の可能性を検出する。冗長系変数はファイル６００に指定されたグローバル変数ａ，ｂであるため、冗長系変数検索部２４０は、ツリー７００から、同種情報を扱う冗長系変数のグループとしてａ＠１０４，ａ＠２０４，ｂ＠１０９，ｂ＠２０５を抽出する。前記グループに四つのメンバーがあるため、変数名が異なる任意ペアごとに、ステップ４１０からステップ４８０までの処理を実行する。前記任意ペアには、ａ＠１０４とｂ＠１０９，ａ＠１０４とｂ＠２０５，ａ＠２０４とｂ＠１０９，ａ＠２０４とｂ＠２０５の四つの可能性がある。実際に競合状態を検出するペアであるａ＠２０４とｂ＠２０５を代表例として、以下に説明する。ａ＠２０４とｂ＠２０５について、競合状態検査部２６０はステップ４１０からステップ４８０までの処理を実行する。この時、変数１はａ＠２０４、変数２はｂ＠２０５である（変数１はｂ＠２０５、変数２はａ＠２０４にしても良い）。
【００４６】
ステップ４１０では、ツリー７００に示された変数依存関係から、変数１（ａ＠２０４）に影響されている（間接影響も含む）変数を抽出する。抽出される変数はａ＠１０４，ｘ１＠１０４，ｘ１＠０１６，ｘ＠０１６である。
【００４７】
ステップ４２０では、ツリー７００から、変数２（ｂ＠２０５）に影響されている（間接影響も含む）変数を抽出する。抽出された変数はｂ＠１０９，ｘ２＠１０９，ｘ２＠０１２，ｘ＠０１６である。
【００４８】
ステップ４３０では、ステップ４１０で抽出された変数とステップ４２０で抽出された変数とに共通し、かつ変数１（ａ＠２０４），変数２（ｂ＠２０５）に最も近い変数（共通影響変数）を抽出する。ツリー７００では、共通影響変数はｘ＠０１６である。
【００４９】
ステップ４４０では、変数１（ａ＠２０４）から共通影響変数（ｘ＠０１６）への依存関係に間接影響があるかを判定する。ａ＠２０４の実行単位は実行開始点がｉｎｐｕｔのもの、ａ＠１０４の実行単位は実行開始点がｆｕｎｃのものであるため、このノード間に間接影響が存在する。このため、ステップ４５０へ進む。
【００５０】
ステップ４５０では、変数２（ｂ＠２０５）から共通影響変数（ｘ＠０１６）への依存関係に間接影響があるかを判定する。ｂ＠２０５の実行単位は実行開始点がｉｎｐｕｔのもの、ｂ＠１０９の実行単位は実行開始点がｆｕｎｃのものであるため、このノード間に間接影響が存在する。このため、ステップ４６０へ進む。
【００５１】
ステップ４６０では、実行単位情報２１０に実行単位優先度情報があるかを判定する。ツリー７００では、実行単位優先度情報があるため、ステップ４７０へ進む。
【００５２】
ステップ４７０では、異なる実行単位の書き込み側は優先されるかを前記実行単位優先度情報から判定する。ツリー７００では、異なる実行単位の書き込み側はａ＠２０４とｂ＠２０５である。ａ＠２０４とｂ＠２０５はどちらも優先度が一番高い関数ｉｎｐｕｔに定義されているため、異なる実行単位の書き込み側が優先されると判定し、ステップ４８０へ進む。ステップ４８０では、冗長系変数ａ，ｂについて、競合状態による不具合の可能性を検出する。また、異なる実行単位間で依存関係を持つ変数を競合状態に関与する箇所として検出する。ツリー７００では、異なる実行単位間の依存関係はａ＠２０４からａ＠１０４への依存関係と、ｂ＠２０５からｂ＠１０９への依存関係とであるため、ａ＠２０４とａ＠１０４およびｂ＠２０５とｂ＠１０９を競合状態に関与する書き込み変数、読み込み変数として検出する。さらに、共通影響変数ｘ＠０１６を不具合の発生しうる箇所として検出する。
【００５３】
結果表示部２７０はステップ３５０にて、ツリー７００のような依存関係ツリーの表示を生成し、競合状態に関与する箇所や共通影響変数のノードをマークすることができる。ツリー７００では、ａ＠２０４，ａ＠１０４，ｂ＠２０５，ｂ＠１０９は競合状態に関与する箇所のノードとしてマークされる。マークされたツリーは、表示装置１４０により表示される。図７のツリー上で競合状態に関与する箇所をマークし、表示装置１４０に表示することにより、競合状態が発生する理由を依存関係から把握することができる。
【００５４】
図８は結果出力部２８０により出力されたファイル８００である。本実施例では、このファイルはＸＭＬで記述されているものとする。
【００５５】
ファイル８００は競合状態検査部２６０により検出された各競合状態に関与する箇所（ａ＠２０４，ａ＠１０４，ｂ＠２０５，ｂ＠１０９）のツリー７００上の位置を示している。要素ｄａｔａｒａｃｅｓは競合状態に関与する箇所の一覧を意味する。要素ｄａｔａｒａｃｅｓにｃｏｎｓｉｄｅｒＰｒｉｏｒｉｔｙという属性があり、ステップ３５０の処理において実行単位優先度を考慮したかを意味する。
【００５６】
要素ｒａｃｅｐｏｉｎｔは要素ｄａｔａｒａｃｅｓに所属し、競合状態に関与する箇所の一つを意味する。要素ｒａｃｅｐｏｉｎｔにｉｄという属性があり、当該競合状態に関与する箇所の番号を意味する。要素ｒｅａｄ＿ｖａｒは要素ｒａｃｅｐｏｉｎｔに所属し、ツリー７００のルートノードから競合状態に関与する読み込み変数へのパスを示している。
【００５７】
要素ｔｐは前記パスにあるノードの一つを意味する。要素ｔｐにｎａｍｅという属性があり、当該ノードの変数や制御文の名前を示している。要素ｔｐのｉｄｘという属性は当該ノードの番号であり、ツリー上の兄弟ノードとの相対的位置を示している。
【００５８】
図８のように出力されると、競合状態に関与する箇所の一覧により、ツリー７００において競合状態の発生しうる箇所を全体的に把握することができる。また、変数ツリー上で各競合状態に関与する箇所を追うこともできる。
【００５９】
以上のように、本実施形態に係るソースコード検証システムによれば、同一変数だけだはなく冗長系変数の競合状態の可能性やその箇所を検出することができ、検証者に対して有用な情報を適切に提供することができる。
【符号の説明】
【００６０】
１１４  ハードディスク
１２０  ソースコード検証プログラム
１４０  表示装置
２００  ソースコード
２１０  実行単位情報
２２０  冗長系変数データ
２３０  依存関係解析部
２４０  冗長系変数検索部
２５０  同一変数検索部
２６０  競合状態検査部
２７０  結果表示部
２８０  結果出力部
【図１】
2018151718.tif 000003
【図２】
2018151718.tif 000004
【図３】
2018151718.tif 000005
【図４】
2018151718.tif 000006
【図５】
2018151718.tif 000007
【図６】
2018151718.tif 000008
【図７】
2018151718.tif 000009
【図８】
2018151718.tif 000010