(57)【特許請求の範囲】
【請求項１】
コンピュータプログラムを検査する変数アクセス一貫性検査装置であって、
検査対象となる前記コンピュータプログラムの中から、所定の条件に基づいて複数の分岐処理を切り替えて実行する一群のステートメントからなる分岐ブロックを特定する分岐ブロック特定部と、
前記分岐ブロック内で書き込みが行われる変数を検出する変数検出部と、
前記分岐ブロック内で切り替わることが可能な分岐処理の数を検出する総分岐数検出部と、
前記変数に書き込みを行う分岐処理の数を検出する書込分岐数検出部と、
前記分岐ブロック内で切り替わることが可能な分岐処理の数と前記変数に書き込みを行う分岐処理の数が一致するか否かを判断する分岐数判断部と、
前記分岐ブロック内で切り替わることが可能な分岐処理の数と前記変数に書き込みを行う分岐処理の数とが一致しないと前記分岐数判断部が判断した場合、前記変数及び前記分岐ブロックの少なくとも一方を出力する検査結果出力部と、
を備えることを特徴とする変数アクセス一貫性検査装置。
【請求項２】
請求項１に記載の変数アクセス一貫性検査装置であって、
前記分岐ブロック内で切り替わることが可能な分岐処理の数と前記変数に書き込みを行う分岐処理の数とが一致しない場合において、前記変数に書き込みを行わない分岐処理を特定する非書込分岐特定部を更に備え、
前記検査結果出力部は、前記変数に書き込みを行わない分岐処理を特定する情報を、前記変数及び前記分岐ブロックの少なくとも一方に関連づけて出力する
ことを特徴とする変数アクセス一貫性検査装置。
【請求項３】
請求項１又は２に記載の変数アクセス一貫性検査装置であって、
前記分岐ブロック内で切り替わることが可能な分岐処理の数に対する、前記変数に書き込みを行う分岐処理の数の比率を算出する比率算出部を更に備え、
前記検査結果出力部は、前記比率を、前記変数及び前記分岐ブロックの少なくとも一方に関連づけて出力する
ことを特徴とする変数アクセス一貫性検査装置。
【請求項４】
請求項３に記載の変数アクセス一貫性検査装置であって、
前記比率が予め定めた閾値よりも高いか否かを判断する比率判断部とを更に備え、
前記検査結果出力部は、前記比率判断部による判断結果を、前記変数及び前記分岐ブロックの少なくとも一方に関連づけて出力する
ことを特徴とする変数アクセス一貫性検査装置。
【請求項５】
コンピュータプログラムを検査する変数アクセス一貫性検査方法であって、
コンピュータが備える分岐ブロック特定部が、検査対象となる前記コンピュータプログラムの中から、所定の条件に基づいて複数の分岐処理を切り替えて実行する一群のステートメントからなる分岐ブロックを特定し、
コンピュータが備える変数検出部が、前記分岐ブロック内で書き込みが行われる変数を検出し、
コンピュータが備える総分岐数検出部が、前記分岐ブロック内で切り替わることが可能な分岐処理の数を検出し、
コンピュータが備える書込分岐数検出部が、前記変数に書き込みを行う分岐処理の数を検出し、
コンピュータが備える分岐数判断部が、前記分岐ブロック内で切り替わることが可能な分岐処理の数と前記変数に書き込みを行う分岐処理の数が一致するか否かを判断し、
コンピュータが備える検査結果出力部が、前記分岐ブロック内で切り替わることが可能な分岐処理の数と前記変数に書き込みを行う分岐処理の数とが一致しないと判断した場合、前記変数及び前記分岐ブロックの少なくとも一方を出力する
ことを特徴とする変数アクセス一貫性検査方法。
【請求項６】
コンピュータプログラムを検査するための変数アクセス一貫性検査プログラムであって、
コンピュータに、
検査対象となる前記コンピュータプログラムの中から、所定の条件に基づいて複数の分岐処理を切り替えて実行する一群のステートメントからなる分岐ブロックを特定する機能と、
前記分岐ブロック内で書き込みが行われる変数を検出する機能と、
前記分岐ブロック内で切り替わることが可能な分岐処理の数を検出する機能と、
前記変数に書き込みを行う分岐処理の数を検出する機能と、
前記分岐ブロック内で切り替わることが可能な分岐処理の数と前記変数に書き込みを行う分岐処理の数が一致するか否かを判断する機能と、
前記分岐ブロック内で切り替わることが可能な分岐処理の数と前記変数に書き込みを行う分岐処理の数とが一致しないと判断した場合、前記変数及び前記分岐ブロックの少なくとも一方を出力する機能と
を実現させることを特徴とする変数アクセス一貫性検査プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、変数アクセス一貫性検査装置、変数アクセス一貫性検査方法、変数アクセス一貫性検査プログラムに関するものである。
【背景技術】
【０００２】
従来から、プログラミング言語で記述されたソースプログラムにおける制御の流れやデータの流れを、そのソースプログラムを実行すること無しに解析する、静的解析方法が知られている（特許文献１参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平０９−２８２１７３号公報
【発明の概要】
【０００４】
特許文献１の静的解析方法によれば、入力と出力の関係を明確にしてプログラムの構造を可視化することはできる。しかし、可視化されたプログラムの構造のうち、不具合の可能性がある箇所をユーザに気づかせることはできない。
【０００５】
本発明は、上記課題に鑑みて成されたものであり、その目的は、プログラムの構造のうち、不具合の可能性がある箇所をユーザに気づかせることができる変数アクセス一貫性検査装置、変数アクセス一貫性検査方法、変数アクセス一貫性検査プログラムを提供することである。
【０００６】
本発明の一態様に係わる変数アクセス一貫性検査装置は、分岐ブロック内で切り替わることが可能な分岐処理の数を検出し、変数に書き込みを行う分岐処理の数を検出し、分岐ブロック内で切り替わることが可能な分岐処理の数と変数に書き込みを行う分岐処理の数が一致するか否かを判断する。そして、分岐ブロック内で切り替わることが可能な分岐処理の数と前記変数に書き込みを行う分岐処理の数とが一致しないと判断した場合、変数及び分岐ブロックの少なくとも一方を出力する。
【図面の簡単な説明】
【０００７】
【図１】図１は、本発明の第１実施形態に係わる変数アクセス一貫性検査装置のハードウェア構成を示すブロック図である。
【図２】図２は、ＣＰＵ１１の機能的構成を示すブロック図である。
【図３】図３は、本発明の第１実施形態に係わる変数アクセス一貫性検査装置によって実行される情報処理の流れ及び情報処理の途中で生成される中間データを示すデータフロー図である。
【図４】図４（ａ）、（ｂ）、（ｃ）は、読み込まれたソースコードＤ０１としてＣ言語で記述されたプログラムの一例を示す図である。
【図５】図５（ａ）、（ｂ）、（ｃ）は、分岐ブロック特定部２１により特定された分岐ブロックＩＤ１、ＩＤ２を示す図である。
【図６】図６は、変数検出部２２が行った処理結果をまとめた「分岐ブロック変数アクセス一覧」を示す表である。
【図７】図７（ａ）、（ｂ）は、ステートメント番号割付処理の結果をまとめた「ステートメント番号割付一覧（Ｄ０３）」を示す表である。
【図８】図８は、変数アクセス順序特定処理の結果をまとめた「変数アクセス順序一覧（Ｄ０４）」を示す表である。
【図９】図９（ａ）、（ｂ）、（ｃ）は、パス数特定処理（Ｓ０４）の内容を説明するための図である。
【図１０】図１０は、パス数特定処理（Ｓ０４）の結果をまとめた「パス数と変数アクセス順序一覧（Ｄ０５）」を示す表である。
【図１１】図１１は、アクセス割合判定（Ｓ０５）の結果をまとめた「アクセス割合一覧（Ｄ０６）」を示す表である。
【図１２】図１２は、アクセス一貫性判定処理（Ｓ０６）の結果をまとめた「アクセス一貫性判定結果（Ｄ０７）」を示す表である。
【図１３】図１３（ａ）、（ｂ）、（ｃ）は、図４（ａ）、（ｂ）、（ｃ）のプログラム修正例を示す図である。
【図１４】図１４（ａ）、（ｂ）は、仕様上の条件によって値を変えて書き込むケースの例を示すフローチャートである。
【図１５】図１５は、特定の分岐処理において変数の書込処理が抜けている例を示すフローチャートである。
【図１６】図１６は、第２実施形態に係わるＣＰＵ１１’の機能的構成を示すブロック図である。
【図１７】図１７は、本発明の第２実施形態に係わる変数アクセス一貫性検査装置によって実行される情報処理の流れ及び情報処理の途中で生成される中間データを示すデータフロー図である。
【図１８】図１８は、スレッシュホールド判定処理（Ｓ０７）の結果をまとめた「スレッシュホールド判定結果（Ｄ０９）」を示す表である。
【図１９】図１９（ａ）、（ｂ）は比率算出部２５により算出された比率が異なるケースを示すフローチャートである。
【発明を実施するための形態】
【０００８】
図面を参照して、本発明の実施形態を説明する。図面の記載において同一部分には同一符号を付し説明を省略する。
【０００９】
（第１実施形態）
［変数アクセス一貫性検査装置のハードウェア構成］
本発明の第１実施形態に係わる変数アクセス一貫性検査装置は、例えば車両に搭載されるる電子制御装置（ＥＣＵ）により実行されるコンピュータプログラムの変数アクセス一貫性検査処理に適用することができる。特に、コンピュータプログラムの仕様漏れ或いはコーディング漏れに起因する不具合の可能性を検査するものである。
【００１０】
図１を参照して、本発明の第１実施形態に係わる変数アクセス一貫性検査装置のハードウェア構成を説明する。変数アクセス一貫性検査装置のハードウェア構成として、汎用のコンピュータを用いることができる。例えば、変数アクセス一貫性検査装置は、記憶媒体から検査対象のコンピュータプログラム（ソースコードＤ０１）を読み込む入出力装置１２と、入出力装置１２で読み込んだソースコードＤ０１や解析の中間データを記憶する記憶部１４と、各種演算を実行してソースコードＤ０１を解析するＣＰＵ（中央処理装置）１１と、ユーザが解析に必要な情報を入力するための入力装置１３と、ＣＰＵ１１から出力される検査結果を表示する表示装置１５とを備える。検査結果は、入出力装置１２を用いて記憶媒体に書き込むことも可能である。
【００１１】
また、変数アクセス一貫性検査装置は、クライアントサーバモデルとしても実現可能である。例えば、汎用のパーソナルコンピュータ（クライアント）をコンピュータネットワークを介してサーバに接続する。これにより、図１に示すＣＰＵ１１を備えるサーバを、コンピュータネットワークを介して、入出力装置１２、入力装置１３、記憶部１４、或いは表示装置１５に接続することができる。この場合、変数アクセス一貫性検査装置は、主にＣＰＵ１１（サーバ）により構成され、入出力装置１２、入力装置１３、記憶部１４、或いは表示装置１５は変数アクセス一貫性検査装置に含まれない。この場合、解析の途中で生成される中間データは、記憶部１４の代わりに、サーバ１１が備える内部ハードディスクに一時的に格納すればよい。
【００１２】
図２を参照して、ＣＰＵ１１の機能的構成を説明する。ＣＰＵ１１を備えるコンピュータを変数アクセス一貫性検査装置として機能させるためのコンピュータプログラム（変数アクセス一貫性検査プログラム）を、ＣＰＵ１１を備えるコンピュータにインストールして実行する。これにより、ＣＰＵ１１は、以下に示す各情報処理部を構成する。なお、ここでは、ソフトウェアによって変数アクセス一貫性検査装置を実現する例を示すが、もちろん、以下に示す各情報処理を実行するための専用のハードウェアを用意して、変数アクセス一貫性検査装置を構成することも可能である。
【００１３】
ＣＰＵ１１は、分岐ブロック特定部２１、変数検出部２２、総分岐数検出部２３、書込分岐数検出部２４、分岐数判断部２６、及び検査結果出力部２８を構成する。
【００１４】
分岐ブロック特定部２１は、記憶部１４からソースコードＤ０１を読み込み、検査対象となるコンピュータプログラムの中から、分岐ブロックを特定する。分岐ブロックは、所定の条件に基づいて複数の分岐処理を切り替えて実行する一群のステートメントからなる。「ステートメント」とは、ソースコード上の１行ごとの処理単位のことである。具体的に、分岐ブロックは、例えばＣ言語の場合、if文或いはswitch文などの条件により判定して複数の処理（分岐処理）を切り替えて実行するステートメント内のブラケット“｛”と“｝”で囲まれた処理単位を指す。予め、条件分岐と判定できる箇所として例えば「if」及び「switch」を定めておく。分岐ブロック特定部２１は、解析対象となるソースコードＤ０１の中から、条件分岐と判定できる箇所を特定し、その後に続く“{”と“}”で囲まれた箇所を分岐ブロックとして特定する。例えば、if文の場合、分岐ブロック特定部２１は、if文の条件文“()”が終了した後の“{”を分岐ブロックの開始と判断する。次に“}”を検出し、その後にelse文が続かない場合、この“}”を分岐ブロックの終端と判断する。一方、その後にelse文が続く場合、改めて次の“}”を検出し、この“}”を分岐ブロックの終端と判断する。if文の場合でも次に続く処理が１行で済ませられる場合、“{”、 “}”を省略する場合があるが、この場合、この１行の行頭に“{”、行末に“}”があると判断し、同じ処理をする。また、switch文の場合、“{“と“}“とで囲まれた部分を分岐ブロックとして認識する。分岐ブロック特定部２１により特定された分岐ブロックは、記憶部１４に一時的に記憶される。
【００１５】
変数検出部２２は、分岐ブロックを記憶部１４から読み込み、分岐ブロック内で書き込みが行われる変数を検出する。具体的に、変数検出部２２は、分岐ブロック内の分岐処理ごとに書き込まれている変数を検出する。例えばＣ言語の場合、“＝”で示された式の左辺の変数を総て検出する。複数の分岐ブロックが特定されている場合、変数検出部２２は、分岐ブロック毎に変数を検出する。変数検出部２２により検出された変数は、記憶部１４に一時的に記憶される。
【００１６】
総分岐数検出部２３は、分岐ブロックを記憶部１４から読み込み、分岐ブロック内で切り替わることが可能な分岐処理の数（「総パス数」という）を検出する。例えば、「if」により特定された分岐ブロックの場合、「if」の後に続く“{”と“}”で囲まれる箇所が分岐処理を示す。総分岐数検出部２３は、分岐ブロック内に含まれる、“{”と“}”で囲まれる箇所の数を総パス数として検出する。「switch」により特定された分岐ブロックの場合、総分岐数検出部２３は、「switch」の後に続く“case”の数を総パス数として検出する。複数の分岐ブロックが特定されている場合、総分岐数検出部２３は、各分岐ブロックについて総パス数を検出する。総分岐数検出部２３により検出された総パス数は、記憶部１４に一時的に記憶される。
【００１７】
書込分岐数検出部２４は、分岐ブロックを記憶部１４から読み込み、変数に書き込みを行う分岐処理の数（「書込パス数」という）を検出する。具体的に、書込分岐数検出部２４は、分岐ブロック内に含まれる分岐処理のうち、変数に書き込みを行っている分岐処理の数を書込パス数として検出する。複数の分岐ブロックが特定されている場合、書込分岐数検出部２４は、分岐ブロック毎に、書込パス数を検出する。更に、１つの分岐ブロックの中で複数の変数が検出されている場合、書込分岐数検出部２４は、各変数について書込パス数を検出する。書込分岐数検出部２４により検出された書込パス数は、記憶部１４に一時的に記憶される。
【００１８】
分岐数判断部２６は、総パス数及び書込パス数を記憶部１４から読み込む。そして、分岐数判断部２６は、分岐ブロック内で切り替わることが可能な分岐処理の数（総パス数）と変数に書き込みを行う分岐処理の数（書込パス数）が一致するか否かを判断する。複数の分岐ブロック或いは複数の変数が特定或いは検出されている場合、書込分岐数検出部２４は、分岐ブロック毎且つ変数毎に、判断する。例えば、分岐数判断部２６は、図２に示す比率算出部２５が算出した比率が１００％であるか否かを判断してもよい。分岐数判断部２６による判断結果は、記憶部１４に一時的に記憶される。
【００１９】
検査結果出力部２８は、分岐数判断部２６による判断結果を記憶部１４から読み込む。そして、検査結果出力部２８は、分岐ブロック内で切り替わることが可能な分岐処理の数と変数に書き込みを行う分岐処理の数とが一致しないと分岐数判断部２６が判断した場合、変数検出部２２により検出された変数、及び分岐ブロック特定部２１により特定された分岐ブロックの少なくとも一方を出力する。
【００２０】
ＣＰＵ１１は、非書込分岐特定部２７を更に構成する。非書込分岐特定部２７は、分岐数判断部２６による判断結果を記憶部１４から読み込む。そして、非書込分岐特定部２７は、分岐ブロック内で切り替わることが可能な分岐処理の数と変数に書き込みを行う分岐処理の数とが一致しない場合において、変数に書き込みを行わない分岐処理を特定する。変数に書き込みを行わない分岐処理を特定する情報は、記憶部１４に一時的に記憶される。検査結果出力部２８は、変数に書き込みを行わない分岐処理を特定する情報を、変数及び分岐ブロックの少なくとも一方に関連づけて出力する。
【００２１】
ＣＰＵ１１は、比率算出部２５を更に構成する。比率算出部２５は、分岐数判断部２６による判断結果を記憶部１４から読み込む。そして、比率算出部２５は、分岐ブロック内で切り替わることが可能な分岐処理の数に対する、変数に書き込みを行う分岐処理の数の比率（アクセス割合）を算出する。比率算出部２５により算出された比率は、記憶部１４に一時的に記憶される。検査結果出力部２８は、比率算出部２５により算出された比率を、変数及び分岐ブロックの少なくとも一方に関連づけて出力する。
【００２２】
［変数アクセス一貫性検査装置により実行される情報処理の手順］
次に、図３〜図１３を参照して、本発明の第１実施形態に係わる変数アクセス一貫性検査方法の一例として、図１及び図２に示す変数アクセス一貫性検査装置によって実行される情報処理の手順を説明する。
【００２３】
先ず、ＣＰＵ１１は、検査対象となるソースコードＤ０１を入出力装置１２から読み込む。なお、ソースコードＤ０１は、予め入出力装置１２を用いてユーザにより変数アクセス一貫性検査装置内に読み込まれ、記憶部１４に格納されていてもよい。図４（ａ）、（ｂ）、（ｃ）は、読み込まれたソースコードＤ０１として、Ｃ言語で記述されたコンピュータプログラムの一例を示す。検査対象となるコンピュータプログラムは、図４（ａ）、（ｂ）、（ｃ）に示す３つのファイルに跨って記述されている。図４（ａ）のファイル名は「Task1.c」であり、図４（ｂ）のファイル名は「Task2.c」であり、図４（ｃ）のファイル名は「foo.c」である。Ｃ言語で記述されたプログラムの一例において、各ファイルの左端部に記載された１から始まる連続番号は、各ファイルの「行番号」を示す。
【００２４】
次に、分岐ブロック特定部２１は、図３に示す「変数アクセス解析」処理（Ｓ０１）を実行する。先ず、分岐ブロック特定部２１は、図４（ａ）、（ｂ）、（ｃ）に示すコンピュータプログラムの中から、分岐ブロックを特定する。具体的には、分岐ブロックの開始位置として、「if」及び「switch」を特定する。そして、特定された「if」及び「switch」の後に続く“{”と“}”で囲まれた箇所を分岐ブロックとして特定し、特定された分岐ブロックに識別番号を順次付与する。図５（ａ）、（ｂ）、（ｃ）は、分岐ブロック特定部２１により特定された分岐ブロックＩＤ１、ＩＤ２を示す。「Task1.c」の中に分岐ブロックＩＤ１が特定され、「Task2.c」の中に分岐ブロックＩＤ２が特定された。特定された分岐ブロックＩＤ１、ＩＤ２は、記憶部１４に一時的に記憶される。
【００２５】
次に、変数検出部２２は、分岐ブロックＩＤ１、ＩＤ２を記憶部１４から読み込み、分岐ブロックＩＤ１、ＩＤ２内で書き込みが行われる変数を検出する。具体的に、“＝”で示された式の左辺の変数を総て検出する。変数検出部２２は、分岐ブロックＩＤ１、ＩＤ２毎に変数を検出する。変数の書き込みが無い分岐ブロックでは、「if」,「else」,「case」などの分岐のステートメントを検出する。
【００２６】
また、変数検出部２２は、変数を書き込んだ後にその変数を読み込んでいる箇所を、分岐ブロック内であるか否かに関わらず検出する。その変数を読み込んでいる箇所に、分岐ブロックＩＤは付さなくてもよい。
【００２７】
図６の表は、上記した変数アクセス解析処理（Ｓ０１）の結果をまとめた「変数アクセス一覧（ＤＯ２）」を示す。図６の表の中では、分岐ブロック内で書き込みが行われている変数名、ファイル名、行番号、ステートメント、分岐ブロックＩＤ、及びＲ／Ｗを出力する。Ｒ／Ｗのうち、「Ｗ」は変数に書き込みを行っていることを示し、「Ｒ」は変数の読み出しを行っていることを示す。もし、「if」,「else」,「case」などの分岐のステートメントを検出したが、変数に書き込みが無い場合、「No W」と出力する。ここで、変数にアクセスすることには、変数に書き込みを行うことと、変数を読み込むことが含まれる。図６の表は、図５（ａ）に示す分岐ブロックＩＤ１の中から、変数「SW1」が特定され、図５（ｂ）に示す分岐ブロックＩＤ２の中から、変数「V1_Out」が特定されたことを示す。「変数アクセス一覧（ＤＯ２）」は、記憶部１４に一時的に記憶される。
【００２８】
次に、変数アクセス一貫性検査装置は、図３に示す「ステートメント番号割付」処理（Ｓ０２）を実行する。ステートメント番号割付処理（Ｓ０２）では、ソースコードＤ０１を記憶部１４から読み込み、タスク（Task1.c、Task2.c）毎にステートメントの実行順序を解析し、各ステートメントに実行順序番号を付る。図７（ａ）、（ｂ）は、ステートメント番号割付処理の結果をまとめた「ステートメント番号割付一覧（Ｄ０３）」を示す。図７（ａ）、（ｂ）において、「ステートメント番号」はステートメントの実行順序を示す。ステートメント番号割付処理（Ｓ０２）では、各タスクの上流からステートメントを解析し、プログラムが実行される順序を特定する。分岐文がある場合は全分岐が上流から順序実行されたものとしてステートメント番号を付加する。繰り返り処理がある場合、その繰り返し処理が１回実行されたものとしてステートメント番号を付加する。また、子関数（サブルーチン処理）がある場合はそのサブルーチン処理が実行されたものとして、ステートメントの実行順序を特定する。「ステートメント番号割付一覧（Ｄ０３）」は、記憶部１４に一時的に記憶される。
【００２９】
次に、変数アクセス一貫性検査装置は、図３に示す「変数アクセス順序特定」処理（Ｓ０３）を実行する。変数アクセス順序特定処理（Ｓ０３）では、まず、「分岐ブロック変数アクセス一覧（Ｄ０２）」及び「ステートメント番号割付一覧（Ｄ０３）」を記憶部１４から読み込む。図６に示す「分岐ブロック変数アクセス一覧（Ｄ０２）」と図７（ａ）、（ｂ）に示す「ステートメント番号割付一覧（Ｄ０３）」とを比較する。そして、分岐ブロック内でアクセスしている変数の実行順序（ステートメント番号）を特定する。図８は、変数アクセス順序特定処理（Ｓ０３）の結果をまとめた「変数アクセス順序一覧（Ｄ０４）」を示す。変数アクセス順序一覧（Ｄ０４）によって、各分岐ブロックでアクセスされている変数がどのような実行順序でアクセスされているかが分かる。「変数アクセス順序一覧（Ｄ０４）」は、記憶部１４に一時的に記憶される。
【００３０】
次に、変数アクセス一貫性検査装置は、図３に示す「パス数特定処理」（Ｓ０４）を実行する。パス数特定処理（Ｓ０４）では、分岐ブロックＩＤ１、ＩＤ２ごとに総パス数と書込パス数を検出する。具体的には、総分岐数検出部２３は、「変数アクセス順序一覧（Ｄ０４）」を記憶部１４から読み込み、「if」の後に続く“{”と“}”で囲まれる分岐処理の数を総パス数として検出する。また、総分岐数検出部２３は、「switch」の後に続く“case”の数を総パス数として検出する。
【００３１】
また、書込分岐数検出部２４は、分岐ブロック内に含まれる分岐処理のうち、変数に書き込みを行っている分岐処理の数を書込パス数として検出する。１つの分岐ブロックの中で複数の変数が検出されている場合、書込分岐数検出部２４は、各変数について書込パス数を検出する。
【００３２】
図９（ａ）、（ｂ）、（ｃ）を参照して、パス数特定処理（Ｓ０４）の内容を説明する。図９（ａ）の「Task1.c」において、分岐ブロックＩＤ１の総パス数は５であり、変数「SW1」の書込パス数は５である。また、図９（ｂ）の「Task2.c」において、分岐ブロックＩＤ２の総パス数は６であり、変数「V1_Out」の書込パス数は５である。図１０の表は、図９に示したパス数特定処理（Ｓ０４）の結果をまとめた「パス数と変数アクセス順序一覧（Ｄ０５）」を示す。図１０の表は、図６の表に対して、変数毎に総パス数と書込パス数を追加したものである。「パス数と変数アクセス順序一覧（Ｄ０５）」は、記憶部１４に一時的に記憶される。
【００３３】
次に、変数アクセス一貫性検査装置は、図３に示す「アクセス割合判定」処理（Ｓ０５）を実行する。アクセス割合判定処理（Ｓ０５）では、分岐ブロック毎のアクセス割合を算出する。具体的に、比率算出部２５は、「パス数と変数アクセス順序一覧（Ｄ０５）」を記憶部１４から読み込み、総パス数に対する書込パス数の比率（アクセス割合）、即ち、書込パス数（Ｂ）／全パス数（Ａ）を算出する。この比率は、分岐ブロックに含まれる全ての分岐処理に対して、書き込みが行われる分岐処理がどのくらいの割合で占められているかを示す数値である。
【００３４】
図１１の表は、アクセス割合判定処理（Ｓ０５）の結果をまとめた「アクセス割合一覧（Ｄ０６）」を示す。図１１の表は、図１０の表に対して、アクセス割合（比率）を追加したものである。変数「SW1」の比率は、５／５＝１００％となる。つまり、分岐ブロックＩＤ１に含まれる全ての分岐処理において、抜け盛れなく変数「SW1」に書込処理を行っている。一方、変数「V1_Out」の比率は、５／６＝８３％となる。１７％の割合で、変数「V1_Out」への書込処理が存在していない。「アクセス割合一覧（Ｄ０６）」は、記憶部１４に一時的に記憶される。
【００３５】
次に、変数アクセス一貫性検査装置は、図３に示す「アクセス一貫性判定（Ｓ０６）」処理を実行する。アクセス一貫性判定処理（Ｓ０６）では、全パス数と書込パス数が一致していない箇所を検出して出力する。具体的に、先ず、分岐数判断部２６は、「アクセス割合一覧（Ｄ０６）」を記憶部１４から読み込み、アクセス割合判定処理（Ｓ０５）で算出された比率が１００％であるか否かを判断する。そして、検査結果出力部２８は、総パス数と書込パス数とが一致しないと分岐数判断部２６が判断した場合、変数検出部２２により検出された変数、及び分岐ブロック特定部２１により特定された分岐ブロックの少なくとも一方を出力する。
【００３６】
図１２の表は、アクセス一貫性判定処理（Ｓ０６）の結果をまとめた「アクセス一貫性判定結果（Ｄ０７）」を示す。図１２の表は、図１１の表から、総パス数と書込パス数とが一致しない変数「V1_Out」を抽出したものである。図１２に示すように、検査結果出力部２８は、総パス数と書込パス数とが一致しない変数名、ファイル名、行番号、ステートメント番号、ステートメント、分岐ブロックＩＤ、総パス数、書込パス数、アクセス割合、及びＲ／Ｗを出力する。
【００３７】
アクセス一貫性判定処理（Ｓ０６）により、ユーザ（設計者）は、総パス数と書込パス数とが一致しない変数を特定することができる。また、ファイル「Task2.c」の１８行目におけるステートメント「case 4:」の後、変数「V1_Out」に書き込みがないまま、ファイル「Task2.c」の５行目で変数「V1_Out」が読み込まれている。よって、ユーザは、仕様及びコーディングの漏れが無いか否かをレビューすることができる。設計者はこのレビューによって、仕様及びコーディングの抜けに気づき、処理を追加することができる。図４（ａ）、（ｂ）、（ｃ）に示したプログラムの修正例を図１３（ａ）、（ｂ）、（ｃ）に示す。図４（ｂ）のファイル「Task2.c」の１８行目におけるステートメント「case 4:」の後、図１３（ｂ）の符号ＡＭ１に示すように、変数「V1_Out」に２６を書き込むステートメントを追加した。
【００３８】
［第１実施形態による効果］
ソフトウェアの処理において変数にアクセスする時、仕様上の条件に応じて異なる値を書き込むケースが多々ある。例えば、自動車などで使用されるエアコンがある。手動で設定を行うエアコンは、風量、温度をそれぞれ数段階分けて、段階的に出力を調整することができる。この場合、ソフトウェアの処理としては、風量、温度の各スイッチの状態をポートから読み込み、エアコンの出力の変数を設定するロジックが組み込まれる。図１４（ａ）、（ｂ）は、仕様上の条件に応じて異なる値を書き込むケースの例を示すフローチャートである。図１４（ａ）では、変数「SW1」の値に応じて「V1_Out」に書き込む値を変化させる例を示す。図１４（ｂ）では、変数「SW2」の値に応じて「V2_Out」に書き込む値を変化させる例を示す。このように、“条件”によって“変数の値を必ず書き換える”という仕様は、ソフトウェアでは頻繁に存在する。
【００３９】
しかし、条件が多く存在するため処理が複雑になると、分岐ブロック内のあるパス（分岐処理）だけ、変数の書込処理を記述し忘れてしまう場合がある。なぜなら、全ての分岐処理に対して仕様をきちんと考えられていないケースや、分岐処理の数が多すぎて、全ての分岐処理についてテストしきれないケースがあるからである。したがって、分岐ブロック内で変数の書込処理がある場合は、特定の分岐処理において変数の書込処理が抜けないように検査する必要がある。
【００４０】
図１５は、特定の分岐処理において変数の書込処理が抜けている例を示すフローチャートである。エアコンの温度スイッチの状態を示す変数「SW1」の状態に応じて、エアコンの設定を切り替えている。変数「SW1」は０〜４の値を取り得る。変数「SW1」が０〜３である場合、それぞれ「V1_Out」に１８、２０、２２、２４を書き込む処理が行われ、その後に分岐が収束している。変数「SW1」が４である場合、「V1_Out」に２６を書き込む処理が必要であるが、その書込処理が行われないまま分岐が収束している。この場合、詳細仕様書が、変数「SW1」が４である時のパス（分岐処理）の仕様を定義しており、且つ単体テストを、変数「SW1」が０〜４である時の全てのパス（分岐処理）について実施していれば、変数「SW1」が４である場合の書込処理の漏れに気づく。しかし、詳細仕様を作成している段階で、変数「SW1」が４である時のパス（分岐処理）の仕様を考えられていない場合、単体テストを実施しても検出できない。なぜなら、変数「SW1」が４である時のパス（分岐処理）の仕様が考えられていないからである。また、変数「SW1」が４である時のパス（分岐処理）の仕様が考えられている場合でも、分岐処理の数が多く単体テストを全ての分岐処理で実施できない場合は、書込処理の漏れを検出できない可能性がある。このように、従来の仕様の作成、単体テストの実施では、書込処理の漏れによる不具合を抑制することが難しい。また、このような観点で検出するツールも存在しない。すなわち、分岐処理で値を書き込む場合、全てのパス（分岐処理）で変数の書き込み処理が行われている（アクセスの一貫性）ことを検証しなければならない。
【００４１】
第１実施形態によれば、総パス数と書込パス数とが一致しないと分岐数判断部２６が判断した場合、検査結果出力部２８は、図１２に示すように、変数及び分岐ブロックの少なくとも一方を出力する。総パス数と書込パス数とが一致しない場合、仕様漏れ或いはコーディング漏れの可能性がある。そこで、変数或いは分岐ブロックの少なくとも一方を出力することにより、プログラムの構造のうち不具合の可能性がある箇所をユーザに気づかせることができる。総ての分岐処理において変数への書き込みが必要なプログラムの構造について、不具合の可能性を示唆することができる。このように、設計の段階から仕様として処理が抜けている場合や、仕様に定義されていても、単体テストが実施できないようなプログラムの構造の場合、書込処理抜けの不具合を抑制することができる。また、膨大なソースコードから、人の目で判断できない変数アクセスの一貫性が保たれていないことをユーザに気づかせることができる。また、ソフトウェアプロセスで使用されているテスト（単体テスト、結合テスト、システムテスト）で見つけられないような変数アクセス一貫性が保たれていないプログラムのバグを未然に防ぐことができる。
【００４２】
非書込分岐特定部２７は、総パス数と書込パス数とが一致しない場合において、変数に書き込みを行わない分岐処理を特定し、検査結果出力部２８は、図１２に示すように、変数に書き込みを行わない分岐処理を特定する情報を、変数及び分岐ブロックの少なくとも一方に関連づけて出力する。プログラムの構造の中で検証すべき箇所が特定されるので、ユーザによる検証作業の効率を高めることができる。なお、「分岐処理を特定する情報」には、ファイル名、行番号、ステートメント番号、ステートメントが含まれる。
【００４３】
比率算出部２５は、総パス数に対する書込パス数の比率を算出し、検査結果出力部２８は、算出された比率を、変数及び分岐ブロックの少なくとも一方に関連づけて出力する。総パス数と書込パス数とが一致しない場合において、比率（アクセス割合）が高い程、つまり、１００％に近い程、仕様漏れ或いはコーディング漏れの可能性が高まる。そこで、比率を、変数及び分岐ブロックの少なくとも一方に関連づけて出力する。これにより、不具合の可能性を数値化することができる。不具合の可能性がある箇所として、複数の変数或いは複数の分岐ブロックが出力される場合、検証対象としての優先度をユーザに伝えることができるので、ユーザによる検証作業の効率を高めることができる。このように、ソースコード内に数多くの分岐処理がある中から、分岐ブロックごとに比率（アクセス割合）を算出し、ユーザに通知する。これにより、仕様の漏れ、コーディングの漏れがないことに気づき、不具合を未然に防止することができる。
【００４４】
（第２実施形態）
第２実施形態では、予め定めた閾値を用いて比率算出部２５により算出された比率を判定する機能を更に備える変数アクセス一貫性検査装置について説明する。図１６を参照して、第２実施形態に係わるＣＰＵ１１’の機能的構成を説明する。なお、第２実施形態に係わる変数アクセス一貫性検査装置のハードウェア構成は図１と同じであり説明を省略する。図１６に示すように、ＣＰＵ１１’は、図２に示した機能的構成（２１〜２８）の他に、比率算出部２５により算出された比率が予め定めた閾値よりも高いか否かを判断する比率判断部２９を更に備える。
【００４５】
図１７を参照して、本発明の第２実施形態に係わる変数アクセス一貫性検査装置によって実行される情報処理の流れ及び情報処理の途中で生成される中間データを説明する。アクセス一貫性判定処理（Ｓ０６）までの情報処理（Ｓ０１〜Ｓ０６）、ソースコードＤ０１及びアクセス一貫性判定結果Ｄ０７までの中間データ（Ｄ０２〜Ｄ０７）は、図３と同じで有り説明を省略する。
【００４６】
アクセス一貫性判定処理（Ｓ０６）の後、変数アクセス一貫性検査装置は、図１７に示す「スレッシュホールド判定」処理（Ｓ０７）を実行する。スレッシュホールド判定処理（Ｓ０７）では、比率判断部２９が、比率算出部２５により算出された比率が予め定めた閾値よりも高いか否かを判断する。比率判断部２９は、図１２に示すアクセス一貫性判定結果（Ｄ０７）及びユーザにより予め設定されたスレッシュホールド値（Ｄ０８）を記憶部１４から読み込み、アクセス一貫性判定結果（Ｄ０７）及びスレッシュホールド値（Ｄ０８）を用いて判断する。そして、検査結果出力部２８は、図１８の表に示すように、比率判断部２９による判断結果を、変数及び分岐ブロックの少なくとも一方に関連づけて出力する。
【００４７】
図１９（ａ）、（ｂ）は比率算出部２５により算出された比率が異なるケースを示す。図１９（ａ）に示すように、変数「V1_Out」の書込処理では、総パス数が６であるのに対して書込パス数が５であるため、アクセス割合（比率）が８３％となる。これに対して、図１９（ｂ）に示すように、変数「V2_Out」の書込処理では、総パス数が３であるのに対して書込パス数が２であるため、アクセス割合（比率）が６６％となる。図１９（ｂ）に示すケースでは、変数「V2_Out」のアクセス割合（比率）が低いため、仕様の漏れ或いはコーディングの漏れの可能性は低い。そこで、ユーザは予め閾値を設定しておく。そして、比率判断部２９が、比率算出部２５により算出された比率が予め定めた閾値よりも高いか否かを判断する。そして、閾値より大きい比率に対して警告を出力することができる。そのため、出荷直前など、ユーザの検証時間が少ないときに、ユーザは危険性の高い箇所を絞って検証することができる。
【００４８】
図１８の表は、スレッシュホールド判定処理（Ｓ０７）の結果をまとめた「スレッシュホールド判定結果（Ｄ０９）」を示す。図１８の表は、総パス数と書込パス数とが一致しない変数「V1_Out」及び「V2_Out」について、アクセス割合（比率）の判断結果及び閾値（８０％）を更に追加したものである。変数「V2_Out」のアクセス割合（６７％）は、閾値（０．８）よりも低い。一方、変数「V1_Out」のアクセス割合（８３％）は、閾値（０．８）よりも高い。
【００４９】
アクセス一貫性が保たれていないように一見できるプログラムの構造であっても、実際は意図通りに設計されているケースがある。このため、本当の不具合を突き止めるまでの検証効率が低下する場合がある。そこで、比率判断部２９が、比率が予め定めた閾値よりも高いか否かを判断し、検査結果出力部２８は、比率判断部２９による判断結果を、変数及び分岐ブロックの少なくとも一方に関連づけて出力する。これにより、検証対象としての優先度について閾値に基づく判断結果が得られるので、検証対象を明確にして更に検証作業の効率を高めることができる。
【００５０】
上記のように、本発明の実施形態を記載したが、この開示の一部をなす論述及び図面はこの発明を限定するものであると理解すべきではない。この開示から当業者には様々な代替実施の形態、実施例及び運用技術が明らかとなろう。
【００５１】
変数検出部２２は、分岐処理（パス）で書き込みが行われた変数であっても、分岐が収束した後に、変数の読み込みが行われていない場合、当該変数は検出しなくてもよい。分岐が収束した後に変数の読み込みが行われなければ、書込パス数が総パス数に一致していなくても、仕様の漏れ、コーディングの漏れの可能性が低いからである。
【符号の説明】
【００５２】
２１  分岐ブロック特定部
２２  変数検出部
２３  総分岐数検出部
２４  書込分岐数検出部
２５  比率算出部
２６  分岐数判断部
２７  非書込分岐特定部
２８  検査結果出力部
２９  比率判断部
【図１】
0006015778.tif 000002
【図２】
0006015778.tif 000003
【図３】
0006015778.tif 000004
【図４】
0006015778.tif 000005
【図５】
0006015778.tif 000006
【図６】
0006015778.tif 000007
【図７】
0006015778.tif 000008
【図８】
0006015778.tif 000009
【図９】
0006015778.tif 000010
【図１０】
0006015778.tif 000011
【図１１】
0006015778.tif 000012
【図１２】
0006015778.tif 000013
【図１３】
0006015778.tif 000014
【図１４】
0006015778.tif 000015
【図１５】
0006015778.tif 000016
【図１６】
0006015778.tif 000017
【図１７】
0006015778.tif 000018
【図１８】
0006015778.tif 000019
【図１９】
0006015778.tif 000020