(57)【特許請求の範囲】
【請求項１】
コンピュータプログラムに含まれる排他制御を検査する排他制御検査装置であって、
検査対象となる前記コンピュータプログラムに含まれるステートメントの実行順序及び実行経路を特定する順序経路特定部と、
前記順序経路特定部により特定された前記ステートメントの実行順序及び実行経路に基づいて、前記コンピュータプログラムに含まれる複数のタスクが利用可能な共有資源に対して排他制御を実行する一群のステートメントからなるロック区間を特定するロック区間特定部と、
前記ロック区間特定部により特定された前記ロック区間に含まれる実行経路の各々について、前記ロック区間の実行に要するクロック数を算出するクロック数算出部と、
前記ロック区間の各々について、前記クロック数算出部により算出された前記クロック数の最大値を算出する最大クロック数算出部と、
前記最大クロック数算出部により算出された前記クロック数の最大値を出力する検査結果出力部と、
を備えることを特徴とする排他制御検査装置。
【請求項２】
請求項１に記載の排他制御検査装置であって、
前記ロック区間の各々について、前記共有資源へのアクセス制限が解除されることを待つことができるタイムアウト時間を抽出するタイムアウト時間抽出部と、
前記ロック区間の各々について、前記ロック区間が属するタスクとは異なる他のタスクに属する他のロック区間を特定する競合ロック区間特定部と、
前記ロック区間の前記クロック数の最大値が、前記他のロック区間のタイムアウト時間よりも大きい場合、前記他のロック区間がスキップされる可能性があると判断するタイムアウト判断部と、を更に備え、
前記検査結果出力部は、前記タイムアウト判断部による判断結果を出力する
ことを特徴とする排他制御検査装置。
【請求項３】
コンピュータプログラムに含まれる排他制御を検査する排他制御検査方法であって、
検査対象となる前記コンピュータプログラムに含まれるステートメントの実行順序及び実行経路を特定し、
前記ステートメントの実行順序及び実行経路に基づいて、前記コンピュータプログラムに含まれる複数のタスクが利用可能な共有資源に対して排他制御を実行する一群のステートメントからなるロック区間を特定し、
前記ロック区間に含まれる実行経路の各々について、前記ロック区間の実行に要するクロック数を算出し、
前記ロック区間の各々について、前記クロック数の最大値を算出し、
前記クロック数の最大値を出力する
ことを特徴とする排他制御検査方法。
【請求項４】
コンピュータプログラムに含まれる排他制御を検査する排他制御検査プログラムであって、
コンピュータに、
検査対象となる前記コンピュータプログラムに含まれるステートメントの実行順序及び実行経路を特定する機能と、
前記ステートメントの実行順序及び実行経路に基づいて、前記コンピュータプログラムに含まれる複数のタスクが利用可能な共有資源に対して排他制御を実行する一群のステートメントからなるロック区間を特定する機能と、
前記ロック区間に含まれる実行経路の各々について、前記ロック区間の実行に要するクロック数を算出する機能と、
前記ロック区間の各々について、前記クロック数の最大値を算出する機能と、
前記クロック数の最大値を出力する機能と、
を実現させることを特徴とする排他制御検査プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、排他制御検査装置、排他制御検査方法、排他制御検査プログラムに関するものである。
【背景技術】
【０００２】
コンピュータプログラム内のロック区間で用いられる、セマフォのビジー率及び競合率を算出するため、測定対象として指定されたセマフォのロック取得からロック解放までのロック時間、及びセマフォのロック取得待ちからロック取得までのロック解除待ち時間のそれぞれを実時間で測定するロック動作測定方法が知られている（特許文献１参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平１１−０８５５７４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１に開示されたロック動作測定方法は、システムを動作させて上記時間を測定するという動的な検査方法であるため、実際に実行されたロック区間やロック解除待ち処理のみを対象としている。そのため実際に実行されなかったロック区間や分岐経路を測定対象とすることができない。よって、実行し得るロック区間の各々について、ロック時間の最大値を把握することはできないため、システムの応答性が悪化するロック区間を特定することができない。つまり、コンピュータプログラムで使用されるロック区間の実行に要する時間（ロック時間）や、競合関係、タイムアウトが発生する状況を把握し、システムに課せられた要求を満足するか検証するという目的を、十分に果たすことができないという課題を、特許文献１に開示されたロック動作測定方法は有している。【０００５】
本発明は、上記課題に鑑みて成されたものであり、その目的は、コンピュータプログラム中で実行し得るロック区間について、システムの応答性が悪化する可能性がある箇所をユーザに気づかせることができる排他制御検査装置、排他制御検査方法、排他制御検査プログラムを提供することである。
【課題を解決するための手段】
【０００６】
本発明の一態様に係わる排他制御検査装置は、検査対象となるコンピュータプログラムに含まれるステートメントの実行順序及び実行経路を特定し、特定されたステートメントの実行順序及び実行経路に基づいて、コンピュータプログラムに含まれる複数のタスクが利用可能な共有資源に対して排他制御を実行する一群のステートメントからなるロック区間を特定する。そして、特定されたロック区間に含まれる実行経路の各々について、ロック区間の実行に要するクロック数を算出する。そして特定された実行順序及び実行経路、ロック区間、算出されたクロック数などの情報を検査結果として出力する。【０００７】
本発明の一態様に係わる排他制御検査装置は、ロック区間の各々について、共有資源へのアクセス制限が解除されることを待つことができるタイムアウト時間を抽出し、ロック区間が属するタスクとは異なる他のタスクに属する他のロック区間を競合するタスクであるとして特定し、ロック区間のクロック数の最大値が、他のロック区間のタイムアウト時間よりも大きい場合、他のロック区間がスキップされる可能性があると判断することが好ましい。
【図面の簡単な説明】
【０００８】
【図１】図１は、本発明の実施形態に係わる排他制御検査装置のハードウェア構成を示すブロック図である。
【図２】図２は、ＣＰＵ１１の機能的構成を示すブロック図である。
【図３】図３は、本発明の実施形態に係わる排他制御検査装置によって実行される情報処理の流れを示すフローチャートである。
【図４】図４（ａ）、図４（ｂ）、図４（ｃ）は、ソースコード入力部２１により読み込まれたソースコードＤ０１として、Ｃ言語で記述されたコンピュータプログラムの一例を示す図である。
【図５】図５は、図４（ａ）の関数「Task1」をエントリーポイントとした場合のステートメント（コード）の実行順序及び実行経路を示す表（実行順序／実行経路表Ｔ０１）である。
【図６】図６は、エントリーポイント一覧Ｄ０２の一例を示す表である。
【図７】図７は、ロック開始命令／解除命令リストＤ０３の一例を示す表である。
【図８】図８は、所要クロック数一覧Ｄ０４の一例を示す表である。
【図９】図９は、図３のステップＳ０３〜Ｓ０５に示す情報処理Ｆ０１の詳細な処理手順の一例を示すフローチャートである。
【図１０】図１０は、図９のフローチャートの実行結果の一例として、図４（ａ）の関数「Task1」についての実行結果を示す表（ロック区間特定表Ｔ０２）である。
【図１１】図１１は、図３のステップＳ０６及びＳ０７の実行結果の一例として、実行経路の各々のクロック数、及びロック区間の実行に要するクロック数の最大値を示す表（クロック数合計管理表Ｔ０３）である。
【図１２】図１２は、図３のステップＳ０８の実行結果の一例として、競合関係にあるブロック区間の組合せを示す表（排他制御構造管理表Ｔ０４）である。
【図１３】図１３は、排他制御検査結果Ｄ０５の一例を示す表である。
【発明を実施するための形態】
【０００９】
図面を参照して、本発明の実施形態を説明する。図面の記載において同一部分には同一符号を付し説明を省略する。
【００１０】
［排他制御検査装置のハードウェア構成］
本発明の実施形態に係わる排他制御検査装置は、例えば車両に搭載される電子制御装置（ＥＣＵ）により実行されるコンピュータプログラムに含まれる排他制御を検査する処理に適用することができる。
【００１１】
コンピュータプログラムの実行において、複数のタスク（アプリケーションを含む）が利用できる共有資源（データ、ファイル、データベースを含む）に対して、複数のタスクからの同時アクセスにより競合が発生する場合、共有資源の整合性を保つために、一方のタスクが共有資源を独占的に利用している間は、他方のタスクは共有資源を利用できないようにする。これを排他制御という。具体的には、一方のタスクが共有資源を使用する一定区間、他方のタスクの起動をロックする。ロックされる他方のタスクは、ロックする一方のタスクがセマフォを解放した後に起動され、共有資源へのアクセスを実行する。
【００１２】
本発明の実施形態に係わる排他制御検査装置は、コンピュータプログラムに含まれる複数のタスクから利用可能な共有資源に対して実行する排他制御を検査する装置である。
【００１３】
図１を参照して、本発明の実施形態に係わる排他制御検査装置のハードウェア構成を説明する。排他制御検査装置のハードウェア構成として、汎用のコンピュータを用いることができる。例えば、排他制御検査装置は、記憶媒体から検査対象のコンピュータプログラム（ソースコードＤ０１）及び検査に必要なデータ（エントリーポイント一覧Ｄ０２、ロック開始命令／解除命令リストＤ０３、所要クロック数一覧Ｄ０４を含む）を読み込む入出力装置１２と、入出力装置１２で読み込んだソースコードＤ０１や解析の中間データを格納する記憶装置１４と、各種演算を実行してソースコードＤ０１を解析するＣＰＵ（中央処理装置）１１と、ユーザが解析に必要な情報を入力するための入力装置１３と、ＣＰＵ１１から出力される検査結果（排他制御検査結果Ｄ０５を含む）を表示する表示装置１５と、を備える。検査結果は、入出力装置１２を用いて記憶媒体に書き込むことも可能である。記憶装置１４としてはメモリ、ハードディスクなどが挙げられ、記憶装置１４とＣＰＵ（中央処理装置）１１との間で、データの入出力が行われる。
【００１４】
記憶装置１４に格納されている中間データはＣＰＵ１１によって更新される。中間データとしては、後述する実行順序／実行経路表Ｔ０１、ロック区間特定表Ｔ０２、クロック数合計管理表Ｔ０３、排他制御構造管理表Ｔ０４などが挙げられる。
【００１５】
また、排他制御検査装置は、クライアントサーバモデルとしても実現可能である。例えば、コンピュータネットワークを介して汎用のパーソナルコンピュータ（クライアント）をサーバに接続する。これにより、図１に示すＣＰＵ１１を備えるリモート環境に置かれたサーバを、コンピュータネットワークを介して、クライアントが備える入出力装置１２、入力装置１３、記憶装置１４、あるいは表示装置１５に接続することができる。この場合、排他制御検査装置は、主にＣＰＵ１１（サーバ）により構成され、入出力装置１２、入力装置１３、記憶装置１４、あるいは表示装置１５は排他制御検査装置に含まれない。
【００１６】
図２を参照して、ＣＰＵ１１の機能的構成を説明する。ＣＰＵ１１を備えるコンピュータを排他制御検査装置として機能させるためのコンピュータプログラム（排他制御検査プログラム）を、ＣＰＵ１１を備えるコンピュータにインストールして実行する。これにより、ＣＰＵ１１は、以下に示す各情報処理部として機能する。なお、ここでは、ソフトウェアによって排他制御検査装置を実現する例を示すが、もちろん、以下に示す各情報処理を実行するための専用のハードウェアを用意して、排他制御検査装置を構成することも可能である。
【００１７】
ＣＰＵ１１は、ソースコード入力部２１、順序経路特定部２２、ロック区間特定部２３、クロック数算出部２４、最大クロック数算出部２５、及び検査結果出力部２９として機能する。
【００１８】
ソースコード入力部２１は、検査対象となるコンピュータプログラム（ソースコードＤ０１）を入出力装置１２あるいは入力装置１３から読み取り、記憶装置１４に格納する。
【００１９】
順序経路特定部２２は、ソースコード入力部２１により読み取られたコンピュータプログラムに含まれるステートメントの実行順序及び実行経路を特定する。具体的には、入出力装置１２あるいは入力装置１３から入力されるエントリーポイント一覧Ｄ０２を用いて、入力装置１３から入力されるエントリーポイント（プログラムの開始点）を起点に実行されるステートメントの実行順序及び実行経路を特定する。エントリーポイント一覧Ｄ０２については、図６を参照して後述する。エントリーポイント一覧Ｄ０２は、ファイル形式あるいはデータベースとして記憶装置１４に記録される。エントリーポイント一覧Ｄ０２は、ＣＰＵ１１からの指示によって読み出される。順序経路特定部２２によって特定されたステートメントの実行順序及び実行経路は、順序経路特定部２２によって実行順序／実行経路表Ｔ０１（図５）に記録される。実行順序／実行経路表Ｔ０１は、ファイル形式あるいはデータベースとして記憶装置１４に記録される。
【００２０】
ロック区間特定部２３は、順序経路特定部２２により特定されたステートメントの実行順序及び実行経路に基づいて、ロック区間を特定する。「ロック区間」は、コンピュータプログラムに含まれる複数のタスクが利用可能な共有資源に対して排他制御を実行する一群のステートメントからなる。換言すれば、ロック区間とは、一方のタスクが共有資源を排他的に使用する一定区間である。ロック区間において、他方のタスクの起動はロックされ、共有資源の使用が禁止される。
【００２１】
具体的に、ロック区間特定部２３は、実行順序／実行経路表Ｔ０１に記録されたステートメントの実行順序及び実行経路の情報に従って、ロック開始命令から解除命令までの区間（ロック区間）を特定する。ロック区間特定部２３は、入出力装置１２あるいは入力装置１３から入力されるロック開始命令／解除命令リストＤ０３に基づいて、ロック開始命令、およびロック解除命令のステートメントを特定する。ロック開始命令／解除命令リストＤ０３については、図７を参照して後述する。ロック開始命令／解除命令リストＤ０３は、ファイル形式あるいはデータベースとして記憶装置１４に記録される。ロック開始命令／解除命令リストＤ０３は、ＣＰＵ１１のロック区間特定部２３からの指示によって読み出される。
【００２２】
クロック数算出部２４は、ロック区間特定部２３により特定されたロック区間に含まれる実行経路の各々について、ロック区間の実行に要するクロック数を算出する。具体的には、入出力装置１２あるいは入力装置１３から入力される所要クロック数一覧Ｄ０４に基づいて、ロック区間特定部２３により特定されたロック区間に含まれる各ステートメントの実行に要するクロック数を算出する。なお所要クロック数一覧Ｄ０４には、ステートメントに記述される命令の種類毎に、その命令の実行に必要なクロック数が記録されている。所要クロック数一覧Ｄ０４については、図８を参照して後述する。所要クロック数一覧Ｄ０４は、ファイル形式あるいはデータベースとして記憶装置１４に記録され、ＣＰＵ１１のクロック数算出部２４からの指示によって読み出される。
【００２３】
クロック数算出部２４によって算出された各ステートメントの実行に要するクロック数は、クロック数算出部２４によってロック区間特定表Ｔ０２（図１０）に記録される。ロック区間特定表Ｔ０２は、ファイル形式あるいはデータベースとして記憶装置１４に記録される。
【００２４】
そして、クロック数算出部２４は、実行経路の各々について、各ステートメントの実行に要するクロック数の合計値を算出し、その合計値を、ロック区間特定部２３によって特定されたロック区間に関する情報と共にクロック数合計管理表Ｔ０３（図１１）に記録する。クロック数合計管理表Ｔ０３は、ファイル形式あるいはデータベースとして記憶装置１４に記録される。
【００２５】
最大クロック数算出部２５は、クロック数合計管理表Ｔ０３を参照して、ロック区間の各々について、クロック数算出部２４により算出されたクロック数の最大値を算出する。具体的には、１つのロック区間に２以上の実行経路が含まれている場合、即ち、１つのロック区間の中で分岐条件のもとで２以上の分岐処理が行われる場合、２以上の実行経路の中で、最も大きなクロック数を抽出する。１つのロック区間に１つの実行経路だけが含まれている場合、クロック数算出部２４により算出されたクロック数がそのまま、そのロック区間におけるクロック数の最大値となる。最大クロック数算出部２５によって算出されたクロック数の最大値は、最大クロック数算出部２５によってクロック数合計管理表Ｔ０３に記録される。
【００２６】
検査結果出力部２９は、少なくとも最大クロック数算出部２５により算出されたクロック数の最大値を、排他制御検査結果Ｄ０５として表示装置１５あるいは入出力装置１２に挿入された記憶媒体へ出力する。検査結果出力部２９により出力されるクロック数の最大値については、図１１を参照して後述する。
【００２７】
ＣＰＵ１１は、タイムアウト時間抽出部２６、競合ロック区間特定部２７、及びタイムアウト判断部２８として更に機能する。
【００２８】
タイムアウト時間抽出部２６は、ロック区間の各々について、共有資源へのアクセス制限が解除されることを待つことができるタイムアウト時間を抽出する。具体的には、ロック区間に対応するロック開始命令の引数を参照することにより、タイムアウト時間を抽出する。
【００２９】
一方のタスクによる共有資源の使用によって、共有資源の使用が禁止される他方のタスクは、その他方のタスクのロック区間に対応するロック開始命令の引数で設定されたタイムアウト時間だけ、一方のタスクによるセマフォの解放を待つことができる。しかし、タイムアウト時間が経過しても、一方のタスクがセマフォを解放しない場合、他方のタスクは実行せずに、次の処理へスキップする。
【００３０】
競合ロック区間特定部２７は、クロック数合計管理表Ｔ０３を参照して、ロック区間の各々について、ロック区間が属するタスクとは異なる他のタスクに属する他のロック区間を特定する。同一の共有資源を排他的に利用可能な複数のタスクのうち一方のタスクがセマフォを獲得している場合、他方のタスクは同じセマフォを獲得できない。同じセマフォを用いる２以上のロック区間のうち、異なるタスクに属するロック区間は、そのセマフォの獲得について競合することになる。競合ロック区間特定部２７は、ロック区間の各々について、セマフォの獲得に関して競合する他のロック区間を特定する。つまり、競合関係にあるロック区間の組合せを特定する。特定された競合関係にあるロック区間の組合せは、競合ロック区間特定部２７によって排他制御構造管理表Ｔ０４（図１２）に記録される。排他制御構造管理表Ｔ０４はファイル形式あるいはデータベースとして記憶装置１４に記録される。
【００３１】
タイムアウト判断部２８は、クロック数合計管理表Ｔ０３および排他制御構造管理表Ｔ０４を参照して、ロック区間のクロック数の最大値と、競合関係にある他のロック区間のタイムアウト時間を取得する。そしてタイムアウト判断部２８は、ロック区間のクロック数の最大値が、他のロック区間のタイムアウト時間よりも大きい場合、他のロック区間がスキップされる可能性があると判断する。具体的には、タイムアウト判断部２８は、競合関係にある２以上のロック区間のうち、一方のロック区間の実行に要するクロック数の最大値と、他方のロック区間で規定されるタイムアウト時間とを比較する。
【００３２】
クロック数とは、マイコンが行うタイミング制御に用いる内部クロックの数を示す。クロック数に、マイコンの１クロックあたりの実行時間にクロック数を掛け合わせることにより、ロック区間の実行に要する時間が求められる。またタイムアウト時間は、マイコンが行うタイミング制御に用いる内部クロックの数として表現される。そのため、タイムアウト判断部２８は、一方のロック区間の実行に要するクロック数の最大値と、クロック数によって表現された他のロック区間のタイムアウト時間とを比較する。
【００３３】
一方のロック区間の実行に要するクロック数の最大値が、他方のロック区間のタイムアウト時間よりも大きい場合、タイムアウト時間が経過しても一方のロック区間がセマフォを解放しないため、他方のロック区間がスキップされてしまう可能性があると、タイムアウト判断部２８は判断することができる。
【００３４】
検査結果出力部２９は、タイムアウト判断部２８による判断結果を、最大クロック数算出部２５により算出されたクロック数の最大値と共に、排他制御検査結果Ｄ０５として出力する。排他制御検査結果Ｄ０５については、図１３を参照して後述する。
【００３５】
［排他制御検査装置により実行される情報処理の手順］
次に、図３〜図１３を参照して、本発明の実施形態に係わる排他制御検査方法の一例として、図１及び図２に示す排他制御検査装置によって実行される情報処理の手順を説明する。
【００３６】
先ず、ステップＳ０１において、ソースコード入力部２１は、検査対象となるソースコードＤ０１を例えば入出力装置１２から読み込み、記憶装置１４に格納する。なお、ソースコードＤ０１は、予め入出力装置１２を用いてユーザにより排他制御検査装置内に読み込まれ、記憶装置１４に格納されていてもよい。この場合、ステップＳ０１の処理は不要である。図４（ａ）、図４（ｂ）、図４（ｃ）は、読み込まれたソースコードＤ０１として、Ｃ言語で記述されたコンピュータプログラムの一例を示す。検査対象となるコンピュータプログラムは、図４（ａ）、図４（ｂ）、図４（ｃ）に示す３つのファイルに跨って記述されている。図４（ａ）のファイル名は「File1.c」であり、図４（ｂ）のファイル名は「File2.c」であり、図４（ｃ）のファイル名は「File3.c」である。Ｃ言語で記述されたコンピュータプログラムの一例において、各ファイルの左端部に記載された１から始まる連続番号は、各ファイルの「行番号」を示す。
【００３７】
次に、ステップＳ０２において、順序経路特定部２２は、エントリーポイント一覧Ｄ０２を用いて、エントリーポイント（プログラムの開始点）を起点としたコントロールフロー、即ち、ステートメントの実行順序及び実行経路を特定する。
【００３８】
図４（ａ）、図４（ｂ）、図４（ｃ）に示すコンピュータプログラムには、４つの関数が記述されている。図４（ａ）の「File1.c」の中に、関数「Task1」が記述されている。関数「Task1」は、２つの関数「Func1」及び関数「Func2」を呼び出して終了する。関数「Func1」及び関数「Func2」は図４（ｂ）の「File2.c」の中に記述されている。図４（ｃ）の「File3.c」の中に、関数「Task2」が記述されている。関数「Task2」は、関数「Func2」を呼び出して終了する。図６に示すように、プログラムの開始点となるエントリーポイントは、「Task1」及び「Task2」である。
【００３９】
図５の表は、図４（ａ）の関数「Task1」をエントリーポイントとした場合のステートメント（コード）の実行順序及び実行経路の一例を示す。図５の表において、「ステートメントＩＤ」は、ソースコードＤ０１内のステートメントに付される「１」から始まる連続番号である。すなわち「ステートメントＩＤ」は、ソースコードＤ０１を構成する図４（ａ）、図４（ｂ）、図４（ｃ）に示す３つのファイルの、各行に記載された実行命令に対して、行番号の順に付される。
【００４０】
各行の記載が空（例えば図４（ａ）の１０行目）、あるいはプログラムのブロック区切り（“｛”、“｝”などの括弧）のみから構成される行（例えば図４（ａ）の３、１２、１５行目など）は、プログラム実行時において実行時間を発生させるものではないものと判断できる。そのため、順序経路特定部２２は、このような行を以降の処理の対象から外すため、このような行に対して「ステートメントＩＤ」を付していない。もちろん、このような行に対してステートメントＩＤを付したとしても、以降の処理に影響を及ぼすものではない。プログラム実行時において実行時間を発生させる可能性があるものと判断できる行がすべて処理の対象となるようにステートメントＩＤが付与されればよいのであって、ステートメントＩＤの付与の方法は本実施形態の例に限定されるものではない。
【００４１】
「前実行ステートメントＩＤ」は、そのステートメントの前に実行されるステートメントに付されたステートメントＩＤを示す。「次実行ステートメントＩＤ」は、そのステートメントの次に実行されるステートメントに付されたステートメントＩＤを示す。
【００４２】
ステートメントが分岐命令、関数呼出し命令、繰り返し命令である場合には、ジャンプ先のステートメントに対応するステートメントＩＤが、次実行ステートメントＩＤとして登録される。ジャンプ先は一般に１つとは限らず、複数個存在する場合もあるため、次実行ステートメントＩＤとしては、１個または複数個のステートメントＩＤを順序経路特定部２２によって実行順序／実行経路表Ｔ０１に記録する。ステートメントが分岐命令、関数呼出し命令、繰り返し命令のいずれでもない場合には、ソースコードＤ０１上の、次の行番号の箇所で記載されたステートメントに対応するステートメントＩＤを、次実行ステートメントＩＤとして登録する。
【００４３】
前実行ステートメントＩＤは、ソースコードＤ０１に含まれる全てのステートメントについて次実行ステートメントＩＤが記録された後に、実行順序／実行経路表Ｔ０１に登録することができる。例えばソースコードＤ０１のステートメントＬ０１について前実行ステートメントＩＤを登録する場合、実行順序／実行経路表Ｔ０１を参照して、ステートメントＬ０１に対応するステートメントＩＤが次実行ステートメントＩＤとして記録されているステートメントＬ０２を読み出す。つまり、ステートメントＬ０２の１つ後にステートメントＬ０１が実行されることから、ステートメントＬ０１の１つ前に実行されるステートメントはステートメントＬ０２であることが分かる。そのため、ステートメントＬ０１について前実行ステートメントＩＤとしては、ステートメントＬ０２に対応するステートメントＩＤを記録する。ソースコードＤ０１の全てのステートメントについて、同様の作業を繰り返すことにより、全ての前実行ステートメントＩＤを記録することができる。
【００４４】
なお、ステートメントＬ０１について次実行ステートメントＩＤが複数記録されている場合には、記録されている次実行ステートメントＩＤのそれぞれについて同様の処理を繰り返すことにより、前実行ステートメントＩＤを記録することができる。
【００４５】
順序経路特定部２２は、ソースコードＤ０１に含まれるステートメントの中から条件分岐を検出する。条件分岐には、if〜else構文、switch〜case構文、ループ文（for文、while文）、３項演算子“：”が含まれる。順序経路特定部２２は、条件分岐が開始するステートメントを「分岐開始点」と判断し、条件分岐が終了するステートメントを「分岐終了点」と判断する。特定された２以上の「分岐開始点」「分岐終了点」には「分岐ＩＤ」を付して識別する。ただし分岐開始点とその分岐開始点に対応する分岐終了点には、対応関係が分かるよう同一の分岐ＩＤを付す。
【００４６】
そして、順序経路特定部２２は、分岐開始点と分岐終了点との間にあるステートメントに対して、条件分岐によって生成される２以上の実行経路を特定する。そして、特定された２以上の実行経路には「経路ＩＤ」を付して識別する。
【００４７】
図５には、関数「Task1」をエントリーポイントとした場合を例示するが、順序経路特定部２２は、関数「Task2」をエントリーポイントとして場合についても、図５と同様にして実行順序及び実行経路を特定する。
【００４８】
なお図５の例では、順序経路特定部２２は、分岐開始点にあるステートメントに対して条件分岐によって生成される２以上の実行経路を特定し、一方で、分岐終了点にあるステートメントに対しては実行経路を特定していない。分岐開始点および分岐終了点のステートメントについて実行経路の特定を行うか否かは、本実施形態の例に限定されるものではない。
【００４９】
さらに、図５の例では、条件分岐により複数の実行経路のうちいずれの実行経路を進む場合でも、条件文の評価に際してクロック数が発生するため、条件文を含む条件分岐を表すステートメントは、複数の実行経路に属しているものとして扱っている。このように、順序経路特定部２２は、複数の実行経路で実行されるものと判断されるステートメントに対して、対応する複数の実行経路を指し示す複数の経路ＩＤを付す。
【００５０】
上述したようにして、順序経路特定部２２は、図５の表に示すようなソースコードＤ０１に含まれるステートメント（コード）の実行順序／実行経路表Ｔ０１を作成する。
【００５１】
実行順序／実行経路表Ｔ０１に記録された前実行ステートメントＩＤおよび次実行ステートメントＩＤを用いると、ステートメントの上流、および下流で実行されるステートメントを抽出することができる性質に注意する。すなわち、前実行ステートメントＩＤを参照することで、順次、１つ前に実行されるステートメントを参照できるため、あるステートメントに関して、その上流で実行されるステートメント抽出することができる。また、次実行ステートメントＩＤを参照することで、順次、１つ後に実行されるステートメントを参照できるため、下流で実行されるステートメントを抽出することができる。
【００５２】
次に、ステップＳ０３〜Ｓ０５に示す情報処理Ｆ０１を実行する。ステップＳ０３において、ロック区間特定部２３は、図７に示すロック開始命令／解除命令リストＤ０３に基づいて、ロック開始命令から解除命令までの区間（ロック区間）を特定する。ステップＳ０４において、タイムアウト時間抽出部２６は、特定されたロック区間の各々について、タイムアウト時間を抽出する。ステップＳ０５において、クロック数算出部２４は、図８に示す所要クロック数一覧Ｄ０４に基づいて、ロック区間に含まれる各ステートメントの実行に要するクロック数を算出する。
【００５３】
図７の表は、ロック開始命令／解除命令リストＤ０３の一例を示す。ロック開始命令として「Sem_Lock」が定義され、ロック解除命令として「Sem_UnLock」が定義されている。ソースコードＤ０１の中で用いられる複数のセマフォを識別するためのセマフォＩＤは、「Sem_Lock」及び「Sem_UnLock」でそれぞれ引用される第１引数によって指定される。また、タイムアウト時間は、「Sem_Lock」で引用される第２引数によって指定される。例えば、図４（ａ）の４行目に示す「Sem_Lock(ID1,100)」とは、セマフォＩＤが「ID1」で識別されるセマフォによるロック区間の開始命令を示し、４行目から始まるロック区間のタイムアウト時間が１００（クロック数）であることを示す。図４（ａ）の９行目に示す「Sem_UnLock(ID1)」とは、セマフォＩＤが「ID1」のセマフォによるロック区間の解除命令を示す。
【００５４】
図８の表は、所要クロック数一覧Ｄ０４の一例を示す。ステートメントに記述される命令毎に、その命令の実行に必要なクロック数が定義されている。
【００５５】
ここで、ステップＳ０３〜Ｓ０５は並行して実施することができる。図９のフローチャートを参照して、ステップＳ０３〜Ｓ０５に示す情報処理Ｆ０１の詳細な処理手順の一例を説明する。
【００５６】
先ず、ステップＳ１０１において、ロック区間を識別するための区間ＩＤを初期化する。ステップＳ１０２において、ソースコードＤ０１に含まれるタスクを識別するためのタスクＩＤを初期化する。ステップＳ１０３へ進み、ステップＳ１０２で初期化されたタスクＩＤで特定される関数「Task1」における最初のステートメント（ステートメントＩＤ＝１）を読み込む。
【００５７】
ロック区間特定部２３は、図７のロック開始命令／解除命令リストＤ０３を参照して、読み込んだステートメントがロック開始命令「Sem_Lock」あるいはロック解除命令「Sem_UnLock」に合致するか否かを判断する。ロック開始命令「Sem_Lock」に合致する場合、ステップＳ１０５に進む。ロック解除命令「Sem_UnLock」に合致する場合、ステップＳ１０７に進む。ロック開始命令「Sem_Lock」及びロック解除命令「Sem_UnLock」の何れにも合致しない場合、ステップＳ１０８に進む。
【００５８】
ステップＳ１０５において、区間ＩＤをカウントアップする。ステップＳ１０６に進み、ステートメント種別としてのロック開始命令（「開始））、区間ＩＤ、セマフォＩＤ、及びタイムアウト時間をロック区間特定表Ｔ０２に記録する。ここで記録するセマフォＩＤ、及びタイムアウト時間は、ロック開始命令の第１引数および第２引数を参照することで得られる。その後、ステップＳ１１３に進む。
【００５９】
一方、ステップＳ１０７において、ステートメント種別としてのロック解除命令（「解除」）、セマフォＩＤが同じである上流のロック開始命令の区間ＩＤ、およびセマフォＩＤをロック区間特定表Ｔ０２に記録する。その後、ステップＳ１１３に進む。
【００６０】
ステップＳ１０７において、セマフォＩＤは、ロック解除命令の第１引数を参照することで得られる。また、上流のロック開始命令は、実行順序／実行経路表Ｔ０１の前実行ステートメントＩＤを使用することにより抽出できる。読み込んだステートメントに対応する前実行ステートメントＩＤを参照することで、１つ前に実行されるステートメントを抽出できる。そのステートメントがロック開始命令でない場合、前実行ステートメントＩＤを参照してさらに１つ前に実行されるステートメントを抽出する。同様の作業を繰り返すことにより、最終的に上流のロック開始命令を抽出できる。そこで上流のロック開始命令のセマフォＩＤが、ロック解除命令のセマフォＩＤと同じであるか否かを判定する。同じである場合には、上流のロック開始命令の区間ＩＤをロック区間特定表Ｔ０２に記録する。なお前実行ステートメントＩＤには、１つ前に実行されるステートメントに対応する複数のステートメントＩＤが記載される場合があるので、複数の上流のロック開始命令が存在する場合も起こりうる。
【００６１】
ステップＳ１０８において、ロック区間特定部２３は、読み込んだステートメントが、ロック開始命令からロック解除命令までのロック区間内にあるか否かを判定する。ロック区間内にある場合（ステップＳ１０８でＹＥＳ）、ステップＳ１０９に進む。一方、ロック区間内にない場合（ステップＳ１０８でＮＯ）、ステップＳ１１０に進み、ロック区間特定部２３は、ステートメント種別として「区間外」をロック区間特定表Ｔ０２に記録する。その後、ステップＳ１１３へ進む。
【００６２】
ステップＳ１１０において、ロック区間特定部２３は、ステートメント種別として「区間内」及び区間ＩＤをロック区間特定表Ｔ０２に記録する。ステップＳ１１１に進み、クロック数算出部２４は、読み込んだステートメントに記述された総ての命令を抽出する。ステップＳ１１２に進み、クロック数算出部２４は、図８に示す所要クロック数一覧Ｄ０４に基づいて、読み込んだステートメントから抽出した総ての命令の実行に必要なクロック数の総和を算出する。これにより、クロック数算出部２４は、読み込んだステートメントの実行に要するクロック数を求めることができる。クロック数算出部２４は、算出されたクロック数をロック区間特定表Ｔ０２に記録する。その後、ステップＳ１１３へ進む。
【００６３】
ステップＳ１１３において、読み込んだステートメントが、ロック区間内の最後のステートメントであるか否かを判断する。ロック区間内の最後のステートメントでない場合（ステップＳ１１３でＮＯ）、実行順序／実行経路表Ｔ０１の次実行ステートメントＩＤを参照して、次のステートメントを読み込み（Ｓ１１８）、ステップＳ１０４へ戻る。一方、読み込んだステートメントが、ロック区間内の最後のステートメントである場合（ステップＳ１１３でＹＥＳ）、ステップＳ１１４へ進む。未だ判定していないステートメントがある場合（Ｓ１１４でＹＥＳ）、ステップＳ１１５に進み、未だ判定していないステートメントを読み込み、ステップＳ１０４へ戻る。
【００６４】
一方、未だ判定していないステートメントがない場合（Ｓ１１４でＮＯ）、ステップＳ１１６に進み、ステップＳ１０２で初期化されたタスクＩＤで特定される関数「Task1」が最後のタスクであるか否かを判断する。最後のタスクでなければ（ステップＳ１１６でＮＯ）、タスクＩＤをインクリメントして（ステップＳ１１７）、ステップＳ１０３に戻る。そして、関数「Task2」について上記した手順を実行する。一方で、最後のタスクであれば（ステップＳ１１６でＹＥＳ）、図９のフローチャートは終了する。
【００６５】
読み込んだステートメントが、ロック開始命令からロック解除命令までのロック区間内にあるか否かの判定は、実行順序／実行経路表Ｔ０１の前実行ステートメントＩＤおよび次実行ステートメントＩＤを用いて、読み込んだステートメントの上流および下流で実行されるステートメントを検索し、ロック開始命令、ロック解除命令が存在するか否かによって行う。検索して得られたロック開始命令とロック解除命令について、セマフォＩＤおよび区間ＩＤが同一であれば、読み込んだステートメントは区間IDで指定されるロック区間に含まれているものと、ロック区間特定部２３は判断できる。また、一般に、ソースコードＤ０１が条件分岐を含んでいる場合、読み込んだステートメントが複数のロック区間にある場合も起こりうる。
【００６６】
上流および下流で実行されるステートメントの検索には、タスクに含まれる全てのロック開始命令およびロック解除命令について、ロック区間特定表Ｔ０２への記録が行われている必要があるが、図９のフローチャートの処理では簡略化して表現している。
【００６７】
図１０の表は、図９のフローチャートの実行結果の一例として、図４（ａ）の関数「Task1」についての実行結果を示しており、図４（ａ）の関数「Task1」についての、ロック区間特定表Ｔ０２を表す。ステートメントＩＤ＝２〜７の一群のステートメントが、区間ＩＤ＝１で識別されるロック区間として特定される。区間ＩＤ＝１のロック区間のロック開始命令「Sem_Lock」と合致するステートメントＩＤ＝２では、セマフォＩＤ＝１及びタイムアウト時間＝１００を記録している。ステートメントＩＤ＝２〜７で実行されるステートメントＩＤ＝３〜６の一群のステートメントには「区間内（区間ＩＤ＝１）」がそれぞれ記録され、ステートメントＩＤ＝３〜６の一群のステートメントの各々について、ステートメントに含まれる命令のリスト及びステートメントの実行に要するクロック数が記録されている。ロック区間（区間ＩＤ＝１）のロック解除命令「Sem_UnLock」と合致するステートメントＩＤ＝７のステートメントに対しては、セマフォＩＤ＝１が記録されている。なお、ロック区間（区間ＩＤ＝１）では、１つのロック区間の中に、経路ＩＤ（1,1）（1,2）でそれぞれ識別される２つの実行経路に分岐する分岐処理が存在している。
【００６８】
同様にして、ステートメントＩＤ＝９、１０、１５、１６、１４の順番で実行される一群のステートメントが、区間ＩＤ＝２で識別されるロック区間として特定される。また、ステートメントＩＤ＝１２、１３、１７、１８、１４の順番で実行される一群のステートメントが、区間ＩＤ＝３で識別されるロック区間として特定される。ロック区間（区間ＩＤ＝２）及びロック区間（区間ＩＤ＝３）で使用するセマフォ（セマフォＩＤ＝ＩＤ２）は共通している。一方、ロック区間（区間ＩＤ＝２）及びロック区間（区間ＩＤ＝３）で使用するセマフォ（セマフォＩＤ＝ＩＤ２）は、ロック区間（区間ＩＤ＝１）で使用するセマフォ（セマフォＩＤ＝ＩＤ１）とは異なる。なお、ロック区間（区間ＩＤ＝２）及びロック区間（区間ＩＤ＝３）は、ステートメントＩＤ＝８のステートメントを分岐開始点（分岐ＩＤ＝２）とし、ステートメントＩＤ＝１４のステートメントを分岐終了点（分岐ＩＤ＝２）とする、それぞれ経路ＩＤ（2,1）（2,2）で識別される２つの実行経路の中に存在している。
【００６９】
上述したようにして、ロック区間特定部２３およびクロック数算出部２４は、実行順序／実行経路表Ｔ０１を元にして、図１０の表に示すようなソースコードＤ０１に含まれるステートメント（コード）のロック区間特定表Ｔ０２を作成する。このロック区間特定表Ｔ０２には、ロック区間特定部２３が特定したステートメント種別、区間ＩＤ、セマフォＩＤ、タイムアウト時間が記録される。そして、クロック数算出部２４が抽出したステートメント内の命令、もしくはその命令の種別、クロック数が記録される。
【００７０】
図３に戻り、ステップＳ０６において、クロック数算出部２４は、ロック区間特定部２３により特定されたロック区間に含まれる実行経路の各々について、ロック区間の実行に要するクロック数を算出する。具体的には、図９のステップＳ１１２において算出された、各ステートメントの実行に要するクロック数を、記憶装置１４に記録されたロック区間特定表Ｔ０２から読み出し、各ロック区間に含まれる総てのステートメントについてクロック数を合算する。これにより、実行経路の各々について、ロック区間の実行に要するクロック数を算出することができる。この際、ロック区間（ロックＩＤ＝１）内に２以上の実行経路（経路ＩＤ（1,1）（1,2））が存在する場合、実行経路の各々について、ロック区間の実行に要するクロック数を算出する。算出されたロック区間の実行に要するクロック数は、図１１に示すクロック数合計管理表Ｔ０３に記録される。
【００７１】
図１１のクロック数合計管理表Ｔ０３のうち、「区間内ステートメントのクロック数合計」は、関数「Task1」及び関数「Task2」に含まれるロック区間（ロックＩＤ＝１〜４）について、ロック区間の実行に要するクロック数を示す。ロック区間（ロックＩＤ＝１）に関しては、ロック区間内に２つの実行経路（経路ＩＤ（1,1）（1,2））が存在するため、実行経路毎にロック区間の実行に要するクロック数を示す。例えば、図１０に示したように、経路ＩＤ（1,1）で識別される実行経路には、ステートメントＩＤ＝３、４の一群のステートメントが含まれる。ステートメントＩＤ＝３のステートメントの実行に要するクロック数は、「１」であり、ステートメントＩＤ＝４のステートメントの実行に要するクロック数は、「３」である。よって、図１１に示すように、経路ＩＤ（1,1）で識別される実行経路について、ロック区間（ロックＩＤ＝１）の実行に要するクロック数は「１＋３」＝「４」である。
【００７２】
ステップＳ０７において、最大クロック数算出部２５は、クロック数合計管理表Ｔ０３のうち「区間内ステートメントのクロック数合計」を参照して、ロック区間の各々について、ステップＳ０６において算出されたクロック数の最大値を算出する。図１１に示すように、ロック区間（ロックＩＤ＝１）に関しては、経路ＩＤ（1,1）で識別される実行経路のクロック数（＝４）と、経路ＩＤ（1,2）で識別される実行経路のクロック数（＝３）とを比較して、大きい方のクロック数（＝４）を選択する。１つのロック区間に１つの実行経路だけが含まれている場合、ステップＳ０６において算出されたクロック数がそのまま、そのロック区間におけるクロック数の最大値となる。
【００７３】
図１１に示すように、実施形態に係わる排他制御検査装置は、検査対象となるソースコードＤ０１に含まれる排他制御に関する構造を可視化することができる。換言すれば、ソースコードＤ０１に含まれる排他制御に関する構造として、エントリーポイント、区間ＩＤ、セマフォＩＤ、経路ＩＤ、経路に含まれるステートメントＩＤを特定することができる。そして、静的な解析方法により、検査対象となるソースコードＤ０１中で実行し得るロック区間の各々について、ロック区間の実行に要するクロック数の最大値を求めることができる。よって、コンピュータプログラム中で実行し得るロック区間について、システムの応答性が悪化する可能性がある箇所を漏れなく特定することができる。
【００７４】
図３に戻り、ステップＳ０８において、競合ロック区間特定部２７は、クロック数合計管理表Ｔ０３を参照して、ロック区間の各々について、ロック区間が属するタスクとは異なる他のタスクに属する他のロック区間を特定する。更に、実施形態では、ソースコードＤ０１の中で、複数種類のセマフォ（セマフォＩＤ＝ＩＤ１及びＩＤ２）を用いている。セマフォが異なれば、セマフォの取得に関する競合関係は生じない。このため、同じセマフォを用いているロック区間において、異なるタスクに属するロック区間の組合せを特定する。図１２は排他制御構造管理表Ｔ０４を示す。排他制御構造管理表Ｔ０４には、競合関係にあるブロック区間の組合せが記録される。ステップＳ０８において、競合ロック区間特定部２７により排他制御構造管理表Ｔ０４は読み出され、あるいは更新される。
【００７５】
ロック区間（ロックＩＤ＝１）は、関数「Task1」に属し、且つセマフォ（セマフォＩＤ＝ＩＤ１）を使用する。ロック区間（ロックＩＤ＝２）及びロック区間（ロックＩＤ＝３）は、関数「Task1」に属し、且つセマフォ（セマフォＩＤ＝ＩＤ２）を使用する。一方、ロック区間（ロックＩＤ＝４）は、関数「Task2」に属し、且つセマフォ（セマフォＩＤ＝ＩＤ２）を使用する。
【００７６】
よって、ロック区間（ロックＩＤ＝２）、ロック区間（ロックＩＤ＝３）、及びロック区間（ロックＩＤ＝４）は、同一の共有資源に対して同じセマフォ（セマフォＩＤ＝ＩＤ２）を用いて排他制御を実行する。ここでロック区間（ロックＩＤ＝２）とロック区間（ロックＩＤ＝４）は、異なるタスク「Task1」、「Task2」に属するため、セマフォＩＤ＝ＩＤ２のセマフォの取得に関して競合関係にある。同様に、ロック区間（ロックＩＤ＝３）とロック区間（ロックＩＤ＝４）は、セマフォＩＤ＝ＩＤ２のセマフォの取得に関して競合関係にある。一方、ロック区間（ロックＩＤ＝２）とロック区間（ロックＩＤ＝３）は、同じセマフォＩＤ＝ＩＤ２のセマフォを使用するが、同じタスク「Task1」に属するため、セマフォＩＤ＝ＩＤ２のセマフォの取得に関して競合することはない。
【００７７】
ロック区間（ロックＩＤ＝１）については、その他のロック区間（ロックＩＤ＝２）、ロック区間（ロックＩＤ＝３）、ロック区間（ロックＩＤ＝４）とは使用するセマフォが異なるため競合しない。
【００７８】
上述したように、競合ロック区間特定部２７は各ロック区間について、そのロック区間の属するタスク、および使用するセマフォの情報を用いて、その他のロック区間と競合するか否かを特定する。ステップＳ０８の実行後において、排他制御構造管理表Ｔ０４は、競合ロック区間特定部２７が特定した、競合関係にあるブロック区間の組合せに関する情報を格納した状態となる。
【００７９】
次に、ステップＳ０９に進み、タイムアウト判断部２８は、ロック区間のクロック数の最大値が、競合する他のロック区間のタイムアウト時間よりも大きいか否かを判断する。具体的には、タイムアウト判断部２８は、ロック区間特定表Ｔ０２に記録された各ロック区間のタイムアウト時間と、排他制御構造管理表Ｔ０４に記録された競合関係にあるブロック区間の組合せの情報とを参照する。そしてステップＳ０８で特定された競合関係にあるロック区間の組合せのうち、一方のロック区間の実行に要するクロック数の最大値と、他方のロック区間のタイムアウト時間とを対比する。なお、前述したように、タイムアウト時間は、マイコンが行うタイミング制御に用いる内部クロックの数として表現されるため、クロック数の最大値と比較することは可能である。
【００８０】
一方のロック区間の実行に要するクロック数の最大値が、他方のロック区間のタイムアウト時間よりも大きい場合（ステップＳ０９でＹＥＳ）、タイムアウト判断部２８は、他方のロック区間をスキップしてしまう可能性があると判断する（ステップＳ１０）。
【００８１】
一方のロック区間の実行に要するクロック数の最大値が、他方のロック区間のタイムアウト時間よりも小さいあるいは等しい場合（ステップＳ０９でＮＯ）、タイムアウト判断部２８は、他方のロック区間をスキップしてしまう可能性は無いと判断する（ステップＳ１２）。
【００８２】
タイムアウト判断部２８は、ステップＳ０９で特定された総てのブロック区間の組合せについて、ステップＳ０９の判断を実行する。
【００８３】
ステップＳ１１に進み、検査結果出力部２９は、タイムアウト判断部２８による判断結果を、最大クロック数算出部２５により算出されたクロック数の最大値と共に、排他制御検査結果Ｄ０５として出力する。図１３は、排他制御検査結果Ｄ０５の一例を示す表である。例えば、一方のロック区間（ロックＩＤ＝３）のクロック数の最大値（＝６）は、競合する他方のロック区間（ロックＩＤ＝４）のタイムアウト時間（＝５）よりも大きい。つまり、一方のロック区間（ロックＩＤ＝３）がセマフォＩＤ＝ＩＤ２のセマフォをロックしている間に、他方のロック区間（ロックＩＤ＝４）はセマフォＩＤ＝ＩＤ２のセマフォを取得することなく、セマフォ解除待ちのまま、タイムアウト時間が経過してしまう可能性がある。そこで、タイムアウト判断部２８は、関数「Task1」の実行中にロック区間（ロックＩＤ＝４）をスキップしてしまう可能性があると判断する。同様に、一方のロック区間（ロックＩＤ＝４）のクロック数の最大値（＝１１）は、競合する他方のロック区間（ロックＩＤ＝２）のタイムアウト時間（＝１０）よりも大きい。このため、タイムアウト判断部２８は、関数「Task2」の実行中にロック区間（ロックＩＤ＝２）をスキップしてしまう可能性があると判断する。
【００８４】
これに対して、一方のロック区間（ロックＩＤ＝２）のクロック数の最大値（＝５）は、競合する他方のロック区間（ロックＩＤ＝４）のタイムアウト時間（＝５）よりも大きくない。同様に、一方のロック区間（ロックＩＤ＝４）のクロック数の最大値（＝１１）は、競合する他方のロック区間（ロックＩＤ＝３）のタイムアウト時間（＝１５）よりも大きくない。よって、これらのロック区間の組合せについては、セマフォの解除待ちのまま、タイムアウト時間が経過してしまう可能性はないと判断することができる。なお、図１３には、セマフォＩＤ＝ＩＤ１のセマフォを使用するロック区間（ロックＩＤ＝１）を記載しているが、ソースコードＤ０１の中にセマフォＩＤ＝ＩＤ１のセマフォを使用する他のロック区間が無いため、競合関係は存在しない。
【００８５】
［実施形態による効果］
コンピュータプログラムにおいて、複数のタスクやアプリケーションが同一のリソース（資源）にアクセスする場合、アクセスの競合によるデータ破壊を避けるため、セマフォ等の排他制御により他のタスクからのアクセスを一時的に禁止する処置をとる。すなわち、一方のタスクがリソースを使用する一定区間、他方のタスクの起動をロックする。ロックされるタスクは、ロックするタスクがセマフォを解放した後に起動され、リソースへのアクセスを実行する。ここで、他のタスクからのリソースアクセスをロックする区間（ロック区間）の設定を誤ると、ロックするタスクが不当な時間リソースを占有し、他のタスクの動作を遅くするという問題が発生する。結果的には、タスクの応答時間が延び、システムの動作が鈍くなるという不具合につながる。
【００８６】
このような問題を避け、システムの応答性を許容範囲内に収めるため、セマフォの開放待ち、即ちロック解除待ちのタイムアウト時間を設定する。タイムアウト時間を超えてもセマフォが解放されない場合に、リソースへのアクセス処理をスキップし、その先の処理を実行する。
【００８７】
しかしながら、レガシーコードの流用や拡張により、ロック区間が想定外に長くなると、設定されたタイムアウト時間に対しロック区間の平均処理時間が長くなり、タイムアウトが頻発するという問題が起きる。また、大規模なソフトウェアでは、ロックの競合関係が把握できず、不適切なタイムアウト時間が設定されてしまうという問題がある。
【００８８】
そこで、実施形態に係わる排他制御検査装置は、順序経路特定部２２により、検査対象となるソースコードＤ０１（コンピュータプログラム）に含まれるステートメントの実行順序及び実行経路を特定し、特定されたステートメントの実行順序及び実行経路に基づいて、ロック区間特定部２３はコンピュータプログラムに含まれる複数のタスクが利用可能な共有資源に対して排他制御を実行する一群のステートメントからなるロック区間を特定する。そして、特定されたロック区間に含まれる実行経路の各々について、クロック数算出部２４はロック区間の実行に要するクロック数を算出する。これにより、排他制御を実行するロック区間の各々についてロック時間の最大値を求めることができる。検査結果出力部２９によって、特定された実行順序及び実行経路、ロック区間、算出されたクロック数などの情報が検査結果として出力されるため、コンピュータプログラム中で実行し得るロック区間について、システムの応答性が悪化する可能性がある箇所をユーザに気づかせることができる。これにより、タイムアウト時間を適正化して、システムの応答性を改善することができる。また、コンピュータプログラムを静的な手法により解析することにより、実際に実行されないロック区間やロック解除待ち処理を検査対象とすることができるため、検証の見落としを抑制することができる。
【００８９】
また、排他制御検査装置は、タイムアウト時間抽出部２６によってロック区間の各々について、共有資源へのアクセス制限が解除されることを待つことができるロック区間に設定されたタイムアウト時間を抽出し、ロック区間が取得するセマフォ、およびロック区間が属するタスクの情報に基づき、競合ロック区間特定部２７によってロック区間の各々について競合関係を形成する他のロック区間を特定する。そして、タイムアウト判断部２８は、競合関係を形成する一方のロック区間のクロック数の最大値が、競合関係を形成する他方のロック区間のタイムアウト時間よりも大きい場合、他方のロック区間がスキップされる可能性があると判断し、その判断結果は、検査結果出力部２９によって出力される。これにより、例えば、レガシーコードの移植ミスや、分散開発されたソースコードの結合ミスにより、不適切なタイムアウト時間が設定されている箇所を、ユーザに気づかせることができる。よって、タイムアウト時間の適正化を図り、タイムアウトの頻発を抑制することができる。
【００９０】
その他の変形例として、例えば、図３のステップＳ０９及びＳ１０において、スキップしてしまう可能性があると判断した競合関係にあるロック区間の組合せに対して、排他制御検査装置は、一方のロック区間のクロック数の最大値に対する、他方のロック区間のタイムアウト時間の割合を検証優先度として算出して、排他制御検査結果Ｄ０５として出力してもよい。この割合（検証優先度）が高い程、つまり、１００％に近い程、排他制御に関する検証優先度が高まる。スキップしてしまう可能性がある箇所として、複数のロック区間の組合せを特定する情報が出力される場合、検証対象としての優先度をユーザに伝えることができるので、ユーザによる検証作業の効率を高めることができる。検証優先度が１００％未満だが極めて１００％に近い値のロック区間の組合せを点検することで、レガシーコードの移植ミスや、分散開発されたソースコードの結合ミスにより、不適切なタイムアウト時間が設定されている箇所を、効率よく発見できる。
【００９１】
以上、本発明の実施形態について説明したが、これらの実施形態は本発明の理解を容易にするために記載された単なる例示に過ぎず、本発明は当該実施形態に限定されるものではない。本発明の技術的範囲は、上記実施形態で開示した具体的な技術事項に限らず、そこから容易に導きうる様々な変形、変更、代替技術なども含むものである。この開示から当業者には様々な代替実施の形態、実施例及び運用技術が明らかとなろう。
【００９２】
本出願は、２０１３年１月２１日に出願された日本国特許願第２０１３−００８３５６号に基づく優先権を主張しており、この出願の全内容が参照により本明細書に組み込まれる。
【産業上の利用可能性】
【００９３】
本発明によれば、コンピュータプログラムを静的な手法により解析し、排他制御を実行するロック区間の各々についてロック時間の最大値を求めることができる。よって、コンピュータプログラム中で実行し得るロック区間について、システムの応答性が悪化する可能性がある箇所をユーザに気づかせることができる。
【符号の説明】
【００９４】
２１  ソースコード入力部
２２  順序経路特定部
２３  ロック区間特定部
２４  クロック数算出部
２５  最大クロック数算出部
２６  タイムアウト時間抽出部
２７  競合ロック区間特定部
２８  タイムアウト判断部
２９  検査結果出力部
Ｄ０１  ソースコード（コンピュータプログラム）
Ｄ０２  エントリーポイント一覧
Ｄ０３  ロック開始命令／解除命令リスト
Ｄ０４  所要クロック数一覧
Ｄ０５  排他制御検査結果
Ｔ０１  実行順序／実行経路表
Ｔ０２  ロック区間特定表
Ｔ０３  クロック数合計管理表
Ｔ０４  排他制御構造管理表
【図１】
0005979250.tif 000002
【図２】
0005979250.tif 000003
【図３】
0005979250.tif 000004
【図４】
0005979250.tif 000005
【図５】
0005979250.tif 000006
【図６】
0005979250.tif 000007
【図７】
0005979250.tif 000008
【図８】
0005979250.tif 000009
【図９】
0005979250.tif 000010
【図１０】
0005979250.tif 000011
【図１１】
0005979250.tif 000012
【図１２】
0005979250.tif 000013
【図１３】
0005979250.tif 000014