(57)【要約】      （修正有）【課題】１つのセマフォで管理している複数の共有リソースのうち、個別のセマフォで管理すべき共有リソースをソースコードの静的解析で検出。【解決手段】ソースコードを入力するためのソースコード入力部１１と、入力されたソースコードの中のセマフォを検出するためのセマフォ検出部１３と、検出されたセマフォごとに、管理されている複数の共有リソースを検出するための共有リソース検出部１４と、検出されたセマフォごとに、管理されている複数の共有リソースそれぞれについて、他の共有リソースとアクセスタイミングに関連があるかどうかを判定するための判定表生成部１５と、検出されたセマフォごとに、管理されている複数の共有リソースのうちアクセスタイミングに関連のある共有リソースについてグループ化処理を行なうための独立リソース判定部１６と、検出されたセマフォごとに、グループ化処理の結果を出力するための結果出力部１７とを備える。【選択図】図４
2010157147.tif 000002
【特許請求の範囲】
【請求項１】
セマフォを使用したソフトウエアを検査することにより、１つのセマフォにおいて管理されている共有リソース間のアクセスタイミングについての関係を出力するためのソフトウェア検査装置であって、
解析対象となるソフトウェアのソースコードを入力するための入力手段と、
前記入力手段から入力されたソースコードの中のセマフォを検出するためのセマフォ検出手段と、
前記セマフォ検出手段で検出されたセマフォごとに、管理されている複数の共有リソースを検出するための共有リソース検出手段と、
前記検出されたセマフォごとに、前記管理されている複数の共有リソースそれぞれについて、他の共有リソースとアクセスタイミングに関連があるかどうかを判定するための判定手段と、
前記検出されたセマフォごとに、前記判定手段による判定結果に基づいて、前記管理されている複数の共有リソースのうちアクセスタイミングに関連のある共有リソースについてグループ化処理を行なうためのグループ化手段と、
前記検出されたセマフォごとに、前記グループ化処理の結果を出力するための出力手段とを備える、ソフトウェア検査装置。
【請求項２】
セマフォを取得および解放する関数名の指定を受付けるための関数指定手段をさらに備え、
前記セマフォ検出手段は、指定された関数名に基づいてセマフォを検出する、請求項１に記載のソフトウェア検査装置。
【請求項３】
前記出力手段は、前記管理されている複数の共有リソースを前記グループ化手段によるグループ単位で出力する、請求項１または２に記載のソフトウェア検査装置。
【請求項４】
前記共有リソース検出手段は、前記検出されたセマフォごとに、排他区間内で用いられている共有リソースのうち、前記排他区間外で用いられている共有リソースを除外した共有リソースを、前記管理されている複数の共有リソースとして検出する、請求項１〜３のいずれかに記載のソフトウェア検査装置。
【請求項５】
前記判定手段は、前記管理されている複数の共有リソースを縦軸および横軸にした判定表を生成し、前記管理されている複数の共有リソースの各対について、全ての前記排他区間に両方含まれるか否かの判定結果を記録する、請求項４に記載のソフトウェア検査装置。
【請求項６】
セマフォを使用したソフトウエアを検査するソフトウェア検査装置によって実行される、１つのセマフォにおいて管理されている共有リソース間のアクセスタイミングについての関係を出力するための方法であって、
解析対象となるソフトウェアのソースコードを入力するステップと、
入力されたソースコードの中のセマフォを検出するステップと、
検出されたセマフォごとに、管理されている複数の共有リソースを検出するステップと、
前記検出されたセマフォごとに、前記管理されている複数の共有リソースそれぞれについて、他の共有リソースとアクセスタイミングに関連があるかどうかを判定するステップと、
前記検出されたセマフォごとに、前記管理されている複数の共有リソースのうちアクセスタイミングに関連のある共有リソースについてグループ化処理を行なうステップと、
前記検出されたセマフォごとに、前記グループ化処理の結果を出力するステップとを備える、ソフトウェア検査方法。
【請求項７】
セマフォを使用したソフトウエアを検査するソフトウェア検査装置によって実行される、１つのセマフォにおいて管理されている共有リソース間のアクセスタイミングについての関係を出力するためのプログラムであって、
解析対象となるソフトウェアのソースコードを入力するステップと、
入力されたソースコードの中のセマフォを検出するステップと、
検出されたセマフォごとに、管理されている複数の共有リソースを検出するステップと、
前記検出されたセマフォごとに、前記管理されている複数の共有リソースそれぞれについて、他の共有リソースとアクセスタイミングに関連があるかどうかを判定するステップと、
前記検出されたセマフォごとに、前記管理されている複数の共有リソースのうちアクセスタイミングに関連のある共有リソースについてグループ化処理を行なうステップと、
前記検出されたセマフォごとに、前記グループ化処理の結果を出力するステップとを備える、ソフトウェア検査プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェア検査装置、ソフトウェア検査方法およびソフトウェア検査プログラムであって、特に、セマフォを使用したソフトウエアを検査することにより、１つのセマフォにおいて管理されている共有リソース間のアクセスタイミングについての関係を出力するためのソフトウェア検査装置、ソフトウェア検査方法およびソフトウェア検査プログラムに関する。
【背景技術】
【０００２】
複数の処理が同時に実行されるプログラムにおいて、複数の処理が共通のリソース（変数）に同時にアクセスすると、データの不整合が発生するなど不具合の原因となる。そのため、通常はセマフォ等の技術を用いて１つの処理のみが共有リソースを占有してアクセスする方法をとる。
【０００３】
基本的には１つの共有リソースを１つのセマフォが管理すべきであるが、実際にはセマフォが使用するメモリ量を減らす、あるいはセマフォによるロック／アンロックの手間を削減するため、複数の共有リソースを１つのセマフォで管理するということが行われている。
【０００４】
例えば特許文献１では、セマフォが使用するメモリ量を減らす工夫をしている。また、特許文献２では、セマフォなどのＳＷ（ソフトウェア）資源の長い待ち時間の原因を特定するために、待ちプロセスの多いＳＷ資源を検出することが記載されている。
【特許文献１】特開昭６３−２０１７３２号公報
【特許文献２】特開２００５−３３９４３７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
実際にはアクセスの競合が起きない２以上の共有リソースが、１つのセマフォで管理されると、不必要な待ち時間が生じる場合がある。したがって、１つのセマフォで管理されている複数の共有リソースに、本来別のセマフォで管理すべき共有リソースが含まれるか否かを検出することができれば有用である。
【０００６】
一般的に、共有リソースへのアクセスの競合（排他制御不具合）による待ちの発生の検出は動的解析により行なわれる。このため、処理内の条件分岐を網羅するために、条件を変更して動的解析を行なう必要があり、解析に相当な時間がかかる。また、このような解析を行なうためには、動的解析の実行に必要な環境を別途用意する必要がある。
【０００７】
上述の従来技術では、１つのセマフォで管理されている複数の共有リソースに、本来別のセマフォで管理すべき共有リソースが含まれるか否かの検出までは行なわれていない。
【０００８】
本発明は、上記のような問題を解決するためになされたものであって、その目的は、１つのセマフォで管理している複数の共有リソースのうち、個別のセマフォで管理すべき共有リソースをソースコードの静的解析で検出することのできるソフトウェア検査装置、ソフトウェア検査方法およびソフトウェア検査プログラムを提供することである。
【課題を解決するための手段】
【０００９】
この発明のある局面に従うソフトウェア検査装置は、セマフォを使用したソフトウエアを検査することにより、１つのセマフォにおいて管理されている共有リソース間のアクセスタイミングについての関係を出力するためのソフトウェア検査装置であって、解析対象となるソフトウェアのソースコードを入力するための入力手段と、入力手段から入力されたソースコードの中のセマフォを検出するためのセマフォ検出手段と、セマフォ検出手段で検出されたセマフォごとに、管理されている複数の共有リソースを検出するための共有リソース検出手段と、検出されたセマフォごとに、管理されている複数の共有リソースそれぞれについて、他の共有リソースとアクセスタイミングに関連があるかどうかを判定するための判定手段と、検出されたセマフォごとに、判定手段による判定結果に基づいて、管理されている複数の共有リソースのうちアクセスタイミングに関連のある共有リソースについてグループ化処理を行なうためのグループ化手段と、検出されたセマフォごとに、グループ化処理の結果を出力するための出力手段とを備える。
【００１０】
好ましくは、セマフォを取得および解放する関数名の指定を受付けるための関数指定手段をさらに備え、セマフォ検出手段は、指定された関数名に基づいてセマフォを検出する。
【００１１】
好ましくは、出力手段は、管理されている複数の共有リソースをグループ化手段によるグループ単位で出力する。
【００１２】
好ましくは、共有リソース検出手段は、検出されたセマフォごとに、排他区間内で用いられている共有リソースのうち、排他区間外で用いられている共有リソースを除外した共有リソースを、管理されている複数の共有リソースとして検出する。
【００１３】
好ましくは、判定手段は、管理されている複数の共有リソースを縦軸および横軸にした判定表を生成し、管理されている複数の共有リソースの各対について、全ての排他区間に両方含まれるか否かの判定結果を記録する。
【００１４】
この発明の他の局面に従うソフトウェア検査方法は、セマフォを使用したソフトウエアを検査するソフトウェア検査装置によって実行される、１つのセマフォにおいて管理されている共有リソース間のアクセスタイミングについての関係を出力するための方法であって、解析対象となるソフトウェアのソースコードを入力するステップと、入力されたソースコードの中のセマフォを検出するステップと、検出されたセマフォごとに、管理されている複数の共有リソースを検出するステップと、検出されたセマフォごとに、管理されている複数の共有リソースそれぞれについて、他の共有リソースとアクセスタイミングに関連があるかどうかを判定するステップと、検出されたセマフォごとに、管理されている複数の共有リソースのうちアクセスタイミングに関連のある共有リソースについてグループ化処理を行なうステップと、検出されたセマフォごとに、グループ化処理の結果を出力するステップとを備える。
【００１５】
この発明のさらに他の局面に従うソフトウェア検査プログラムは、セマフォを使用したソフトウエアを検査するソフトウェア検査装置によって実行される、１つのセマフォにおいて管理されている共有リソース間のアクセスタイミングについての関係を出力するためのプログラムであって、解析対象となるソフトウェアのソースコードを入力するステップと、入力されたソースコードの中のセマフォを検出するステップと、検出されたセマフォごとに、管理されている複数の共有リソースを検出するステップと、検出されたセマフォごとに、管理されている複数の共有リソースそれぞれについて、他の共有リソースとアクセスタイミングに関連があるかどうかを判定するステップと、検出されたセマフォごとに、管理されている複数の共有リソースのうちアクセスタイミングに関連のある共有リソースについてグループ化処理を行なうステップと、検出されたセマフォごとに、グループ化処理の結果を出力するステップとを備える。
【発明の効果】
【００１６】
本発明によると、１つのセマフォにおいて管理されている共有リソース間のアクセスタイミングについての関係が検出されて、出力される。したがって、ユーザは、１つのセマフォで管理している複数の共有リソースの中に、個別のセマフォで管理すべき共有リソースが存在するか否かを把握することができる。
【００１７】
また、ソースコードを静的に解析するため、効率的に、共有リソース間のアクセスタイミングについての関係が検出することができる。
【発明を実施するための最良の形態】
【００１８】
本発明の実施の形態について図面を参照しながら詳細に説明する。なお、図中同一または相当部分には同一符号を付してその説明は繰返さない。
【００１９】
本発明の実施の形態におけるソフトウェア検査装置は、ソースコードの静的解析により、１つのセマフォにおいて管理されている共有リソース間のアクセスタイミングについての関係を検出して出力する。
【００２０】
ここで、「セマフォ」について簡単に説明する。
「セマフォ」とは、並行プログラミングにおいて同期をサポートするための機構である。このセマフォは、共有リソースを複数のプロセスが同時にアクセスするのを防ぐために使用されるが、ソフトウェアにおいて、１つのセマフォは、共有リソースとして複数の変数を管理することがある。
【００２１】
なお、「共有リソース」とは、その変数に割り当てられているあるメモリの中のある領域を表わすものとする。
【００２２】
また、セマフォがデータベースへの同時アクセスを制限するために用いられる場合には、共有リソースは、アクセス対象のデータを指すものとする。
【００２３】
図１は、セマフォを説明するための第１の図である。
図１を参照して、１つの「セマフォ１」によって、共有変数ａ，ｂが管理されているとする。処理１が共有変数ａにアクセスするために、セマフォ１がロックされたとする。その場合、そのセマフォ１がアンロックされる前に、処理２が共有変数ｂにアクセスしようとすると、変数ａ，ｂが同じセマフォ１で管理されているために、タスク２は処理１の処理が終わるまで待たされてしまう。
【００２４】
このことについて、図２を参照してより詳細に説明する。
図２は、セマフォを説明するための第２の図である。
【００２５】
図２に示されるように、共有リソースとして変数ａ，ｂ，ｃを１つのセマフォが管理していると仮定する。タスク（処理）Ａが変数ａ，ｂを、タスクＢが変数ｂ，ｃを変更するような場合、同じ変数ｂを変更することになる。したがって、このような場合は、共通のセマフォによる制御が必要である。
【００２６】
しかし、タスクＢが変数ｃしか変更しない場合にも、共通のセマフォによる排他制御をすると、不必要な待ち時間が発生してしまう。つまり、タスクＡが共有変数ａ，ｂにアクセスするためにセマフォをロックしたあと、そのセマフォがアンロックされる前にタスクＢが変数ｃにアクセスしようとしたとする。そうすると、変数ａ，ｂ，ｃが同じセマフォで管理されているために、タスクＡが変数ｃにアクセスすることがないにも関わらず、タスクＢはタスクＡの処理が終わるまで待たされてしまう。
【００２７】
なお、本実施の形態において、アクセスタイミングに関連のない変数同士を同じセマフォで管理することを、「過剰な排他制御」という。
【００２８】
このような場合、共有リソースａ，ｂ，ｃごとに個別のセマフォで管理するようにすれば不必要な待ち時間の発生は解消される。しかし、その分、セマフォが増えるのでメモリ使用量も増えてしまう。
【００２９】
また、１つのセマフォで管理されている複数の共有リソースを異なるセマフォで管理してよいかどうかは、その共有リソースにアクセスしている個所を１か所だけ見ただけでは判断がつかない。そのため、ソースコード全体にわたってその共有リソースにアクセスしている個所を探し出し、セマフォを分けてよいかどうかを判定しなければならない。
【００３０】
そこで、本実施の形態では、１つのセマフォで管理している全ての変数について、共通のセマフォで管理すべきかどうかをソースコードの静的解析で検出する。
【００３１】
以下に、本発明に係るソフトウェア検査装置の実施の形態について具体的に説明する。
＜構成について＞
（ハードウェア構成）
図３は、本発明の実施の形態におけるソフトウェア検査装置１のハードウェア構成を示すハードウェアブロック図である。
【００３２】
図３を参照して、ソフトウェア検査装置１は、たとえば、一般的なＰＣ（Personal Computer）で実現される。ソフトウェア検査装置１は、各種演算処理を実行するためのＣＰＵ（Central Processing Unit）２１０と、プログラム（ソフトウェア）や各種の情報を不揮発的に記憶するためのハードディスク部（ＨＤＤ：Hard Disk Drive）２１２と、各種データを一時的に記憶するためのメモリ部２１４と、ユーザからの指示の入力を受付けるための操作部２１１と、各種情報を表示するためのディスプレイ部２１３と、着脱可能な記録媒体２１５ａに記憶されたデータやプログラムを読み出すためのデータ読出部２１５と、外部機器との間でデータの授受を行なうための通信インターフェイス部２１７とを含む。また、上述の各部は、内部バス２１８を介して相互にデータを授受する。
【００３３】
ＨＤＤ２１２は、プログラムやデータを保持する複数のディスクと、当該ディスクへのデータの書き込みおよび読出しを行なう駆動部（磁気ヘッドとモータを含む）とを含む。
【００３４】
記録媒体２１５ａは、たとえば、ＣＤ−ＲＯＭ（Compact Disk-Read Only Memory）などの光学媒体であってもよいし、ＵＳＢ（Universal Serial Bus）メモリなどであってもよい。
【００３５】
なお、ソフトウェア検査装置１は、ＰＣに限定されず、たとえば、携帯電話やＰＤＡ（Personal Digital Assistants）などの携帯端末であってもよい。
【００３６】
また、ソフトウェア検査装置１は、スキャナなどの画像読取装置（図示せず）を備えていてもよい。
【００３７】
（機能構成）
図４は、本発明の実施の形態におけるソフトウェア検査装置１の機能構成を示す機能ブロック図である。
【００３８】
図４を参照して、ソフトウェア検査装置１は、その機能として、ソースコード入力部１１、ロック関数指定部１２、セマフォ検出部１３、共有リソース検出部１４、判定表生成部１５、独立リソース判定部１６、および、結果出力部１７を含む。
【００３９】
ソースコード入力部１１は、解析対象となるソフトウェア（プログラム）のソースコード２１を入力する。入力されるソースコード２１は、コンピュータで直接扱えない非電子データの形式である。ソースコード入力部１１は、入力されたソースコード２１を、セマフォ検出部１３が利用できる形式すなわち、コンピュータで直接扱える電子データの形式に変換する。
【００４０】
なお、１つのプログラムは、複数のソースコードで構成されていることが多い。このような場合、ソースコード入力部１１は、複数のソースコードを入力する。
【００４１】
ソースコード入力部１１の機能は、たとえば、ＨＤＤ２１２のハードディスク（図示せず）に記録されたソースコードを読み出すためのデータ記録読出ヘッド（図示せず）と、ＣＰＵ２１０とによって実現される。
【００４２】
なお、ソースコードを入力するデバイスは、上記に限られず、データ読出部２１５、または、通信インターフェイス部２１７であってもよい。あるいは、操作部２１１によってソースコードが入力されてもよい。操作部２１１によりソースコードが入力される場合とは、たとえば、ユーザが、紙媒体に印刷されたソースコードを手入力する場合が想定される。
【００４３】
または、ソースコードを入力するデバイスは、たとえば紙媒体に印刷されたソースコードを読取るための画像読取部（図示せず）であってもよい。
【００４４】
ロック関数指定部１２は、入力対象のソースコードにおいて記述されている、セマフォを取得（ロック）および解放（アンロック）するためのロック／（および）アンロック関数名２２の指定をユーザより受付ける。ロック関数指定部１２は、ロック／アンロック関数の名称２２を、セマフォ検出部１３が利用できる形式に変換する。
【００４５】
ロック関数指定部１２の機能は、たとえば、操作部２１１およびＣＰＵ２１０によって実現される。
【００４６】
セマフォ検出部１３は、ソースコード入力部１１から入力されたソースコードの中のセマフォを検出する。具体的には、入力されたソースコードの構文解析を行ない、ソースコード中からロック関数指定部１２で指定されたロック／アンロック関数を抽出（検索）する。そして、抽出した関数でセマフォを指定している個所から、セマフォ名を検出する。つまり、指定されたロック／アンロック関数をキーワードとして、セマフォ名を検出する。セマフォ検出部１３は、検出した全てのセマフォ名を含むセマフォ一覧を作成する。
【００４７】
共有リソース検出部１４は、検出されたセマフォごとに、そのセマフォが管理している共有リソースを検出する。具体的には、検出されたセマフォごとに、ロック区間（排他区間）内で用いられている共有リソースのうち、ロック区間外で用いられている共有リソースを除外した共有リソースを、そのセマフォが管理している複数の共有リソースとして検出する。
【００４８】
判定表生成部１５は、セマフォごとに、共有リソース検出部１４で検出された複数の共有リソースのアクセスタイミングの関連の有無を示す判定表を生成する。なお、本実施の形態では、このように、判定表を用いてアクセスタイミングに関連のある組とそうでない組とを判定することとする。しかしながら、検出されたセマフォごとに、管理されている複数の共有リソースそれぞれについて、他の共有リソースとアクセスタイミングに関連があるかどうかを判定できれば、判定表を用いた判定に限定されない。
【００４９】
独立リソース判定部１６は、判定表生成部１５での判定結果に基づいて、１つのセマフォで管理している複数の共有リソースは２以上のセマフォで管理すべきか否かを判定する。より具体的には、検出されたセマフォごとに、管理されている複数の共有リソースのうちアクセスタイミングに関連のある共有リソースについてグループ化処理を行なう。２以上のグループができた場合には、２以上のセマフォで管理すべきと判定することができる。
【００５０】
なお、複数の共有リソースに優先順位をつけて、別のセマフォで管理すべき（独立して扱うべき）共有リソースがどれであるかを検出してもよい。優先順位は、たとえば、共有リソースの検出順に従ってもよい。つまり、１つ目のソースコードで検出された１つ目の共有リソースを最優先としてもよい。
【００５１】
セマフォ検出部１３、共有リソース検出部１４、判定表生成部１５および独立リソース判定部１６による機能は、たとえば、ＣＰＵ２１０によって実現される。
【００５２】
結果出力部１７は、独立リソース判定部１６による判定結果に基づいて、独立して扱うべき共有リソースの一覧２３を出力する。具体的には、アクセスタイミングに関連のあるグループごとに、そのグループに含まれる共有リソースの名称を出力する。
【００５３】
結果出力部１７の機能は、たとえば、ＣＰＵ１００およびディスプレイ部２１３によって実現される。
【００５４】
なお、上記機能ブロックのうちの少なくとも１つについては、ハードウェアで実現されてもよい。
【００５５】
＜動作について＞
図５〜図１５を用いて、ソフトウェア検査装置の動作について説明する。
【００５６】
図５は、本発明の実施の形態における過剰排他制御検出処理の流れを示すフローチャートである。図５のフローチャートに示す処理は、予めプログラムとしてＨＤＤ２１２に格納されており、ＣＰＵ２１０がこのプログラムを読み出して実行することにより、過剰排他制御検出処理の機能が実現される。
【００５７】
図５を参照して、ソースコード入力部１１は、解析対象のソフトウェア（プログラム）を構成する（１以上の）ソースコードを読込む（ステップＳＴ２）。そして、読込んだソースコードをコンピュータが扱える形式に変換する。
【００５８】
次に、ロック関数指定部１２は、ロック／アンロック関数の指定を読込む（ステップＳＴ４）。ロック／アンロック関数の指定は、たとえば、ユーザによって行なわれる。ロック関数指定部１２は、たとえば、ソースコードが入力されると、ディスプレイ部２１３に、ロック／アンロック関数名を入力させるための画面を表示する。そして、ユーザによりロック／アンロック関数名が入力されると、入力された関数名を、コンピュータが扱える形式に変換する。
【００５９】
図６は、図５のステップＳＴ４において指定されるロック／アンロック関数名の一例を示す図である。
【００６０】
なお、本実施の形態では、ユーザからの指示によってロック／アンロック関数が指定されるものとするが、これに代えて次のような処理を行なってもよい。つまり、たとえばＨＤＤ２１２には、ソースコードに用いられる複数の言語それぞれに対応付けて、複数対のロック／アンロック関数を記憶させておく。そして、ロック関数指定部１２は、ソースコード入力部１１が入力したソースコードに用いられている言語を解析し、その解析結果に応じて、対応するロック／アンロック関数を選択してもよい。
【００６１】
再び図５を参照して、セマフォ検出部１３は、セマフォ一覧を初期化し（ステップＳＴ６）、セマフォ検出処理を実行する（ステップＳＴ８）。
【００６２】
（セマフォ検出処理）
図７は、本発明の実施の形態におけるセマフォ検出処理を示すフローチャートである。
【００６３】
図７を参照して、セマフォ検出部１３は、入力されたソースコード（形式が変換されたもの）から、図５のステップＳＴ４で指定されたロック関数またはアンロック関数（つまり、ユーザにより入力されたロック／アンロック関数名に対応する関数）を検索する（ステップＳＴ１０２）。
【００６４】
ロック関数またはアンロック関数が見つけられると（ステップＳＴ１０４においてＹＥＳ）、見つかった関数からセマフォ名を特定し、セマフォ一覧へ追加する（ステップＳＴ１０６）。つまり、検索された関数でセマフォを指定している箇所からセマフォ名を取得し、取得したセマフォ名をセマフォ一覧に追加する。
【００６５】
この処理が終わると、ステップＳＴ１０２に戻り、関数の検索を繰返す。
ステップＳＴ１０４において、対応するロック関数またはアンロック関数が見つけられなかったと判断されると（ステップＳＴ１０４においてＮＯ）、セマフォ検出処理は終了される。
【００６６】
このようにして、指定されたロック／アンロック関数が用いられている全てのセマフォ名を含むセマフォ一覧が生成される。
【００６７】
図８は、セマフォ検出部１３によって生成されるセマフォ一覧の一例を示す図である。
図８を参照して、図５のステップＳＴ２において異なるソースコード１〜３が入力されたとする。ソースコード１では、セマフォ名として「Ｓ１」が検出される。ソースコード２では、セマフォ名「Ｓ２」が検出されている。ソースコード３では、セマフォ名「Ｓ３」および「Ｓ４」が検出されている。そのため、セマフォ一覧には、検出されたＳ１、Ｓ２、Ｓ３およびＳ４が含まれる。
【００６８】
再び図５を参照して、セマフォ検出処理が終わると、生成されたセマフォ一覧のうち１つのセマフォが選択される（ステップＳＴ１０）。そして、選択されたセマフォについて、以下に示すような、別のセマフォで管理すべき共有リソースがあるかどうかの判定が行なわれる。
【００６９】
（共有リソース検出処理）
選択中のセマフォについて、まず、共有リソース検出処理が実行される（ステップＳＴ１２）。
【００７０】
図９は、本発明の実施の形態における共有リソース検出処理を示すフローチャートである。
【００７１】
図９を参照して、共有リソース検出部１４は、共有リソース一覧Ｌ４を初期化する（ステップＳＴ１１２）。
【００７２】
次に、共有リソース検出部１４は、選択中のセマフォを用いているロック関数とアンロック関数を検索する（ステップＳＴ１１４）。そして、検索された関数の中でのそのセマフォに関する（複数の）ロック区間を求める（ステップＳＴ１１６）。
【００７３】
次に、ロック区間内で使用されている変数を集合Ｌ１に登録する（ステップＳＴ１１８）。また、ロック区間外で使用されている変数を集合Ｌ２に登録する（ステップＳＴ１２０）。集合Ｌ１と集合Ｌ２との差集合Ｌ３を求め（ステップＳＴ１２２）、共有リソース一覧Ｌ４を更新する（ステップＳＴ１２４）。具体的には、共有リソース一覧Ｌ４に登録されている変数の集合と、ステップＳＴ１２２で得られた差集合Ｌ３との和集合となるように、共有リソース一覧Ｌ４が更新される。
【００７４】
次に、共有リソース検出部１４は、ステップＳＴ１１６で求められた全てのロック区間についての処理が終了したか否かを判断する（ステップＳＴ１２６）。未終了であれば（ステップＳＴ１２６においてＮＯ）、ステップＳＴ１１８に戻る。全ロック区間についての処理が終了すると（ステップＳＴ１２６においてＹＥＳ）、共有リソース検出処理は終了される。
【００７５】
図１０は、共有リソース検出部１４によって生成される共有リソース一覧Ｌ４を説明するための図である。
【００７６】
図１０を参照して、セマフォＳ１を用いている１つ目のロック区間が左図に示され、同じセマフォＳ１を用いている２つ目のロック区間が右図に示されているとする。この図において、“sem_lock()”がロック関数、“sem_unlock()”がアンロック関数であるとする。
【００７７】
図１０の左図を参照して、関数ｐにおける集合Ｌ１（Ｌ１ｐと表すことにする)は、sem_lock(S1)とsem_unlock(S1)の間で出現する変数｛ａ，ｂ，ｃ，ｄ，ｅ，ｆ｝となる。
【００７８】
また、共有リソース検出部１４は、指定されたロック／アンロック関数で排他制御を行っていない変数の候補として、ロック区間外の変数の集合Ｌ２を作成する。
【００７９】
図１０の左図を参照して、関数ｐにおける集合Ｌ２（Ｌ２ｐとする）はＬ２ｐ＝｛ｂ｝となる。したがって関数ｐにおける和集合Ｌ３（Ｌ３ｐとする）は、Ｌ３ｐ＝Ｌ１ｐ−Ｌ２ｐ＝｛ａ，ｃ，ｄ，ｅ，ｆ｝となる。
【００８０】
また、図１０の右図を参照して、関数ｑにおける和集合Ｌ３（Ｌ３ｑとする）は、同様の処理を行なうと、Ｌ３ｑ＝｛ａ，ｃ，ｄ｝となる。
【００８１】
そうすると、図１０の例では、Ｌ３の和集合Ｌ４は、Ｌ４＝Ｌ３ｐ∪Ｌ３ｑ＝｛ａ，ｃ，ｄ，ｅ，ｆ｝である。このＬ４が、共有リソース検出部１４で検出された、セマフォＳ１に対する共有リソースとなる。
【００８２】
再び図５を参照して、共有リソース検出処理が終わると、共有リソース検出部１４は、複数の共有リソースが検出されたか否かを判断する（ステップＳＴ１４）。複数の共有リソースが検出された判断すると（ステップＳＴ１４においてＹＥＳ）、ステップＳＴ１６に進む。
【００８３】
一方、複数の共有リソースが検出されなかったと判断した場合（ステップＳＴ１４においてＮＯ）、ステップＳＴ２４に進む。
【００８４】
（判定表生成処理）
共有リソース検出処理が終わると、判定表生成処理が実行される（ステップＳＴ１６）。
【００８５】
図１１は、本発明の実施の形態における判定表生成処理を示すフローチャートである。
図１１を参照して、判定表生成部１５は、共有リソース検出部１４で検出された、共有リソース一覧Ｌ４に含まれる共有リソースの数を“Ｎ”とし、Ｎ×Ｎの大きさの判定表を初期化する（ステップＳＴ１３２）。
【００８６】
図１２は、判定表生成部１５によって生成される判定表を説明するための図である。図１２（Ａ）には、図１０に示したセマフォＳ１について、ステップＳＴ１３２において初期化された判定表の一例が示されている。
【００８７】
判定表生成部１５は、判定表の１マスを選択する（ステップＳＴ１３４）。
判定表生成部１５は、判定表の１マスが選択されると、判定表のマスで指定された２つの変数が、全てのロック区間で、常に両方含まれるか、または両方含まれないかを判定する（ステップＳＴ１３６）。
【００８８】
全てのロック区間で、両方含まれるまたは両方含まれないと判断された場合（ステップＳＴ１３８においてＹＥＳ）、判定表生成部１５は、判定表のマスに“○”を入れる（ステップＳＴ１４０）。たとえば、変数ａ，ｃの組のマスの場合、変数ａ，ｃは、集合Ｌ３ｐおよびＬ３ｑのいずれにも含まれているため、全てのロック区間で常に両方含まれると判断される。そのため、変数ａ，ｃの交点のマスには“○”が入る。
【００８９】
交点に○が入る２つの変数は、互いに、アクセスタイミングに関連のある変数であることが示される。
【００９０】
一方、ステップＳＴ１３６での判定の結果、１マスで指定される２つの変数が、全てのロック区間において片方のみが含まれると判断された場合（ステップＳＴ１３８においてＮＯ）、判定表生成部１５は、判定表のマスに“×”を入れる（ステップＳＴ１４２）。たとえば、変数ａ，ｅの組のマスの場合、変数ａ，ｅは、集合Ｌ３ｐでは両方含まれるが、集合Ｌ３ｑでは変数ｅは含まれていないので、片方のみが含まれると判断される。そのため、変数ａ，ｅの交点のマスには“×”が入る。
【００９１】
交点に×が入る２つの変数は、互いに、アクセスタイミングに関連のない変数であることが示される。
【００９２】
なお、判定表における変数ａ，ａの交点のように自分自身に対する判定は必要ない。また、判定表は常に対称形になるため、判定表は右上の半分または左下の半分のみを作成すれば良い。
【００９３】
ステップＳＴ１４０またはステップＳＴ１４２の処理が終わると、ステップＳＴ１４４に進む。
【００９４】
ステップＳＴ１４４において、判定表生成部１５は、全てのマスを選択済みか否かを判断する。全てのマスが選択済みでない場合（ステップＳＴ１４４においてＮＯ）、ステップＳＴ１３４に戻り、上記処理を繰返す。一方、全てのマスを選択済みと判断された場合（ステップＳＴ１４４においてＹＥＳ）、判定表生成処理を終了する。
【００９５】
図１２（Ａ）に示した初期の判定表について、判定表生成処理が実行されると、図１２（Ｂ）のような判定表が生成される。
【００９６】
（独立リソース判定処理）
再び図５を参照して、判定表の生成が終わると、独立リソース判定処理が実行される（ステップＳＴ１８）。
【００９７】
図１３は、本発明の実施の形態における独立リソース判定処理を示すフローチャートである。
【００９８】
図１３を参照して、独立リソース判定部１６は、判定表生成部１５によって生成された判定表をもとに、各変数をノードとし、各変数間の交点が○であればその２つの変数を表すノード間にエッジを引いて、グラフを作成する（ステップＳＴ１５２）。
【００９９】
図１４は、図１３のステップＳＴ１５２で作成されるグラフの一例を示す図である。図１４には、図１２（Ｂ）に示した判定表に対するグラフが示されている。
【０１００】
独立リソース判定部１６は、グラフの連結性から、このグラフがいくつの連結部からなっているかを判定し、現在は同じセマフォで排他制御されている変数群をどのように分割すれば良いかを検出する。
【０１０１】
具体的には、まず、グラフの１つのノードに着目し（ステップＳＴ１５４）、この着目したノードと繋がっているノードを変数群としてリストアップする（ステップＳＴ１５６）。つまり、繋がりのあるノードの変数群が、１グループとして検出される。
【０１０２】
独立リソース判定部１６は、リストアップしたノードをグラフから取除く（ステップＳＴ１５８）。
【０１０３】
独立リソース判定部１６は、グラフにノードが残っているか否かを判断する（ステップＳＴ１６０）。グラフにノードが残っていると判断された場合（ステップＳＴ１６０においてＹＥＳ）、ステップＳＴ１５４に戻り上記処理を繰返す。
【０１０４】
一方、グラフにノードが残っていないと判断した場合（ステップＳＴ１６０においてＮＯ）、独立リソース判定処理は終了される。
【０１０５】
再び図５を参照して、独立リソース判定部１６は、ステップＳＴ１５６でリストアップ結果に応じた検査結果情報を生成する（ステップＳＴ２０）。
【０１０６】
（結果出力）
結果出力部１７は、独立して扱うべき共有リソースの一覧２３として、ステップＳＴ２０で生成された検査結果情報を出力する（ステップＳＴ２２）。具体的には、たとえば、ディスプレイ部２１３によって、検査結果が表示される。なお、表示による出力に限定されず、たとえば、図示しないプリンタに出力されてもよい。
【０１０７】
図１５は、本発明の実施の形態において、図５のステップＳＴ２２で出力される検査結果の一例を示す図である。
【０１０８】
図１５を参照して、独立して扱うべき共有リソースの一覧２３は、セマフォ名に対応付けて、３つのグループ（変数群１，２，３）の欄を有している。１つのグループの欄に含まれる変数は、互いにアクセスタイミングに関連のある変数であることが示される。
【０１０９】
図１５の例では、変数ａ，ｃ，ｄが「変数群１」の欄に含まれ、変数ｅ，ｆは「変数群２」の欄に含まれている。したがって、セマフォＳ１は、変数ａ，ｃ，ｄ，ｅ，ｆを扱っているが、これらのうち、変数ａ，ｃ，ｄについてのアクセスタイミングと、変数ｅ，ｆについてのアクセスタイミングとは、関連していないと判定されたことが示される。
【０１１０】
これにより、プログラム開発者は、変数群１の変数ａ，ｃ，ｄと、変数群２の変数ｅ，ｆとを個別のセマフォで管理すべきことを把握することができる。
【０１１１】
なお、図１５のように、グループ化された結果をそのまま出力する例に限定されず、たとえば、別のセマフォで管理すべきグループの変数のみを出力してもよい。上記例では、変数ｅ，ｆのみを別のセマフォで管理すべきグループとして出力してもよい。
【０１１２】
再び図５を参照して、ステップＳＴ８で検出された全てのセマフォが、ステップＳＴ１０で選択済みか否かが判断される（ステップＳＴ２４）。つまり、全てのセマフォについて、ステップＳＴ１２〜ＳＴ２２の処理が実行されたか否かが判断される。
【０１１３】
全てのセマフォを選択済みでなければ（ステップＳＴ２４においてＮＯ）、ステップＳＴ１０に戻り、上述の一連の処理を繰返す。一方、全てのセマフォを選択済みと判断されると（ステップＳＴ２４においてＹＥＳ）、当該プログラムは終了される。
【０１１４】
上述のように、本実施の形態によると、複数の共有リソースを１つのセマフォで管理している場合にその管理が過剰であるかどうかを検査することができる。また、独立して扱うべき共有リソースの一覧が表示されるので、プログラム開発者は、グループ（変数群）が２以上あれば、それらを別のセマフォにするようソースコードを書き換えることができる。そして、１つのセマフォで管理する共有リソースが１グループとして検出されるように調整されることによって、共有リソースへの不必要な排他制御を防止することができる。その意味で、本実施の形態におけるソフトウェア検査装置は、プログラム開発者を支援する支援装置と言い換えることもできる。
【０１１５】
また、本実施の形態では、ソースコードを静的に解析するため、膨大な時間をかけることなく効率的に、個別のセマフォで管理すべき共有リソースがあるかどうかを検出することができる。
【０１１６】
本実施の形態のソフトウェア検査装置が行なう、過剰排他制御検出方法（ソフトウェア検査方法）を、プログラムとして提供することもできる。このようなプログラムは、ＣＤ−ＲＯＭ（Compact Disc-ROM）などの光学媒体や、メモリカードなどのコンピュータ読取り可能な記録媒体にて記録させて、プログラム製品として提供することもできる。また、ネットワークを介したダウンロードによって、プログラムを提供することもできる。
【０１１７】
なお、本発明にかかるプログラムは、コンピュータのオペレーティングシステム（ＯＳ）の一部として提供されるプログラムモジュールのうち、必要なモジュールを所定の配列で所定のタイミングで呼出して処理を実行させるものであってもよい。その場合、プログラム自体には上記モジュールが含まれずＯＳと協働して処理が実行される。このようなモジュールを含まないプログラムも、本発明にかかるプログラムに含まれ得る。
【０１１８】
また、本発明にかかるプログラムは他のプログラムの一部に組込まれて提供されるものであってもよい。その場合にも、プログラム自体には上記他のプログラムに含まれるモジュールが含まれず、他のプログラムと協働して処理が実行される。このような他のプログラムに組込まれたプログラムも、本発明にかかるプログラムに含まれ得る。
【０１１９】
提供されるプログラム製品は、ハードディスクなどのプログラム格納部にインストールされて実行される。なお、プログラム製品は、プログラム自体と、プログラムが記憶された記憶媒体とを含む。
【０１２０】
今回開示された実施の形態は全ての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内での全ての変更が含まれることが意図される。
【図面の簡単な説明】
【０１２１】
【図１】セマフォを説明するための第１の図である。
【図２】セマフォを説明するための第２の図である。
【図３】本発明の実施の形態におけるソフトウェア検査装置のハードウェア構成を示すハードウェアブロック図である。
【図４】本発明の実施の形態におけるソフトウェア検査装置の機能構成を示す機能ブロック図である。
【図５】本発明の実施の形態における過剰排他制御検出処理の流れを示すフローチャートである。
【図６】図５のステップＳＴ４において指定されるロック／アンロック関数名の一例を示す図である。
【図７】本発明の実施の形態におけるセマフォ検出処理を示すフローチャートである。
【図８】セマフォ検出部によって生成されるセマフォ一覧の一例を示す図である。
【図９】本発明の実施の形態における共有リソース検出処理を示すフローチャートである。
【図１０】共有リソース検出部によって生成される共有リソース一覧を説明するための図である。
【図１１】本発明の実施の形態における判定表生成処理を示すフローチャートである。
【図１２】判定表生成部によって生成される判定表を説明するための図である。
【図１３】本発明の実施の形態における独立リソース判定処理を示すフローチャートである。
【図１４】図１３のステップＳＴ１５２で作成されるグラフの一例を示す図である。
【図１５】本発明の実施の形態において、図５のステップＳＴ２２で出力される検査結果の一例を示す図である。
【符号の説明】
【０１２２】
１  ソフトウェア検査装置、１２  ロック関数指定部、１３  セマフォ検出部、１４  共有リソース検出部、１５  判定表生成部、１６  独立リソース判定部、１７  結果出力部、２１０  ＣＰＵ、２１１  操作部、２１２  ＨＤＤ、２１３  ディスプレイ部、２１４  メモリ部、２１５  データ読出部、２１５ａ  記録媒体、２１７  通信インターフェイス部、２１８  内部バス。
【図１】
2010157147.tif 000003
【図２】
2010157147.tif 000004
【図３】
2010157147.tif 000005
【図４】
2010157147.tif 000006
【図５】
2010157147.tif 000007
【図６】
2010157147.tif 000008
【図７】
2010157147.tif 000009
【図８】
2010157147.tif 000010
【図９】
2010157147.tif 000011
【図１０】
2010157147.tif 000012
【図１１】
2010157147.tif 000013
【図１２】
2010157147.tif 000014
【図１３】
2010157147.tif 000015
【図１４】
2010157147.tif 000016
【図１５】
2010157147.tif 000017