(57)【特許請求の範囲】
【請求項１】
コンピュータプログラムを検査するソフトウェア検査装置であって、
検査対象となる前記コンピュータプログラムの中で用いられる定数を抽出する定数抽出部と、
前記コンピュータプログラムの中から、前記定数抽出部により抽出された定数が参照される条件文を検出する条件文検出部と、
前記条件文検出部により検出された条件文の中で前記定数と比較される変数をベース変数として特定するベース変数特定部と、
前記ベース変数特定部により特定されたベース変数毎に、比較対象となる前記定数を分類して出力する第１の定数グループ出力部と、
を備えるソフトウェア検査装置。
【請求項２】
前記条件文検出部により検出された条件文が成立する場合に実行される一群のステートメントからなるブロックを特定するブロック特定部と、
前記コンピュータプログラムの中で、グローバル変数に書き込みを行う箇所を特定する書込箇所特定部と、
前記ブロック特定部により特定されたブロックの中から、前記書込箇所特定部により特定された箇所が属する前記ブロックを特定する書込ブロック特定部と、を更に備え、
前記第１の定数グループ出力部は、前記ベース変数毎に、ベース変数が比較される条件文の成立により書き込みが行われるグローバル変数を分類して出力する
ことを特徴とする請求項１に記載のソフトウェア検査装置。
【請求項３】
前記第１の定数グループ出力部は、同じ値が書き込まれた状態の前記ベース変数毎に、前記定数を分類することを特徴とする請求項１又は２に記載のソフトウェア検査装置。
【請求項４】
コンピュータプログラムを検査するソフトウェア検査装置であって、
検査対象となる前記コンピュータプログラムの中で用いられる定数を抽出する定数抽出部と、
前記コンピュータプログラムの中から、前記定数抽出部により抽出された定数が参照される条件文を検出する条件文検出部と、
前記条件文検出部により検出された条件文が成立する場合に実行される一群のステートメントからなるブロックを特定するブロック特定部と、
前記条件文検出部により検出された条件文を展開する条件文展開部と、
前記コンピュータプログラムの中で、グローバル変数に書き込みを行う箇所を特定する書込箇所特定部と、
前記ブロック特定部により特定されたブロックの中から、前記書込箇所特定部により特定された箇所が属する前記ブロックを特定する書込ブロック特定部と、
前記グローバル変数に書き込みを行う箇所毎に、前記条件文展開部により展開された条件文で参照される定数を分類して出力する第２の定数グループ出力部と、
を備えるソフトウェア検査装置。
【請求項５】
コンピュータプログラムを検査するソフトウェア検査装置であって、
検査対象となる前記コンピュータプログラムの中で用いられる定数を抽出する定数抽出部と、
前記コンピュータプログラムの中から、前記定数抽出部により抽出された定数が参照される条件文を検出する条件文検出部と、
前記条件文検出部により検出された条件文が成立する場合に実行される一群のステートメントからなるブロックを特定するブロック特定部と、
前記条件文検出部により検出された条件文を展開する条件文展開部と、
前記コンピュータプログラムの中で、書き込み及び読み出しが行われる変数、及び当該変数にアクセスする箇所を特定するアクセス箇所特定部と、
前記ブロック特定部により特定されたブロックの中から、前記アクセス箇所特定部により特定された箇所が属する前記ブロックを特定するアクセスブロック特定部と、
前記アクセス箇所特定部により特定された変数毎に、前記アクセス箇所特定部により特定された箇所の実行順序に従って、前記条件文展開部により展開された条件文を並べ替え、且つ当該条件文の中で参照される定数を分類して出力する第３の定数グループ出力部と、
を備えるソフトウェア検査装置。
【請求項６】
コンピュータプログラムを検査するソフトウェア検査方法であって、
検査対象となる前記コンピュータプログラムの中で用いられる定数を抽出し、
前記コンピュータプログラムの中から、抽出された定数が参照される条件文を検出し、
検出された条件文の中で前記定数と比較される変数をベース変数として特定し、
特定されたベース変数毎に、比較対象となる前記定数を分類して出力する
ことを特徴とするソフトウェア検査方法。
【請求項７】
コンピュータプログラムを検査するためのソフトウェア検査プログラムであって、
コンピュータに、
検査対象となる前記コンピュータプログラムの中で用いられる定数を抽出する機能と、
前記コンピュータプログラムの中から、抽出された定数が参照される条件文を検出する機能と、
検出された条件文の中で前記定数と比較される変数をベース変数として特定する機能と、
特定されたベース変数毎に、比較対象となる前記定数を分類して出力する機能と、
を実現させることを特徴とするソフトウェア検査プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェア検査装置、ソフトウェア検査方法、ソフトウェア検査プログラムに関するものである。
【背景技術】
【０００２】
従来から、プログラミング言語で記述されたソースプログラムにおける制御の流れやデータの流れを、そのソースプログラムを実行すること無しに解析する、静的解析方法が知られている（特許文献１参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平０９−２８２１７３号公報
【発明の概要】
【０００４】
ところで、ソフトウェアの処理において仕様の変更が生じた場合、仕様の条件によって同時に更新しなければいけない２以上の定数が存在するケースがある。しかし、ソフトの仕様に関連性のある定数の仕様が記載されていない場合、設計者がその一部の定数しか変更しなかったために不具合に陥るケースが存在する。
【０００５】
特許文献１の静的解析方法によれば、処理内容及び入力と出力の関係を明確にしてプログラムの構造を可視化することはできる。しかし、可視化されたプログラムの構造のうち、定数の変更の一貫性が保たれていないために不具合が発生する可能性がある箇所をユーザに気づかせることはできない。
【０００６】
本発明は、上記課題に鑑みて成されたものであり、その目的は、プログラムの構造のうち、定数の変更の一貫性が保たれていないために不具合が発生する可能性がある箇所をユーザに気づかせることができるソフトウェア検査装置、ソフトウェア検査方法、ソフトウェア検査プログラムを提供することである。
【０００７】
本発明の一態様に係わるソフトウェア検査装置は、検査対象となるコンピュータプログラムの中で用いられる定数を抽出し、抽出された定数が参照される条件文を検出する。そして、条件文の中で定数と比較される変数をベース変数として特定し、ベース変数毎に、比較対象となる定数を分類して出力する。
【図面の簡単な説明】
【０００８】
【図１】図１は、本発明の第１実施形態に係わるソフトウェア検査装置のハードウェア構成を示すブロック図である。
【図２】図２は、第１実施形態に係わるＣＰＵ１１ａの機能的構成を示すブロック図である。
【図３】図３は、本発明の第１〜第３の実施形態に係わるソフトウェア検査装置によって実行される情報処理の流れ及び情報処理の途中で生成される中間データを示すデータフロー図である。
【図４】図４は、図３の続きを示すデータフロー図である。
【図５】図５（ａ）、（ｂ）は、検査対象となるソースコードＤ０１として、Ｃ言語で記述されたコンピュータプログラムの一例を示す図である。
【図６】図６は、定数抽出処理（Ｓ０１）の結果をまとめた「定数一覧（ＤＯ２）」を示す表である。
【図７】図７は、条件文検出処理（Ｓ０２）の結果をまとめた「条件文一覧（ＤＯ３）」を示す表である。
【図８】図８は、ベース変数特定処理（Ｓ０３）の結果をまとめた「ベース変数一覧（ＤＯ４）」を示す表である。
【図９】図９は、定数グループ特定処理（Ｓ０４）の結果をまとめた「定数グループ一覧（ＤＯ５）」を示す表である。
【図１０】図１０は、同じベース変数と比較されているが、同じ値が書き込まれた状態で比較されていないため、同じグループとして分類しないプログラム例を示す図である。
【図１１】図１１は、図５（ｂ）のプログラム例において特定されたブロックＢ０１〜Ｂ０５を示す図である。
【図１２】図１２は、ブロック特定処理（Ｓ０５）の結果をまとめた「ブロック行数一覧（ＤＯ６）」を示す表である。
【図１３】図１３は、変数特定処理（Ｓ０６）の結果をまとめた「変数一覧（ＤＯ７）」を示す表である。
【図１４】図１４は、グローバル変数特定処理（Ｓ０７）の結果をまとめた「グローバル変数一覧（ＤＯ８）」を示す表である。
【図１５】図１５は、グローバル変数書込、読込箇所特定処理（Ｓ０８）の結果をまとめた「グローバル変数書込、読込箇所一覧（ＤＯ９）」を示す表である。
【図１６】図１６は、第１のグローバル変数書込箇所特定処理（Ｓ０９）の結果をまとめた「グループ別パラメータ一覧（Ｄ１０）」を示す表である。
【図１７】図１７は、第２実施形態に係わるＣＰＵ１１ｂの機能的構成を示すブロック図である。
【図１８】図１８は、条件文展開処理（Ｓ１０）の結果をまとめた「条件文展開一覧（Ｄ１１）」を示す表である。
【図１９】図１９は、第２のグローバル変数書込箇所特定処理（Ｓ１１）の結果をまとめた「グローバル変数書込箇所一覧（Ｄ１２）」を示す表である。
【図２０】図２０は、第１の定数分割処理（Ｓ１２）の結果をまとめた「条件文内定数一覧（Ｄ１３）」を示す表である。
【図２１】図２１は、第３実施形態に係わるＣＰＵ１１ｃの機能的構成を示すブロック図である。
【図２２】図２２は、変数別書込、読込特定処理（Ｓ１３）の結果をまとめた「変数別書込、読込箇所一覧（Ｄ１４）」を示す表である。
【図２３】図２３は、変数別グループ特定処理（Ｓ１４）の結果をまとめた「変数別グループ一覧（Ｄ１５）」を示す表である。
【図２４】図２４は、アクセス箇所特定処理（Ｓ１５）の結果をまとめた「データフロー一覧（Ｄ１６）」を示す表である。
【図２５】図２５は、第２の定数分割処理（Ｓ１６）の結果をまとめた「データフロー別定数一覧（Ｄ１７）」を示す表である。
【発明を実施するための形態】
【０００９】
図面を参照して、本発明の実施形態を説明する。図面の記載において同一部分には同一符号を付し説明を省略する。
【００１０】
（第１実施形態）
［ソフトウェア検査装置のハードウェア構成］
本発明の第１実施形態に係わるソフトウェア検査装置は、例えば車両に搭載される電子制御装置（ＥＣＵ）により実行されるコンピュータプログラムのソフトウェア検査処理に適用することができる。特に、コンピュータプログラムの仕様の条件によって同時に更新しなければいけない２以上の定数に関する不具合が発生する可能性を検査するものである。
【００１１】
図１を参照して、本発明の第１実施形態に係わるソフトウェア検査装置のハードウェア構成を説明する。ソフトウェア検査装置のハードウェア構成として、汎用のコンピュータを用いることができる。例えば、ソフトウェア検査装置は、入出力装置１２と、記憶装置１４と、ＣＰＵ（中央処理装置）１１と、入力装置１３と、表示装置１５とを備える。入出力装置１２は、記憶媒体から検査対象のコンピュータプログラム（ソースコードＤ０１）を読み込む。記憶装置１４は、入出力装置１２で読み込んだソースコードＤ０１や解析の中間データを格納する。ＣＰＵ（中央処理装置）１１は、各種演算を実行してソースコードＤ０１を解析する。入力装置１３は、ユーザが解析に必要な情報を入力するための装置である。表示装置１５は、ＣＰＵ１１から出力される検査結果を表示する。検査結果は、入出力装置１２を用いて記憶媒体に書き込むことも可能である。
【００１２】
或いは、ソフトウェア検査装置は、クライアントサーバモデルとしても実現可能である。例えば、汎用のパーソナルコンピュータ（クライアント）をコンピュータネットワークを介してサーバに接続する。これにより、図１に示すＣＰＵ１１を備えるサーバを、コンピュータネットワークを介して、入出力装置１２、入力装置１３、記憶装置１４、或いは表示装置１５に接続することができる。この場合、ソフトウェア検査装置は、主にＣＰＵ１１（サーバ）により構成され、入出力装置１２、入力装置１３、記憶装置１４、或いは表示装置１５はソフトウェア検査装置に含まれない。
【００１３】
図２を参照して、図１のＣＰＵ１１の機能的構成を説明する。ＣＰＵ１１を備えるコンピュータをソフトウェア検査装置として機能させるためのコンピュータプログラム（ソフトウェア検査プログラム）を、ＣＰＵ１１を備えるコンピュータにインストールして実行する。これにより、ＣＰＵ１１は、以下に示す各情報処理部として機能する。なお、ここでは、ソフトウェアによってソフトウェア検査装置を実現する例を示すが、もちろん、以下に示す各情報処理を実行するための専用のハードウェアを用意して、ソフトウェア検査装置を構成することも可能である。
【００１４】
第１実施形態に係わるＣＰＵ１１ａは、定数抽出部２１、条件文検出部２２、ベース変数特定部２３、及び第１の定数グループ出力部２４として機能する。
【００１５】
定数抽出部２１は、検査対象となるコンピュータプログラムの中で用いられる定数を抽出する。定数は、プログラミングにおいて特定の値に名前をつけたものであって、変数と異なり、宣言時に決めた値をコードの中で後から変更することができない。但し、定数は、コンピュータプログラムの仕様が変更した場合、仕様の条件によって同時に変更される場合がある。例えばＣ言語の場合、定数抽出部２１は、「#define」或いは「const」で定義された宣言の識別子を特定して、定数を抽出する。定数抽出部２１は、予め、「#define」及び「const」による定義パターンの情報を保持し、定義パターンに示した定義に適合する定数を検出する。
【００１６】
条件文検出部２２は、コンピュータプログラムの中から、定数抽出部２１により抽出された定数が参照される条件文を検出する。条件文検出部２２は、例えば、コンピュータプログラムに含まれるif（条件式）、else（条件式）、switch（条件式）のうち、定数抽出部２１により抽出された定数が比較されている条件式を検出する。
【００１７】
ベース変数特定部２３は、条件文検出部２２により検出された条件文の中で、定数抽出部２１により抽出された定数と比較される変数をベース変数として特定する。
【００１８】
第１の定数グループ出力部２４は、ベース変数特定部２３により特定されたベース変数毎に、比較対象となる定数を分類して出力する。具体的には、定数抽出部２１により抽出された２以上の定数が同じベース変数と比較されている場合、この２以上の定数を１つのグループとして分類する。第１の定数グループ出力部２４は、この定数のグループ分けを、ベース変数毎に実施する。同じベース変数と比較されている２以上の定数は、コンピュータプログラムの仕様上、関連の深い定数同士といえる。よって、第１の定数グループ出力部２４は、同じベース変数と比較されている２以上の定数を、ＣＰＵ１１から出力される検査結果として、例えば表示装置１５に表示したり、入出力装置１２を用いて記憶媒体に書き込む。これにより、仕様の条件によって同時に更新しなければいけない２以上の定数の存在をユーザに提示して、定数の変更の一貫性が保たれていないために不具合が生じる可能性がある箇所をユーザに気づかせることができる。
【００１９】
なお、第１の定数グループ出力部２４は、同じ値が書き込まれた状態のベース変数毎に、定数を分類してもよい。同じ変数であっても異なる値が書き込まれた状態で２以上の定数と比較されていれば、この２以上の定数の仕様上の関連性は低い。
【００２０】
ＣＰＵ１１ａは、ブロック特定部２５、書込箇所特定部２６、及び書込ブロック特定部２８として更に機能する。
【００２１】
ブロック特定部２５は、条件文検出部２２により検出された条件文が成立する場合に実行される一群のステートメントからなるブロックを特定する。「ステートメント」とは、ソースコード上の１行ごとの処理単位のことである。ブロックは、例えばＣ言語の場合、if文又はswitch文の条件判断後のブラケット“｛”と“｝”で囲まれた範囲を指す。具体的に、ブロック特定部２５は、ブラケット“｛”と“｝”で囲まれた部分の行番号を特定する。
【００２２】
書込箇所特定部２６は、コンピュータプログラムの中で、グローバル変数に書き込みを行う箇所を特定する。具体的に、コンピュータプログラムの中で定義されているグローバル変数を抽出し、抽出されたグローバル変数に対して書込が行われている箇所（例えば行番号）を特定する。グローバル変数に書き込んでいる箇所とは算術式の左辺にグローバル変数が登場している箇所である。
【００２３】
書込ブロック特定部２８は、ブロック特定部２５により特定されたブロックの中から、書込箇所特定部２６により特定された箇所が属するブロックを特定する。具体的には、グローバル変数に対して書込が行われている行番号が、ブロックの始点（行番号）から終点（行番号）までの間に含まれている場合、当該ブロックを特定する。
【００２４】
第１の定数グループ出力部２４は、ベース変数毎に、ベース変数が比較される条件文の成立により書き込みが行われるグローバル変数を分類して出力する。グローバル変数の書き込みが行われる箇所の関連から仕様上のつながりの強い定数が存在する。そこで、書き込まれているグローバル変数と照らし合わせて、仕様通りの処理がされているかをレビューすることが望ましい。そこで、第１実施形態では、第１の定数グループ出力部２４が、ベース変数毎に、ベース変数と比較される定数を分類するのみならず、当該定数が参照される条件文の成立により実行されるブロックの中で書き込みが行われるグローバル変数をも分類して出力する。
【００２５】
［ソフトウェア検査装置により実行される情報処理の手順］
次に、図３〜図１６を参照して、本発明の第１実施形態に係わるソフトウェア検査方法の一例として、図１及び図２に示すソフトウェア検査装置によって実行される情報処理の手順を説明する。
【００２６】
先ず、ＣＰＵ１１は、検査対象となるソースコードＤ０１を入出力装置１２から読み込む。なお、ソースコードＤ０１は、予め入出力装置１２を用いてユーザによりソフトウェア検査装置内に読み込まれ、記憶装置１４に格納されていてもよい。図５（ａ）、（ｂ）は、読み込まれたソースコードＤ０１として、Ｃ言語で記述されたコンピュータプログラムの一例を示す。検査対象となるコンピュータプログラムは、図５（ａ）、（ｂ）に示す２つのファイルに跨って記述されている。図５（ａ）のファイル名は「sample1.c」であり、図５（ｂ）のファイル名は「sample2.c」である。Ｃ言語で記述されたプログラムの一例において、各ファイルの左端部に記載された１から始まる連続番号は、各ステートメントの「行番号」を示す。
【００２７】
定数抽出部２１は、図３に示す「定数抽出」処理（Ｓ０１）を実行する。定数抽出部２１は、ソースコードＤ０１の中から、「#define」及び「const」による定義パターンに適合する定数を検出する。図５のプログラム例では、プログラムの２行目から５行目までに#defineで定義された定数、CC1, CC2, CC3, CC4があるため、これを定数として検出する。同時に、それぞれの定数の定義の値も検出する。図６の表は、上記した定数抽出処理（Ｓ０１）の結果をまとめた「定数一覧（ＤＯ２）」を示す。
【００２８】
条件文検出部２２は、図３に示す「条件文検出」処理（Ｓ０２）を実行する。コンピュータプログラムに含まれるif（条件式）、else（条件式）、else  if（条件式）、switch（条件式）のうち、定数抽出部２１により抽出された定数が比較されている条件式を検出する。
【００２９】
条件文検出部２２は、ソースコードＤ０１の中から、定数抽出部２１により抽出されたCC1, CC2, CC3, CC4が参照される条件文を検出する。図７の表は、上記した条件文検出処理（Ｓ０２）の結果をまとめた「条件文一覧（ＤＯ３）」を示す。ここでは、条件文そのもの及び条件文の行番号を抽出する。
【００３０】
ベース変数特定部２３は、図３に示す「ベース変数特定」処理（Ｓ０３）を実行する。ベース変数特定部２３は、Ｓ０３で検出された条件文の中で、Ｓ０１で抽出された定数と比較される変数をベース変数として特定する。図８の表は、上記したベース変数特定処理（Ｓ０３）の結果をまとめた「ベース変数一覧（ＤＯ４）」を示す。図５のプログラム例では、定数CC1, CC2, CC3, CC4が変数v, v1, vFlagの変数群と比較されているため、これらの変数をベース変数として検出している。１つの条件文から２以上のベース変数（v, v1）が特定される場合に、ベース変数毎に、条件文及び比較対象となる定数を特定している。
【００３１】
第１の定数グループ出力部２４は、Ｓ０３で特定されたベース変数を元に、図３に示す「定数グループ特定」処理（Ｓ０４）を実行する。具体的には、Ｓ０１で抽出された２以上の定数が同じベース変数と比較されている場合、この２以上の定数を１つのグループとして分類する。図９の表は、上記した定数グループ特定処理（Ｓ０４）の結果をまとめた「定数グループ一覧（ＤＯ５）」を示す。図５のプログラム例では、定数CC1はベース変数vと同じ変数で比較されているため、これを一つのグループとして、第１のグループＩＤとして「１」を付す。また、定数CC2及びCC3も同じベース変数v1と比較されているため、第１のグループＩＤとして「２」を付す。定数CC4及びCC2も同じベース変数vFlagと比較されているため、第１のグループＩＤとして「３」を付す。このように同じ第１のグループＩＤが付された定数は仕様上関連の深い定数同士であることを明示することができる。
【００３２】
なお、第１の定数グループ出力部２４は、同じベース変数であっても異なる値が書き込まれている状態であれば、同じグループとして分類しない。例えば、図１０に示すように、ベース変数“ａ”の値は前の条件文（行番号：１）から次の条件文（行番号：４）までの間に値が書き換わるため、仕様上の関連性が低い。そのため、CC1とCC2は同じベース変数“ａ”で比較されているが、同じ値が書き込まれた状態でベース変数“ａ”と比較されていないため、同じグループとして扱わない。
【００３３】
次に、ブロック特定部２５は、図３に示す「ブロック特定」処理（Ｓ０５）を実行する。具体的には、ブロック特定部２５は、Ｓ０２で検出された条件文が成立する場合に実行されるブロックを特定する。詳細には、ブロックの始点となる行番号及び終点となる行番号を特定する。図１１は、図５（ｂ）のプログラム例において特定されたブロックＢ０１〜Ｂ０５を示す。図１２の表は、上記したブロック特定処理（Ｓ０５）の結果をまとめた「ブロック行数一覧（ＤＯ６）」を示す。図１２では、図９に示す定数グループ一覧（ＤＯ５）に対して、特定されたブロックの行番号（ブロックリージョン）を付加している。
【００３４】
書込箇所特定部２６は、図３に示す「変数特定」処理（Ｓ０６）を実行する。具体的には、ソースコードＤ０１の中で定義されている変数を抽出する。図１３の表は、上記した変数特定処理（Ｓ０６）の結果をまとめた「変数一覧（ＤＯ７）」を示す。書込箇所特定部２６は、変数としてグローバル変数及びローカル変数を抽出する。図５のプログラム例では、グローバル変数としてvFlag, vTemp、ローカル変数としてtemp, temp2が抽出される。
【００３５】
書込箇所特定部２６は、図３に示す「グローバル変数特定」処理（Ｓ０７）を実行する。具体的には、Ｓ０６で抽出された変数の中から、グローバル変数を抽出する。図１４の表は、上記したグローバル変数特定処理（Ｓ０７）の結果をまとめた「グローバル変数一覧（ＤＯ８）」を示す。図５のプログラム例では、グローバル変数としてvFlag, vTempが抽出される。
【００３６】
書込箇所特定部２６は、図３に示す「グローバル変数書込、読込箇所特定」処理（Ｓ０８）を実行する。具体的には、抽出されたグローバル変数に対して書込が行われている行番号を特定する。図１５の表は、上記したグローバル変数書込、読込箇所特定処理（Ｓ０８）の結果をまとめた「グローバル変数書込、読込箇所一覧（ＤＯ９）」を示す。図５のプログラム例では、グローバル変数vFlagに対して１６行目で書込を行い、３１行目で読込を行っている。グローバル変数vTempに対して１９行目、２３行目、２６行目で書込を行い、３３行目で読込を行っている。
【００３７】
第１の定数グループ出力部２４は、図４に示す「第１のグローバル変数書込箇所特定」処理（Ｓ０９）を実行する。具体的には、ベース変数毎に、ベース変数が比較される条件文の成立により書き込みが行われるグローバル変数を分類して出力する。図１６の表は、上記した第１のグローバル変数書込箇所特定処理（Ｓ０９）の結果をまとめた「グループ別パラメータ一覧（Ｄ１０）」を示す。図１６では、図１２に示す「ブロック行数一覧（ＤＯ６）」に対して、書き込まれているグローバル変数を付加している。
【００３８】
例えば、vTemp = 1;というグローバル変数書込個所はsample1.cファイルの１９行目であるため、この行番号が属するグループを図１２の「ブロック行数一覧（ＤＯ６）」の中のブロックリージョンで検索する。その結果、ブロックリージョン“１８−２０”に該当すると判断できる。
【００３９】
図１６に示すように、第１のグループＩＤ１で分類されるベース変数「v」は、行番号１７及び２１の条件文において定数CC1と比較され、行番号１７及び２１の条件文のブロックでは、グローバル変数vTempに１及び２の書込が行われている、ことが分かる。第１のグループＩＤ２で分類されるベース変数「v1」についても同様である。一方、第１のグループＩＤ３で分類されるベース変数「vFlag」については、定数CC4, CC2と比較されているが、グローバル変数への書込が行われていない。
【００４０】
以上説明したように、本発明の第１実施形態によれば、以下の作用効果が得られる。
【００４１】
コンフィグレーションパラメータの設定や、キャリブレーションパラメータの設定の例に取り、定数の関連性を検証する必要性についてを示す。先ずは、コンフィグレーションパラメータの例について説明する。本来、インテリジェントキーとイモビライザーの機能は同時にオン或いはオフを設定しなければならない。しかし、設計者がそのことに気付いておらず、片方しか変更していない場合がある。例えば、設計者は仕様がそもそもインテリジェントキーとイモビライザーの機能は独立となっていると勘違いしている場合がある。この場合、単体テストなどの下流のテストにおいて、片方しか変更していないことを発見することができず、これによる不具合につながる。
【００４２】
次に、キャリブレーションパラメータの例について説明する。外部の光量を検出し、検出値に応じて車両に搭載されたライトのオン或いはオフを制御する場合がある。この場合、通常、外部の光量の検出値にヒステリシスを持たせ、ライトのオン・オフの繰り返しによる煩雑さを軽減している。ヒステリシスを変更する場合は制御対象の特性を考え、上限値と下限値を同時に更新しなければならない。しかし、設計者がそのことに気づいていない場合、片方の値しか変更せずに、不具合を発生させてしまう。
【００４３】
このように、本来は２以上の定数を同時に更新しなければならない仕様であるのに、ソフトウェアの定数は個別に設定はできるため、一部の値しか変更せず、不具合が流出してしまう場合がある。すなわち、定数の関連性を検証が必要となる。
【００４４】
そこで、第１実施形態に係わるソフトウェア検査装置は、検査対象となるソースコードＤ０１の中で用いられる定数を抽出し、抽出された定数が参照される条件文を検出する。検出された条件文の中で定数と比較される変数をベース変数として特定し、特定されたベース変数毎に、比較対象となる定数を分類して出力する。これにより、図９に示すように、同じベース変数と比較される定数を分類して出力されるので、ベース変数の共通性という観点から関連性が高い定数群を特定できる。よって、特定された定数群について仕様通りの処理がされているかを容易にレビューすることができる。したがって、仕様の条件によって同時に更新しなければいけない２以上の定数の存在をユーザに提示して、定数の変更の一貫性が保たれていないために不具合が生じる可能性がある箇所をユーザに気づかせることができる。
【００４５】
ソフトウェア検査装置は、検出された条件文が成立する場合に実行されるブロックを特定し、コンピュータプログラムの中でグローバル変数に書き込みを行う箇所を特定する。そして、特定されたブロックの中から、グローバル変数に書き込みを行う箇所が属するブロックを特定し、ベース変数毎に、ベース変数が比較される条件文の成立により書き込みが行われるグローバル変数を分類して出力する。これにより、図１６に示すように、グローバル変数の書き込み箇所の関連から仕様上のつながりの強い定数の存在をユーザに提示することができる。ユーザは、書き込まれているグローバル変数と照らし合わせて、仕様通りの処理がされているかレビューすることができる。
【００４６】
第１の定数グループ出力部２４は、同じ値が書き込まれた状態のベース変数毎に、定数を分類する。つまり、同じベース変数であっても異なる値が書き込まれている状態であれば、同じグループとして分類しない。これにより、関連性が高い定数群を更に精度良く特定できる。
【００４７】
このように、設計の段階から仕様として処理が抜けている場合や、仕様に定義されていても、単体テストが実施できないようなプログラムの構造の場合、書込処理抜けの不具合を抑制することができる。また、膨大なソースコードから、人の目で判断できない定数変更の一貫性が保たれていないことをユーザに気づかせることができる。また、ソフトウェアプロセスで使用されているテスト（単体テスト、結合テスト、システムテスト）で見つけられないような定数変更一貫性が保たれていないプログラムのバグを未然に防ぐことができる。更に、従来の静的解析ツールでは特定できなかった定数の変更の一貫性が保たれていない箇所を見つることができる。
【００４８】
（第２実施形態）
［ソフトウェア検査装置のハードウェア構成］
第１実施形態では、比較対象となるベース変数の共通性に基づいて関連性の高い定数のグループを特定する例を説明した。第２実施形態では、グローバル変数の書込箇所の共通性に基づいて関連性の高い定数のグループを特定する例を説明する。なお、ソフトウェア検査装置のハードウェア構成は、第１実施形態（図１）と同じであり説明を省略する。
【００４９】
図１７を参照して、第２実施形態に係わるＣＰＵ１１ｂの機能的構成を説明する。第２実施形態に係わるＣＰＵ１１ｂは、定数抽出部２１、条件文検出部２２、ブロック特定部２５、条件文展開部２７、書込箇所特定部２６、書込ブロック特定部２８、及び第２の定数グループ出力部２９として機能する。なお、定数抽出部２１、条件文検出部２２、ブロック特定部２５、書込箇所特定部２６、及び書込ブロック特定部２８は、第１実施形態と同じであり説明を省略する。
【００５０】
条件文展開部２７は、条件文検出部２２により検出された条件文を展開する。ここでは、ブロック特定部２５により特定された各ブロックが実行されるために成立しなければならない条件を全て抽出する。具体的には、if文の条件はそのまま抽出し、else側のブロックについては、if文側の逆の条件が成立したと解釈し、if文側の逆の条件を新たな条件として展開する。展開された各条件文には、条件文が成立する場合に実行されるブロックの範囲（ブロックリージョン）が関連づけられている。
【００５１】
第２の定数グループ出力部２９は、展開された条件文に関連付けられたブロックの中から、グローバル変数に書き込みを行う箇所が属するブロックを特定する。展開された条件文の中で参照される定数を抽出する。そして、グローバル変数に書き込みを行う箇所毎に、条件文展開部２７により展開された条件文で参照される定数を分類して出力する。
【００５２】
［ソフトウェア検査装置により実行される情報処理の手順］
次に、図３、図４、図１８〜図２０を参照して、本発明の第２実施形態に係わるソフトウェア検査方法の一例として、図１及び図１７に示すソフトウェア検査装置によって実行される情報処理の手順を説明する。
【００５３】
先ず、条件文展開部２７は、図４に示す「条件文展開」処理（Ｓ１０）を実行する。具体的には、図１２に示す「ブロック行数一覧（ＤＯ６）」に基づいて、総ての条件文を展開する。図１８の表は、上記した条件文展開処理（Ｓ１０）の結果をまとめた「条件文展開一覧（Ｄ１１）」を示す。ｉf文はそのまま出力し、else文はif文と逆の条件が成立した場合を示す「！」で表記する。例えば、図５（ｂ）の２２行目〜２４行目のブロックは、１７行目の条件の偽と解釈する。図５（ｂ）の２６行目〜２７行目のブロックは、１７行目及び１９行目の２つの条件の偽と解釈する。
【００５４】
第２の定数グループ出力部２９は、図４に示す「第２のグローバル変数書込箇所特定」処理（Ｓ１１）を実行する。具体的には、図１８の「条件文展開一覧（Ｄ１１）」及び図１５の「グローバル変数書込、読込箇所一覧（ＤＯ９）」に基づいて、展開された条件文に関連付けられたブロックの中から、グローバル変数に書き込みを行う箇所が属するブロックを特定する。図１９の表は、上記した第２のグローバル変数書込箇所特定処理（Ｓ１１）の結果をまとめた「グローバル変数書込箇所一覧（Ｄ１２）」を示す。例えば、図１５に示すvTempに１を書き込む１９行目は、図１８に示すブロックリージョン（１８−２０）に属すると判断する。ブロックリージョン（３２−３４）及び（３６−３８）のように、「条件文展開一覧（Ｄ１１）」に示すブロックのうち、グローバル変数の書込箇所の行番号が検索されなかったブロックは、除外する。なぜなら、グローバル変数の書込箇所の共通性に基づいて関連性の高い定数を特定できないからである。
【００５５】
第２の定数グループ出力部２９は、図４に示す「第１の定数分割」処理（Ｓ１２）を実行する。具体的には、図１９の「グローバル変数書込箇所一覧（Ｄ１２）」における条件文に含まれる定数を抽出して、抽出された定数毎に異なる行に分割して表示する。図２０の表は、上記した第１の定数分割処理（Ｓ１２）の結果をまとめた「条件文内定数一覧（Ｄ１３）」を示す。ここでは、グローバル変数に書き込みを行う箇所毎に、第２のグループＩＤを付して定数を分類している。具体的には、定数CC1, CC2は、グローバル変数vTempに書込を行う１９行目が実行されるために必要な条件文の中で参照された定数のグループであるため、第２のグループＩＤとして「１」を付す。定数CC1, CC2, CC3は、グローバル変数vTempに書込を行う２３行目が実行されるために必要な条件文の中で参照された定数のグループであるため、第２のグループＩＤとして「２」を付す。定数CC1, CC2, CC3は、グローバル変数vTempに書込を行う２６行目が実行されるために必要な条件文の中で参照された定数のグループであるため、第２のグループＩＤとして「３」を付す。
【００５６】
以上説明したように、本発明の第２実施形態によれば、以下の作用効果が得られる。
【００５７】
ソフトウェア検査装置は、検査対象となるソースコードＤ０１の中で用いられる定数を抽出し、抽出された定数が参照される条件文を検出して、検出された条件文を展開する。そして、図２０に示すように、グローバル変数に書き込みを行う箇所が属するブロックを特定し、グローバル変数に書き込みを行う箇所毎に、条件文展開部２７により展開された条件文で参照される定数を分類して出力する。これにより、グローバル変数に書き込みを行う箇所の共通性という観点から関連性が高い定数群を特定できる。よって、特定された定数群について仕様通りの処理がされているかを容易にレビューすることができる。したがって、仕様の条件によって同時に更新しなければいけない２以上の定数の存在をユーザに提示して、定数の変更の一貫性が保たれていないために不具合が生じる可能性がある箇所をユーザに気づかせることができる。
【００５８】
（第３実施形態）
第３実施形態では、ソースコードＤ０１の中で変数にアクセスする箇所の実行順序に基づいて関連性の高い定数のグループを特定する例を説明する。なお、ソフトウェア検査装置のハードウェア構成は、第１実施形態（図１）と同じであり説明を省略する。
【００５９】
図２１を参照して、第３実施形態に係わるＣＰＵ１１ｃの機能的構成を説明する。第３実施形態に係わるＣＰＵ１１ｃは、定数抽出部２１、条件文検出部２２、ブロック特定部２５、条件文展開部２７、アクセス箇所特定部３０、アクセスブロック特定部３１及び第３の定数グループ出力部３２として機能する。なお、定数抽出部２１、条件文検出部２２、ブロック特定部２５、条件文展開部２７は、第１実施形態或いは第２実施形態と同じであり説明を省略する。
【００６０】
アクセス箇所特定部３０は、ソースコードＤ０１の中で、書き込み及び読み出しが行われる変数、及び当該変数にアクセスする箇所を特定する。具体的には、当該変数にアクセスする行番号、及びアクセスの種類が書込であるか読込であるかを特定する。
【００６１】
アクセスブロック特定部３１は、ブロック特定部２５により特定されたブロックの中から、アクセス箇所特定部３０により特定された箇所が属するブロックを特定する。具体的には、ブロック特定部２５により特定されたブロックリージョンのうち、変数にアクセスする行番号が属するブロックリージョンを検索する。
【００６２】
第３の定数グループ出力部３２は、アクセス箇所特定部３０により特定された変数毎に、アクセス箇所特定部３０により特定された箇所の実行順序に従って、条件文展開部２７により展開された条件文を並べ替える。そして、アクセス箇所特定部３０により特定された変数毎に、当該条件文の中で参照される定数を分類して出力する。
【００６３】
［ソフトウェア検査装置により実行される情報処理の手順］
次に、図３、図４、図２２〜図２５を参照して、本発明の第３実施形態に係わるソフトウェア検査方法の一例として、図１及び図２１に示すソフトウェア検査装置によって実行される情報処理の手順を説明する。
【００６４】
先ず、アクセス箇所特定部３０は、図３に示す「変数別書込、読込特定」処理（Ｓ１３）を実行する。具体的には、図１３の「変数一覧（ＤＯ７）」に基づいて、変数に書込及び読込を行っている行番号を特定する。図２２の表は、上記した変数別書込、読込特定処理（Ｓ１３）の結果をまとめた「変数別書込、読込箇所一覧（Ｄ１４）」を示す。ここでは、変数vFlag, v, vTemp, temp, temp2にアクセスする行番号、及びアクセスの種類（書込又は読込）を特定している。なお、変数の読込箇所は、変数が算術式の右辺にある箇所を示し、及び変数の書込個所は、変数が算術式の左辺にある箇所を示す。
【００６５】
アクセス箇所特定部３０は、図４に示す「変数別グループ特定」処理（Ｓ１４）を実行する。具体的には、書込及び読込の両方が行われている変数毎に、変数アクセス箇所を分類する。書込及び読込の一方のみが行われている変数は分類から除外する。図２３の表は、上記した変数別グループ特定処理（Ｓ１４）の結果をまとめた「変数別グループ一覧（Ｄ１５）」を示す。ここでは、変数vTemp, tempは、書込及び読込の両方が行われているため、それぞれ、第３のグループＩＤとして「１」及び「２」が付される。一方、変数vFlag, v, temp2は、書込及び読込の一方のみが行われているため、除外される。
【００６６】
アクセスブロック特定部３１は、図４に示す「アクセス箇所特定」処理（Ｓ１５）を実行する。具体的には、変数に書込及び読込を行っている行番号が属するブロックリージョンを特定する。変数に書込及び読込を行っている行番号は、図２３の「変数別グループ一覧（Ｄ１５）」から特定し、ブロックリージョンは、図１２の「ブロック行数一覧（ＤＯ６）」から特定する。図２４の表は、上記したアクセス箇所特定処理（Ｓ１５）の結果をまとめた「データフロー一覧（Ｄ１６）」を示す。ここでは、変数にアクセスする行番号、アクセスの種類（書込又は読込）、属するブロックリージョン、及び展開された条件文が、変数毎に分類されている。
【００６７】
第３の定数グループ出力部３２は、図４に示す「第２の定数分割」処理（Ｓ１６）を実行する。図２５の表は、上記した第２の定数分割処理（Ｓ１６）の結果をまとめた「データフロー別定数一覧（Ｄ１７）」を示す。第３の定数グループ出力部３２は、変数別グループ特定処理（Ｓ１４）で第３のグループＩＤが付された変数vTemp, temp毎に、変数別書込、読込特定処理（Ｓ１３）で特定された変数アクセス箇所の実行順序にしたがって、展開された条件文を並べ替える。更に、展開された各条件文に含まれる定数を検索し、定数ごとに行を分割する。Ｓ１６の処理により、変数の読込が行われる個所までのパスを分析して、総ての条件ごとに、書込及び読込の関係を洗い出すことができる。第３の定数グループ出力部３２は、図２５の「データフロー別定数一覧（Ｄ１７）」をユーザに対して出力する。これにより、変数毎に、書込及び読込の処理に関わっている定数を一覧として出力することができ、仕様上の書込及び読込の条件と照らし合わせてチェックすることができる。
【００６８】
以上説明したように、本発明の第３実施形態によれば、以下の作用効果が得られる。
【００６９】
ソフトウェア検査装置は、検査対象となるソースコードＤ０１の中で用いられる定数を抽出し、抽出された定数が参照される条件文を検出して、検出された条件文を展開する。ソースコードＤ０１の中で書き込み及び読み出しが行われる変数、当該変数にアクセスする箇所、当該箇所が属するブロックを特定する。そして、図２５に示すように、変数毎に、変数アクセス箇所の実行順序に従って、展開された条件文を並べ替え、且つ当該条件文の中で参照される定数を分類して出力する。これにより、ソースコードＤ０１の中で変数にアクセスする箇所の実行順序に基づいて関連性の高い定数のグループを特定する。よって、特定された定数群について仕様通りの処理がされているかを容易にレビューすることができる。したがって、仕様の条件によって同時に更新しなければいけない２以上の定数の存在をユーザに提示して、定数の変更の一貫性が保たれていないために不具合が生じる可能性がある箇所をユーザに気づかせることができる。
【００７０】
上記のように、本発明の実施形態を記載したが、この開示の一部をなす論述及び図面はこの発明を限定するものであると理解すべきではない。この開示から当業者には様々な代替実施の形態、実施例及び運用技術が明らかとなろう。
【００７１】
特願２０１３−１５０２２５号（出願日：２０１３年７月１９日）の全内容は、ここに援用される。
【符号の説明】
【００７２】
２１  定数抽出部
２２  条件文検出部
２３  ベース変数特定部
２４  第１の定数グループ出力部
２５  ブロック特定部
２６  書込箇所特定部
２７  条件文展開部
２８  書込ブロック特定部
２９  第２の定数グループ出力部
３０  アクセス箇所特定部
３１  アクセスブロック特定部
３２  第３の定数グループ出力部
【図１】
0006004110.tif 000002
【図２】
0006004110.tif 000003
【図３】
0006004110.tif 000004
【図４】
0006004110.tif 000005
【図５】
0006004110.tif 000006
【図６】
0006004110.tif 000007
【図７】
0006004110.tif 000008
【図８】
0006004110.tif 000009
【図９】
0006004110.tif 000010
【図１０】
0006004110.tif 000011
【図１１】
0006004110.tif 000012
【図１２】
0006004110.tif 000013
【図１３】
0006004110.tif 000014
【図１４】
0006004110.tif 000015
【図１５】
0006004110.tif 000016
【図１６】
0006004110.tif 000017
【図１７】
0006004110.tif 000018
【図１８】
0006004110.tif 000019
【図１９】
0006004110.tif 000020
【図２０】
0006004110.tif 000021
【図２１】
0006004110.tif 000022
【図２２】
0006004110.tif 000023
【図２３】
0006004110.tif 000024
【図２４】
0006004110.tif 000025
【図２５】
0006004110.tif 000026