(57)【特許請求の範囲】
【請求項１】
コンピュータプログラムを検査するデータ更新漏れ検査装置であって、
検査対象となる前記コンピュータプログラムに含まれるステートメントを、複数のプログラムブロックに分類するプログラムブロック分類部と、
前記プログラムブロック毎に、前記プログラムブロックの中で更新される変数を抽出する更新変数抽出部と、
前記プログラムブロック毎に対応する更新変数集合を特定し、前記複数の更新変数集合のうちの少なくとも１つをグループ変数として特定するグループ変数特定部と、
前記プログラムブロックに対応する前記更新変数集合と、前記グループ変数の包含関係を用いて、前記プログラムブロックの同時更新度合いを判断する同時性判断部と、
前記同時性判断部による判断結果を出力する検査結果出力部と
を備えることを特徴とするデータ更新漏れ検査装置。
【請求項２】
請求項１に記載のデータ更新漏れ検査装置において、
同時更新度合いが一部であると前記同時性判断部により判断されたプログラムブロックを抽出する更新漏れ箇所抽出部を更に備え、
前記検査結果出力部は、前記更新漏れ箇所抽出部により抽出された前記プログラムブロックを特定する情報を、前記判断結果に関連づけて出力することを特徴とするデータ更新漏れ検査装置。
【請求項３】
請求項１又は２に記載のデータ更新漏れ検査装置において、
同時更新度合いが一部であると前記同時性判断部により判断されたプログラムブロックの数と同時更新度合いが完全であると前記同時性判断部により判断されたプログラムブロックの数の和に対する、同時更新度合いが完全であると前記同時性判断部により判断されたプログラムブロックの数の割合を算出する結合度算出部を更に備え、
前記検査結果出力部は、前記結合度算出部により算出された割合を、前記判断結果に関連づけて出力する
ことを特徴とするデータ更新漏れ検査装置。
【請求項４】
請求項１乃至３のいずれか一項に記載のデータ更新漏れ検査装置において、
前記複数のプログラムブロックの中に、同時更新度合いが一部であると前記同時性判断部により判断されたプログラムブロックがある場合、前記グループ変数の要素の中から、当該プログラムブロックに対応する更新変数集合に属さない要素を抽出する更新漏れ変数抽出部を更に備え、
前記検査結果出力部は、前記更新漏れ変数抽出部により抽出された要素を、前記判断結果に関連づけて出力する
ことを特徴とするデータ更新漏れ検査装置。
【請求項５】
請求項１乃至４のいずれか一項に記載のデータ更新漏れ検査装置において、
前記複数のプログラムブロックの中に、同時更新度合いが一部であると前記同時性判断部により判断されたプログラムブロックがない場合、前記検査結果出力部は、前記グループ変数を特定する情報を、前記判断結果に関連づけて出力することを特徴とするデータ更新漏れ検査装置。
【請求項６】
コンピュータプログラムを検査するデータ更新漏れ検査方法であって、
検査対象となる前記コンピュータプログラムに含まれるステートメントを、複数のプログラムブロックに分類し、
前記プログラムブロック毎に、前記プログラムブロックの中で更新される変数を抽出し、
前記プログラムブロック毎に対応する更新変数集合を特定し、前記複数の更新変数集合のうちの少なくとも１つをグループ変数として特定し、
前記プログラムブロックに対応する前記更新変数集合と、前記グループ変数の包含関係を用いて、前記プログラムブロックの同時更新度合いを判断し、
前記判断の結果を出力する
ことを特徴とするデータ更新漏れ検査方法。
【請求項７】
コンピュータプログラムを検査するためのデータ更新漏れ検査プログラムであって、
コンピュータに、
検査対象となる前記コンピュータプログラムに含まれるステートメントを、複数のプログラムブロックに分類する機能と、
前記プログラムブロック毎に、前記プログラムブロックの中で更新される変数を抽出する機能と、
前記プログラムブロック毎に対応する更新変数集合を特定し、前記複数の更新変数集合のうちの少なくとも１つをグループ変数として特定する機能と、
前記プログラムブロックに対応する前記更新変数集合と、前記グループ変数の包含関係を用いて、前記プログラムブロックの同時更新度合いを判断する機能と、
前記判断の結果を出力する機能と、
を実現させることを特徴とするデータ更新漏れ検査プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ更新漏れ検査装置、データ更新漏れ検査方法、データ更新漏れ検査プログラムに関するものである。
【背景技術】
【０００２】
１つのセマフォで管理している複数の共有リソース（変数群）のうち、個別のセマフォで管理すべき共有リソースをソースコードの静的解析によって検出するソフトウェア検査装置としては、特許文献１に開示されたソフトウェア検査装置が知られている。特許文献１に開示されたソフトウェア検査装置は、１つのセマフォで保護される変数群を特定する手段を備えており、１つのセマフォで保護された区間で変数群に同時にアクセスしているか否かを確認することができる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１０−１５７１４７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、特許文献１に開示されたソフトウェア検査装置は、セマフォによる保護区間のみを検査対象としているため、セマフォで保護されていない区間を検査することはできない。このため、セマフォで保護されていない区間において、１つの状態あるいは情報を表すために同時にアクセスされる必要がある変数群（複数の変数）に関して、変数の更新漏れを検査することはできない。【０００５】
本発明は、上記課題に鑑みて成されたものであり、その目的は、１つの状態あるいは情報を表すために同時に更新される必要がある複数の変数に関して、変数の更新漏れの可能性をユーザに気づかせることができるデータ更新漏れ検査装置、データ更新漏れ検査方法、データ更新漏れ検査プログラムを提供することである。
【課題を解決するための手段】
【０００６】
本発明の一態様に関わる更新漏れ検査装置は、検査対象となるコンピュータプログラムに含まれるステートメントを、複数のプログラムブロックに分類し、プログラムブロック毎に、プログラムブロックの中で更新される変数を抽出し、プログラムブロック毎に対応する更新変数集合を特定し、複数の更新変数集合のうちの少なくとも１つをグループ変数として特定する。プログラムブロックに対応する更新変数集合と、グループ変数の包含関係を用いて、プログラムブロックの同時更新度合いを判断し、その結果を出力する。【０００７】
本発明の一態様に関わる更新漏れ検査装置は、同時更新度合いが一部であると判断されたプログラムブロックを抽出し、抽出されたプログラムブロックを特定する情報を、判断結果に関連づけて出力することが好ましい。【０００８】
本発明の一態様に関わる更新漏れ検査装置は、
同時更新度合いが一部であると判断されたプログラムブロックの数と同時更新度合いが完全であると判断されたプログラムブロックの数の和に対する、同時更新度合いが完全であると判断されたプログラムブロックの数の割合を算出し、算出された割合を判断結果に関連づけて出力することが好ましい。【０００９】
本発明の一態様に関わる更新漏れ検査装置は、複数のプログラムブロックの中に、同時更新度合いが一部であると判断されたプログラムブロックがある場合、グループ変数の要素の中から、当該プログラムブロックに対応する更新変数集合に属さない要素を抽出して判断結果に関連づけて出力することが好ましい。【００１０】
本発明の一態様に関わる更新漏れ検査装置は、複数のプログラムブロックの中に、同時更新度合いが一部であると判断されたプログラムブロックがない場合、グループ変数を特定する情報を、判断結果に関連づけて出力することが好ましい。
【図面の簡単な説明】
【００１１】
【図１】図１は、本発明の実施形態に係わるデータ更新漏れ検査装置のハードウェア構成を示すブロック図である。
【図２】図２は、ＣＰＵ１１の機能的構成を示すブロック図である。
【図３】図３は、本発明の実施形態に係わるデータ更新漏れ検査装置によって実行される情報処理の流れを示すフローチャートである。
【図４】図４（ａ）、図４（ｂ）、図４（ｃ）は、ソースコード入力部２１により読み込まれたソースコードＤ０１として、Ｃ言語で記述されたコンピュータプログラムの一例を示す図である。
【図５】図５は、プログラムブロック特定部３１が参照する図２のブロックセパレータ一覧Ｄ０３の一例を示す表である。
【図６】図６は、エントリーポイント一覧Ｄ０２の一例を示す表である。
【図７】図７は、実行関数解析部３０により作成される実行関数テーブルの一例を示す表である。
【図８】図８は、ステップＳ０３及びステップＳ０４の詳細な処理手順の一例を示すフローチャートである。
【図９】図９は、図４（ａ）、図４（ｂ）、図４（ｃ）に示すコンピュータプログラムに含まれるステートメントを複数のプログラムブロックに分類した結果をまとめた表である。
【図１０】図１０は、図４（ａ）、図４（ｂ）、図４（ｃ）に示すコンピュータプログラムに含まれるステートメントから抽出された変数を登録した更新変数テーブルの一例を示す表である。
【図１１】図１１は、ステップＳ０５において特定される更新変数集合とグループ変数の一覧、および更新変数集合とグループ変数の対応関係を示す表である。
【図１２】図１２は、ステップＳ０６の詳細な処理手順の一例を示すフローチャートである。
【図１３】図１３は、図３のステップＳ０６の処理結果をまとめた「変数更新同時性一覧」を示す表である。
【図１４】図１４は、図３のステップＳ０７で抽出された更新漏れ箇所、ステップＳ０８で算出された結合度及びステップＳ０９で抽出された更新漏れ変数の集合を、グループ変数毎にまとめた表である。
【図１５】図１５は、ステップＳ１０で出力される判断結果の一例を示す表である。
【図１６】図１６は、検査対象となるコンピュータプログラムの例を示す図である。
【発明を実施するための形態】
【００１２】
図面を参照して、本発明の実施形態を説明する。図面の記載において同一部分には同一符号を付し説明を省略する。
【００１３】
［データ更新漏れ検査装置のハードウェア構成］
本発明の実施形態に係わるデータ更新漏れ検査装置は、例えば車両に搭載される電子制御装置（ＥＣＵ）により実行されるコンピュータプログラムのデータ更新漏れ検査処理に適用することができる。特に、１つの状態あるいは情報を表すために同時に更新される必要がある複数の変数に関して、変数の更新漏れの可能性を検査するものである。
【００１４】
図１を参照して、本発明の第１実施形態に係わるデータ更新漏れ検査装置のハードウェア構成を説明する。データ更新漏れ検査装置のハードウェア構成として、汎用のコンピュータを用いることができる。例えば、データ更新漏れ検査装置は、記憶媒体から検査対象のコンピュータプログラム（ソースコードＤ０１）及び検査に必要なデータ（エントリーポイント一覧Ｄ０２、ブロックセパレータ一覧Ｄ０３を含む）を読み込む入出力装置１２と、入出力装置１２で読み込んだソースコードＤ０１や解析の中間データを格納する記憶装置１４と、各種演算を実行してソースコードＤ０１を解析するＣＰＵ（中央処理装置）１１と、ユーザが解析に必要な情報を入力するための入力装置１３と、ＣＰＵ１１から出力される検査結果を表示する表示装置１５とを備える。検査結果は、入出力装置１２を用いて記憶媒体に書き込むことも可能である。記憶装置１４としてはメモリ、ハードディスクなどが挙げられ、記憶装置１４とＣＰＵ（中央処理装置）１１との間で、データの入出力が行われる。
【００１５】
また、データ更新漏れ検査装置は、クライアントサーバモデルとしても実現可能である。例えば、コンピュータネットワークを介して汎用のパーソナルコンピュータ（クライアント）をサーバに接続する。これにより、図１に示すＣＰＵ１１を備えるリモート環境に置かれたサーバを、コンピュータネットワークを介して、クライアントが備える入出力装置１２、入力装置１３、記憶装置１４、あるいは表示装置１５に接続することができる。この場合、データ更新漏れ検査装置は、主にＣＰＵ１１（サーバ）により構成され、入出力装置１２、入力装置１３、記憶装置１４、あるいは表示装置１５はデータ更新漏れ検査装置に含まれない。
【００１６】
図２を参照して、ＣＰＵ１１の機能的構成を説明する。ＣＰＵ１１を備えるコンピュータをデータ更新漏れ検査装置として機能させるためのコンピュータプログラム（データ更新漏れ検査プログラム）を、ＣＰＵ１１を備えるコンピュータにインストールして実行する。これにより、ＣＰＵ１１は、以下に示す各情報処理部として機能する。なお、ここでは、ソフトウェアによってデータ更新漏れ検査装置を実現する例を示すが、もちろん、以下に示す各情報処理を実行するための専用のハードウェアを用意して、データ更新漏れ検査装置を構成することも可能である。
【００１７】
ＣＰＵ１１は、ソースコード入力部２１、プログラムブロック分類部２２、更新変数抽出部２３、グループ変数特定部２４、同時性判断部２５、及び検査結果出力部２９として機能する。プログラムブロック分類部２２には、実行関数解析部３０と、プログラムブロック特定部３１とが含まれる。
【００１８】
ソースコード入力部２１は、検査対象となるコンピュータプログラム（ソースコードＤ０１）を入出力装置１２あるいは入力装置１３から読み取り、記憶装置１４に格納する。
【００１９】
実行関数解析部３０は、ソースコード入力部２１により読み込まれたソースコードＤ０１を解析する。具体的には、入出力装置１２あるいは入力装置１３から入力されるエントリーポイント一覧Ｄ０２を用いて、ソースコードＤ０１の中で、直接的および間接的に呼び出される関数を特定する。エントリーポイント一覧Ｄ０２については、図６を参照して後述する。
【００２０】
プログラムブロック特定部３１は、実行関数解析部３０で特定された関数の中に含まれるステートメントを、ブロックセパレータを区切れ目として分類する。プログラムブロック特定部３１は、ブロックセパレータ一覧Ｄ０３を参照して、ブロックセパレータを区切れ目としてステートメントを分類する。ブロックセパレータ一覧Ｄ０３は、入出力装置１２あるいは入力装置１３から入力される。ユーザがブロックセパレータ一覧Ｄ０３を入力としてデータ更新漏れ検査装置へ与えない場合、データ更新漏れ検査装置は、図５に示したブロックセパレータ一覧Ｄ０３をブロックセパレータのデフォルトの値として扱う。ユーザが入力として与えるか、デフォルトのブロックセパレータを使用するかは任意である。ブロックセパレータ一覧Ｄ０３については、図５を参照して後述する。「ステートメント」とは、ソースコード上の１行ごとの処理単位のことである。
【００２１】
上記した実行関数解析部３０及びプログラムブロック特定部３１の処理動作によって、プログラムブロック分類部２２は、ソースコードＤ０１に含まれる有効な総てのステートメントを、複数のプログラムブロックに分類することができる。ソースコードＤ０１に含まれる有効な総てのステートメントは、複数のプログラムブロックの少なくとも１つのプログラムブロックに属するものとして、もしくは複数のプログラムブロックのいずれか１つのみに属するものとして分類される。
【００２２】
更新変数抽出部２３は、プログラムブロックの中で更新される変数を抽出する。更新変数抽出部２３は、プログラムブロック分類部２２によって分類された複数のプログラムブロックに含まれる各プログラムブロックについて、上記した変数をそれぞれ抽出する。更新変数抽出部２３による処理は、プログラムブロック特定部３１による処理と同時に行うことができる。
【００２３】
グループ変数特定部２４は、プログラムブロック毎に、更新変数抽出部２３により抽出された変数（更新変数）を要素とする集合（更新変数集合）をプログラムブロックに対応させて特定し、複数の更新変数集合のうちの少なくとも１つをグループ変数として特定する。なお、実施形態では、複数のプログラムブロックに含まれる総てのプログラムブロックについて、上記したグループ変数を特定する場合について説明する。
【００２４】
同時性判断部２５は、プログラムブロック毎に、グループ変数特定部２４により特定された更新変数集合に属する要素と、グループ変数特定部２４により特定されたグループ変数に属する要素とを比較する。そして、更新変数集合とグループ変数の包含関係を用いて、同時性判断部２５は、プログラムブロック毎に、プログラムブロックの同時更新度合いを判断する。判断は、「完全」「一部」「無し」の３段階で行い、その判断の方法は後述する。
【００２５】
検査結果出力部２９は、少なくとも同時性判断部２５による判断結果を、データ更新漏れ検査結果Ｄ０４として表示装置１５あるいは入出力装置１２に挿入された記憶媒体へ出力する。データ更新漏れ検査結果Ｄ０４については、図１５を参照して後述する。
【００２６】
ＣＰＵ１１は、更新漏れ箇所抽出部２６として更に機能する。更新漏れ箇所抽出部２６は、同時更新度合いが一部であると同時性判断部２５により判断されたプログラムブロックを抽出する。検査結果出力部２９は、更新漏れ箇所抽出部２６により抽出されたプログラムブロックを特定する情報を、同時性判断部２５による判断結果に関連づけて出力する。
【００２７】
ＣＰＵ１１は、結合度算出部２７として更に機能する。結合度算出部２７は、同時更新度合いが一部または完全であると同時性判断部２５により判断されたプログラムブロックの数（一部重複ブロック数と完全重複ブロック数の和）を求める。さらに結合度算出部２７は、同時更新度合いが完全であると同時性判断部２５により判断されたプログラムブロックの数（完全重複ブロック数）を求める。そして、結合度算出部２７は、一部重複ブロック数と完全重複ブロック数の和に対する、完全重複ブロック数の割合（「結合度」）を算出する。検査結果出力部２９は、結合度算出部２７により算出された割合を、同時性判断部２５による判断結果に関連づけて出力する。
【００２８】
ＣＰＵ１１は、更新漏れ変数抽出部２８として更に機能する。更新漏れ変数抽出部２８は、複数のプログラムブロックの中に、同時更新度合いが一部であると同時性判断部２５により判断されたプログラムブロックがある場合、グループ変数の要素の中から、当該プログラムブロックに対応する更新変数集合に属さない要素を抽出する。検査結果出力部２９は、更新漏れ変数抽出部２８により抽出された要素を、判断結果に関連づけて出力する。
【００２９】
複数のプログラムブロックの中に、同時更新度合いが一部であると同時性判断部２５により判断されたプログラムブロックがない場合、検査結果出力部２９は、グループ変数を特定する情報として、そのグループ変数に属する変数の一覧を、判断結果に関連づけて出力する。
【００３０】
［データ更新漏れ検査装置により実行される情報処理の手順］
次に、図３〜図１５を参照して、本発明の実施形態に係わるデータ更新漏れ検査方法の一例として、図１及び図２に示すデータ更新漏れ検査装置によって実行される情報処理の手順を説明する。
【００３１】
図３のフローチャートを参照して説明する。先ず、ステップＳ０１において、ソースコード入力部２１は、検査対象となるソースコードＤ０１を例えば入出力装置１２から読み込み、記憶装置１４に格納する。なお、ソースコードＤ０１は、予め入出力装置１２を用いてユーザによりデータ更新漏れ検査装置内に読み込まれ、記憶装置１４に格納されていてもよい。この場合、ステップＳ０１の処理は不要である。図４（ａ）、図４（ｂ）、図４（ｃ）は、読み込まれたソースコードＤ０１として、Ｃ言語で記述されたコンピュータプログラムの一例を示す。検査対象となるコンピュータプログラムは、図４（ａ）、図４（ｂ）、図４（ｃ）に示す３つのファイルに跨って記述されている。図４（ａ）のファイル名は「File1.c」であり、図４（ｂ）のファイル名は「File2.c」であり、図４（ｃ）のファイル名は「File3.c」である。Ｃ言語で記述されたプログラムの一例において、各ファイルの左端部に記載された１から始まる連続番号は、各ファイルの「行番号」を示す。
【００３２】
コンピュータプログラムには、４つの関数が記述されている。図４（ａ）の「File1.c」の中に、関数「Task1」が記述されている。関数「Task1」は、２つの関数「Func1」及び関数「Func2」を呼び出して終了する。関数「Func1」は図４（ｂ）の「File2.c」の中に記述されている。関数「Func2」は図４（ｃ）の「File3.c」の中に記述されている。図４（ｃ）の「File3.c」の中に、関数「Func3」も記述されている。関数「Func3」は、関数「Task1」により呼び出されないため、実行されない関数である。また、コンピュータプログラム中の、「Sem_Lock(ID1)」とは「ID1」のセマフォによる保護区間の開始命令を示し、「Sem_UnLock(ID1)」とは「ID1」のセマフォによる保護区間の終了命令を示す。
【００３３】
次に、ステップＳ０２において、実行関数解析部３０は、エントリーポイント一覧Ｄ０２を用いて、ソースコードＤ０１の中で、直接的および間接的に呼び出される関数を特定する。特定された関数の各々には関数ＩＤが付される。図６の表は、エントリーポイント一覧Ｄ０２の一例を示す。「エントリーポイント」は、コンピュータプログラムが開始される箇所を示すものである。車両に搭載される電子制御装置（ＥＣＵ）により実行されるコンピュータプログラムにおいて、例えば、イグニッションスイッチのオン操作及びエアコンスイッチのオン操作に応じて、複数の異なるエントリーポイントが設定される場合がある。図６に示す表では、エントリーポイントとして関数「Task1」が規定されている。実行関数解析部３０は、先ず、関数「Task1」を特定し、次に、サブルーチンコールにより呼び出される関数「Func1」及び関数「Func2」を特定する。関数「Func3」は、関数「Task1」により呼び出されないため、実行関数解析部３０は、関数「Func3」を特定しない。実行関数解析部３０は、特定した関数「Task1」、「Func1」及び「Func2」に関数ＩＤとして、それぞれ関数ＩＤ＝１、関数ＩＤ＝２、関数ＩＤ＝３を付し、図７に示す実行関数テーブルに登録する。
【００３４】
次に、ステップＳ０３に進み、プログラムブロック特定部３１は、関数「Task1」、「Func1」及び「Func2」の中に含まれるステートメントを、ブロックセパレータを区切れ目としてプログラムブロック毎に分類する。分類されたプログラムブロックの各々にはブロックＩＤが付される。
【００３５】
上記したステップＳ０２の処理によって、実行関数解析部３０はソースコードＤ０１に含まれる関数のうちエントリーポイントを基点として呼び出されるすべての関数を特定することができる。さらに、ステップＳ０３の処理によって、プログラムブロック分類部２２は、ソースコードＤ０１に含まれる有効な総てのステートメントを読込み、ソースコードＤ０１に含まれる有効な総てのステートメントを、複数のプログラムブロックに分類することができる。
【００３６】
そして、ステップＳ０４に進み、更新変数抽出部２３は、プログラムブロック分類部２２によって分類された複数のプログラムブロックに含まれる各プログラムブロックについて、プログラムブロックの中で更新される変数を更新変数としてそれぞれ抽出する。
【００３７】
ここで、本例では、図３のフローチャートにおいて符号Ｆ０１に示すステップＳ０３及びステップＳ０４を同時に実行することができる。ここで図８のフローチャートを参照して、ステップＳ０３及びステップＳ０４の詳細な処理手順の一例を説明する。
【００３８】
先ず、ステップＳ１０１において、関数ＩＤを初期化する、すなわち、関数ＩＤ＝１に設定する。ステップＳ１０２において、ブロックＩＤを初期化する、すなわち、ブロックＩＤ＝１に設定する。ステップＳ１０３へ進み、プログラムブロック特定部３１は、ステップＳ１０１で初期化された関数ＩＤで特定される関数（対象関数）に含まれるステートメントをメモリ上に読み込む。
【００３９】
Ｓ１０４に進み、プログラムブロック特定部３１は、ブロックセパレータ一覧Ｄ０３を参照して、読み込んだステートメントのうち最初のステートメント（対象ステートメント）がブロックセパレータに合致するか否かを判断する。図５の表は、ブロックセパレータ一覧Ｄ０３の一例を示す。ブロックセパレータ一覧Ｄ０３には、セパレータＩＤ、処理の内容、及びソースコード記述（ブロックセパレータ）が記載されている。「ブロックセパレータ」には、ソースコードＤ０１の処理の節目となる命令、例えば分岐命令やジャンプ命令が含まれる。プログラムブロック特定部３１は、対象ステートメントが、図５の表に記載されたソースコード記述（ブロックセパレータ）に合致するか否かを判断する。
【００４０】
対象ステートメントがブロックセパレータに合致しない場合（ステップＳ１０４でＮＯ）、ステップＳ１０５に進み、対象ステートメントにブロックＩＤを付す。ステップＳ１０６に進み、更新変数抽出部２３は、対象ステートメントにおいて更新される変数を、「更新変数テーブル」に登録する。その後、ステップＳ１０９へ進む。
【００４１】
一方、対象ステートメントがブロックセパレータに合致する場合（ステップＳ１０４でＹＥＳ）、ステップＳ１０７に進み、次のステートメントがブロックセパレータに合致するか否かを判断する。次のステートメントがブロックセパレータに合致しない場合（ステップＳ１０７でＮＯ）、ステップＳ１０８でブロックＩＤをカウントアップしてから、ステップＳ１０９へ進む。一方、次のステートメントがブロックセパレータに合致する場合（ステップＳ１０７でＹＥＳ）、ステップＳ１０９へ直接進む。
【００４２】
ステップＳ１０９において、対象ステートメントが、対象関数に含まれる最後のステートメントでない場合（ステップＳ１０９でＮＯ）、次のステートメントを対象ステートメントに設定して（Ｓ１１０）、ステップＳ１０４へ戻る。ステップＳ１０９において、対象ステートメントが、対象関数に含まれる最後のステートメントである場合（ステップＳ１０９でＹＥＳ）、ステップＳ１１１へ進む。ステップＳ１１１において、対象関数が、図７に示す最後の関数でない場合（ステップＳ１１１でＮＯ）、ステップＳ１１２で関数ＩＤをカウントアップする。その後、対象関数を次の関数に設定し、設定された関数の先頭にステートメント読み出し箇所を設定して（ステップＳ１１３）、ステップＳ１０３へ戻る。対象関数が最後の関数、本実施形態においては図７で示す「Func2」である場合（ステップＳ１１１でＹＥＳ）、図８のフローチャートは終了する。
【００４３】
図９は、図４（ａ）、図４（ｂ）、図４（ｃ）に示すコンピュータプログラムに含まれるステートメントを複数のプログラムブロックに分類した結果をまとめた表である。各関数に含まれる総てのステートメントについて、関数ＩＤ、ファイル名、行番号、ステートメントの内容、及びブロックＩＤが関連づけされている。図８に示す処理を実行することにより、ブロックセパレータ直後のステートメントから次のブロックセパレータ直前のステートメントまでに同じブロックＩＤを付すことができる。ブロックセパレータ、又は、連続したブロックセパレータを跨ぐ時点で、ブロックＩＤをカウントアップする。ブロックセパレータ直後から次のブロックセパレータ直前までのステートメントを１つのプログラムブロックに属するステートメントとして登録することができる。全関数内の全ステートメントについて同様の処理を繰り返すことにより、プログラムブロック分類部２２は、解析対象となるソースコードＤ０１中の有効な全てのステートメントをプログラムブロックに分類することができる。
【００４４】
ステートメントの分類と同時に、更新変数抽出部２３は、検査対象のステートメントにおいて更新処理が行われる変数を抽出して、更新変数テーブルに登録する（Ｓ１０６）。図１０は、図４（ａ）、図４（ｂ）、図４（ｃ）に示すコンピュータプログラムに含まれるステートメントから抽出された変数を登録した更新変数テーブルの一例を示す表である。更新変数テーブルには、プログラムブロック分類部２２により分類されたプログラムブロック毎に、変数が登録されている。図１０に示すように、ステップＳ０４で抽出された変数は、抽出された順番で登録される。同じ変数が同一のプログラムブロック内で２回以上抽出された場合、当該変数は、２回以上重複して登録される。更新変数テーブルに登録された変数は、更新変数として取り扱われる。
【００４５】
解析対象となるソースコードＤ０１中の有効な全てのステートメントのプログラムブロックへの分類が完了したときには、ソースコードＤ０１中の有効な全てのステートメントにおける更新処理が行われる変数の抽出が完了する。完了時、抽出された変数は、プログラムブロック毎に分類された状態で、更新変数テーブルにすべて登録された状態となっている。更新変数テーブルは、記憶装置１４において格納されていても良いし、ＣＰＵ１１に搭載されているレジストリなどのメモリに格納されていても良い。
【００４６】
再び図３に戻りステップＳ０５に進む。ここでグループ変数特定部２４は、図１０に示す更新変数テーブルを用いて、プログラムブロック毎に、そのプログラムブロックの中で更新される変数（更新変数）を要素とする集合（「更新変数集合」と呼ぶ）を特定する。より詳細には、グループ変数特定部２４は、更新変数テーブルに登録された更新変数の登録の順番を整え、同じ更新変数の重複登録を排除することにより、プログラムブロックの各々について更新変数集合を特定する。各プログラムブロックに対応して特定された更新変数集合を、そのプログラムブロックを指し示すブロックＩＤを表す変数ｎを付して、以下、更新変数集合Ｑｎとして表す。更新変数集合Ｑｎは、変数ｎによって指定されるプログラムブロックにおいて更新される更新変数のみを要素としており、更新変数集合Ｑｎの要素は重複しない。なお変数ｎは自然数を取り、取りうる値の最大値は、ソースコード内のプログラムブロックの個数に等しい。
【００４７】
次に、更新変数集合Ｑｎを要素とする集合において、重複する要素（更新変数集合Ｑｎ）を排除して新たに集合を作成する。この集合の要素は、更新変数集合を要素として有する集合であることに注意する。この新たに作成された集合の要素を、以下では、グループ変数と呼ぶ。各グループ変数にはグループ変数ＩＤを表す変数ｉを付し、グループ変数Ｐｉとして表す。なお変数ｉは自然数を取り、取りうる値の最大値は、前述した重複を排除して新たに作成した集合の要素数に等しい。
【００４８】
図１１において、上記説明した更新変数集合Ｑｎおよびグループ変数Ｐｉのグループ変数特定部２４による特定についてより具体的に説明する。図１１の表に示す例では、更新変数集合Ｑｎとして、Ｑ１＝｛Ｘ、Ｙ、Ｚ｝、Ｑ２＝｛Ｘ、Ｚ｝、Ｑ３＝｛Ｘ、Ｙ、Ｚ｝、Ｑ４＝｛Ｗ、Ｘ、Ｚ｝が特定されている。ここで、ブロックＩＤがｎ＝１及びｎ＝３のときの更新変数集合Ｑ１とＱ３は、同一の更新変数のみを要素として有しているため、更新変数集合Ｑｎを要素とする集合において、更新変数集合Ｑ１と更新変数集合Ｑ３は重複した要素となっている。そのため、この例では更新変数集合Ｑ３を排除する。この作業によって新しく作成された集合の要素をグループ変数Ｐｉとして特定する。したがって、図１１の表に示す例では、グループ変数特定部２４は、グループ変数ＰｉとしてＰ１＝｛Ｘ、Ｙ、Ｚ｝、Ｐ２＝｛Ｘ、Ｚ｝、Ｐ３＝｛Ｗ、Ｘ、Ｚ｝の３つのグループ変数を特定されている。
【００４９】
ステップＳ０６に進み、同時性判断部２５は、ステップＳ０４でプログラムブロック毎に抽出された変数（更新変数集合Ｑｎに属する変数）と、ステップＳ０５で特定されたグループ変数に属する変数とを比較することで、ステップＳ０４で抽出された変数に更新漏れがあるか否かを判断する。換言すれば、同時性判断部２５は、各プログラムブロックに対して、グループ変数の同時更新度合い（同時性）を判断する。判断は、「完全」、「一部」、「無し」の３段階で行う。ここで、図１２のフローチャートを参照して、ステップＳ０６の詳細な処理手順の一例を説明する。
【００５０】
先ず、ステップＳ２０１において、ブロックＩＤを初期化する。すなわち、ｎ＝１に設定する。ステップＳ２０２において、ステップＳ０４においてプログラムブロック毎に抽出された変数の集合である更新変数集合Ｑｎを取得する。ステップＳ２０３において、グループ変数ＩＤを初期化する、すなわち、ｉ＝１に設定する。ステップＳ２０４において、ステップＳ０５において特定されたグループ変数Ｐｉを取得する。
【００５１】
ステップＳ２０５に進み、グループ変数Ｐｉが更新変数集合Ｑｎの部分集合であるか否かを判断する。グループ変数Ｐｉが更新変数集合Ｑｎの部分集合である場合（Ｓ２０５でＹＥＳ）、グループ変数Ｐｉに属する総ての要素（変数）が、更新変数集合Ｑｎに属する変数と重複する。よって、ステップＳ２０６において、同時性判断部２５は、同時更新度合いを「完全」と判断する。その後、ステップＳ２１０へ進む。
【００５２】
一方、更新変数集合Ｑｎに属さないグループ変数Ｐｉの要素（変数）がある場合、すなわちグループ変数Ｐｉが更新変数集合Ｑｎの部分集合でない場合（ステップＳ２０５でＮＯ）、ステップＳ２０７に進む。
【００５３】
ステップＳ２０７では、グループ変数Ｐｉと更新変数集合Ｑｎの共通部分が空集合（φ）で無いか否かを判断する。グループ変数Ｐｉと更新変数集合Ｑｎとの共通部分が空集合で無い場合（ステップＳ２０７でＹＥＳ）、ステップＳ２０８において、同時性判断部２５は、同時更新度合いを「一部」と判断する。つまり、ステップＳ２０７でＹＥＳの場合、グループ変数Ｐｉに属する一部の要素（変数）のみが、更新変数集合Ｑｎに属する変数と重複しており、更新変数集合Ｑｎに属さないグループ変数Ｐｉの要素が存在すると判断できる。よって、同時更新度合いを「一部」と判断する。その後、ステップＳ２１０へ進む。
【００５４】
更に、グループ変数Ｐｉと更新変数集合Ｑｎとの共通部分が空集合で有る場合（ステップＳ２０７でＮＯ）、ステップＳ２０９において、同時性判断部２５は、同時更新度合いを「無し」と判断する。つまり、ステップＳ２０７でＮＯの場合、グループ変数Ｐｉに属するいずれの要素（変数）も、更新変数集合Ｑｎに属する変数と重複していないと判断できる。よって、同時更新度合いを「無し」と判断する。その後、ステップＳ２１０へ進む。
【００５５】
ステップＳ２１０において、ステップＳ２０４で取得されたグループ変数Ｐｉが最後のグループ変数であるか否かを判断する。グループ変数Ｐｉが最後のグループ変数でなければ（ステップＳ２１０でＮＯ）、変数ｉをカウントアップして（ステップＳ２１１）、ステップＳ２０４へ戻る。グループ変数ＩＤを表す変数ｉの値が、その取りうる値の最大値に等しいとき、すなわちグループ変数Ｐｉが最後のグループ変数であるとき（ステップＳ２１０でＹＥＳ）、ステップＳ２１２に進み、ステップＳ２０２で取得された更新変数集合Ｑｎが最後の更新変数集合であるか否かを判断する。すなわち、最後のプログラムブロックに対して同時性判断を行ったか否かを判断する。更新変数集合Ｑｎが最後の更新変数集合でなければ（ステップＳ２１２でＮＯ）、変数ｎをカウントアップして（ステップＳ２１３）、ステップＳ２０２へ戻る。ブロックＩＤを表す変数ｎの値が、その取りうる値の最大値に等しいとき、すなわち更新変数集合Ｑｎが最後の更新変数集合であるとき（ステップＳ２１２でＹＥＳ）、図１２に示すフローチャートは終了する。このようにして、総てのプログラムブロック及び総てのグループ変数に関して、ステップＳ２０５〜Ｓ２０９の処理を実行することができる。
【００５６】
図１２を参照して説明したように、図３のステップＳ０６において、以下の処理を実行することができる。同時性判断部２５は、ステップＳ０４で抽出された変数を要素とする集合（更新変数集合Ｑｎ）と、ステップＳ０５で特定されたグループ変数Ｐｉとを比較する。そして、複数のプログラムブロックの中に、更新変数集合Ｑｎに属する変数がグループ変数Ｐｉに属する一部の変数のみと重複するプログラムブロックが有るか否かを判断することができる。
【００５７】
上述した処理内容をまとめると、同時性判断部２５は、更新変数集合Ｑｎとグループ変数Ｐｉの互いの包含関係によって、判断対象のプログラムブロックの同時更新度合いを判断する。
【００５８】
同時性判断部２５は、更新変数集合Ｑｎに属する変数がグループ変数Ｐｉに属する一部の変数のみと重複するプログラムブロックを、同時更新度合い「一部」と判断する。すなわち、グループ変数Ｐｉに属する一部の変数が、判断対象のプログラムブロックに対応する更新変数集合Ｑｎに属しており、グループ変数Ｐｉに属するその他の変数がその更新変数集合Ｑｎに属していない場合に、同時性判断部２５はそのプログラムブロックについて、同時更新度合い「一部」と判断する。
【００５９】
また、同時性判断部２５は、更新変数集合Ｑｎに属する変数がグループ変数Ｐｉに属する総ての変数と重複するプログラムブロックを、同時更新度合い「完全」と判断する。すなわち、グループ変数Ｐｉに属する全ての変数が、判断対象のプログラムブロックに対応する更新変数集合Ｑｎに属している場合に、同時性判断部２５はそのプログラムブロックについて、同時更新度合い「完全」と判断する。
【００６０】
また、同時性判断部２５は、更新変数集合Ｑｎに属する変数がグループ変数Ｐｉに属する何れの変数とも重複しないプログラムブロックを、同時更新度合い「無し」と判断する。すなわち、グループ変数Ｐｉに属する全ての変数が、判断対象のプログラムブロックに対応する更新変数集合Ｑｎに属していない場合に、同時性判断部２５はそのプログラムブロックについて、同時更新度合い「無し」と判断する。
【００６１】
図１３の表は、図３のステップＳ０６の処理結果をまとめた「変数更新同時性一覧」を示す。Ｑ１〜Ｑ４は更新変数集合を、Ｐ１〜Ｐ３はグループ変数をそれぞれ示しており、図１０、図１１で示すように、更新変数を要素としている。
【００６２】
図３に戻り、ステップＳ０７に進む。ステップＳ０７において、更新漏れ箇所抽出部２６は、ステップＳ０６で更新の漏れがあると判断されたプログラムブロックを抽出する。具体的には、ステップＳ０６で同時更新度合い「一部」と判断されたプログラムブロックを抽出する。
【００６３】
これにより、ステップＳ０４で抽出された変数がステップＳ０５で特定されたグループ変数Ｐｉに属する一部の要素のみと重複するプログラムブロックを抽出することができる。ここで同時更新度合いを「一部」と判断するステップＳ０６での方法によって理解されるように、「一部の要素のみと重複する」とは、ステップＳ０５で特定されたグループ変数Ｐｉに属する一部の変数がステップＳ０４で抽出された変数（抽出する対象のプログラムブロックに対応する更新変数集合Ｑｎに属する変数）と重複し、グループ変数Ｐｉに属する一部の変数以外のその他の変数がステップＳ０４で抽出された変数と重複しないことを意味する。
【００６４】
ここで、各グループ変数に対して、同時更新度合い「一部」と判断されたプログラムブロックのブロックＩＤを「更新漏れがあるブロックＩＤ」として定義すると、更新漏れ箇所を特定する情報として利用できる。
【００６５】
ステップＳ０８に進み、結合度算出部２７は、ステップＳ０６で同時更新度合い「完全」と判断されたプログラムブロックの数（完全重複ブロック数）を求める。そして、結合度算出部２７は、ステップＳ０６で同時更新度合い「一部」と判断されたプログラムブロックの数（一部重複ブロック数）を求める。完全重複ブロック数と一部重複ブロック数の和は、ステップＳ０４で抽出された変数がステップＳ０５で特定されたグループ変数に属する少なくとも一部の変数と重複するプログラムブロックの数を表しており、この和は、同時更新度合い「一部」あるいは「完全」と判断されたプログラムブロックの数を表している。結合度算出部２７は、この和に対する、同時更新度合い「完全」と判断されたプログラムブロックの数の割合を「結合度」として算出する。
【００６６】
すなわち、「結合度」の算出において、同時更新度合いが「一部」または「完全」と判断されたプログラムブロックの数のみを使用し、同時更新度合い「無し」と判断されたプログラムブロックの数を除いている。そのため、グループ変数の要素である更新変数に対して更新を行わないプログラムブロックの数は、「結合度」の算出に影響を及ぼさない。その結果、「結合度」は、グループ変数の要素である更新変数の少なくとも一部を更新するプログラムブロックのうち、グループ変数の要素である更新変数のすべてにアクセスするプログラムブロックの割合を示す指標となっている。
【００６７】
ステップＳ０９に進み、更新漏れ変数抽出部２８は、同時更新度合い「一部」と判断されたプログラムブロックにおいて、グループ変数に属する要素の中から、当該プログラムブロックに対応する更新変数集合に属さない要素を「更新漏れ変数」として抽出する。
【００６８】
ステップＳ１０に進み、検査結果出力部２９は、ステップＳ０６における、更新漏れがあるか否かの判断結果を出力する。この時、検査結果出力部２９は、ステップＳ０７で抽出されたプログラムブロックを特定する情報、ステップＳ０８で算出された結合度、及びステップＳ０９で特定された更新漏れ変数を特定する情報のうち少なくともいずれか１つを、ステップＳ０６における判断結果に関連づけて出力することができる。
【００６９】
更新漏れ変数を特定する情報として利用するため、ステップＳ０９において、「更新漏れ変数の集合Ｒ」を、グループ変数Ｐｉから更新変数集合Ｑｎを引いた差集合（Ｒ＝Ｐｉ＼Ｑｎ）として定義できる。すなわち、グループ変数Ｐｉに属し、更新変数集合Ｑｎに属さない要素の集合として「更新漏れ変数の集合Ｒ」を定義できる。
【００７０】
図１４の表は、図３のステップＳ０７で抽出された更新漏れ箇所、ステップＳ０８で算出された結合度及びステップＳ０９で抽出された更新漏れ変数を、グループ変数Ｐ１〜Ｐ３毎にまとめた表である。更新漏れ箇所は「更新漏れがあるブロックＩＤ」によって示されており、更新漏れ変数の一覧は、「更新漏れ変数の集合Ｒ」によって示されている。上述した「更新漏れがあるブロックＩＤ」および「更新漏れ変数の集合Ｒ」は、それぞれ更新漏れ箇所、更新漏れ変数を特定する情報の一例にすぎない。
【００７１】
図１５の表は、ステップＳ１０で出力される判断結果の一例を示す。検査結果出力部２９は、グループ変数Ｐ１〜Ｐ３毎に更新漏れがあるか否かの判断結果を出力する。「更新漏れの有無」は、更新漏れがあるか否かの判断結果を示す。図１５の表は、「結合度」、更新漏れ箇所を特定する情報としての「ブロックＩＤ」、「ファイル名」、及び「行数」、及び「更新漏れ変数」が、更新漏れがあるか否かの判断結果に関連づけて出力される例を示す。検査結果出力部２９は、少なくとも、グループ変数Ｐ１〜Ｐ３毎に更新漏れがあるか否かの判断結果を出力すればよい。
【００７２】
また、図１５の例では、結合度が１００％である、つまり更新漏れ箇所が無いグループ変数Ｐ２が出力されている。グループ変数Ｐ２に関して更新漏れ箇所が無い。つまり、複数のプログラムブロック（ブロックＩＤ：ｎ＝１〜４）の中に、グループ変数Ｐ２＝｛Ｘ、Ｚ｝との同時更新度合いが「一部」であると同時性判断部２５によって判断されたプログラムブロックが無い。この場合、検査結果出力部２９は、グループ変数Ｐ２を特定する情報、例えばグループ変数Ｐ２に属する変数｛Ｘ、Ｚ｝を、判断結果に関連づけて出力してもよい。
【００７３】
図１５に示す出力例に基づいて、ユーザは、図４（ａ）の９行目の後にＹの更新処理を実行するステートメントを追加することができる。またユーザは、図４（ｃ）の４行目に示すＷの更新処理についてのステートメントが誤りである可能性に気づいて、必要に応じてＷの更新処理からＹの更新処理へステートメントを変更する修正を加えることができる。
【００７４】
上述した図４（ａ）の９行目の後にステートメントの追加、及び図４（ｃ）の４行目に対する修正が行われたソースコードに対して、再度、本願発明であるデータ更新漏れ検査装置による検査を行った場合、図１５に示す更新漏れの有無で「有り」と示された箇所がすべて「無し」に変わることが分かる。その結果、グループ変数を構成する変数に対する更新漏れをなくすことができる。
【００７５】
［実施形態による効果］
コンピュータプログラムにおいて、２次元あるいは３次元の座標や住所録など、複数の変数によって一つの状態や情報が表現されるデータを扱う場合、複数の変数を一つのグループ変数として管理及びアクセスするのが一般的である。グループ変数を登録あるいは更新するときは、常にグループ変数に属する総ての要素（変数）を同時に登録あるいは更新する。なぜなら、変数同士の間で値の新鮮さに不整合が起きないようにするためである。ところが、一部の要素（変数）しか更新しない処理が実行されると、その後、グループ変数内で古い時点若しくは地点における更新情報を持つ要素（変数）と、新しい時点若しくは地点における更新情報を持つ要素（変数）が混在してしまう。結果的に、全体として不正な状態あるいは情報を表現することになる。
【００７６】
具体的な事例として、図１６に示すコンピュータプログラムの例を用いて説明する。コンピュータプログラム中の、「Sem_Lock(ID1)」とはID1により識別されるセマフォによる保護区間の開始命令、「Sem_UnLock(ID1)」とはID1により識別されるセマフォによる保護区間の終了命令である。図１６に示すコンピュータプログラムの例では、変数Ｘ、Ｙ、Ｚを要素とするグループ変数の更新を行っている。本来、総ての要素Ｘ、Ｙ、Ｚは常に同時にアクセスされるべきである。しかし、符号ＡＭ１に示すように２１行目で「Ｚ」の更新が漏れており、符号ＡＭ２に示すように２５行目で「Ｙ」の更新が漏れている。
【００７７】
本発明の実施形態に係わるデータ更新漏れ検査装置では、プログラムブロック分類部２２が検査対象となるコンピュータプログラムに含まれるステートメントを複数のプログラムブロックに分類し（図９）、更新変数抽出部２３がプログラムブロックの各々の中で更新される変数をそれぞれ抽出する（図１０）。そしてグループ変数特定部２４が、プログラムブロック毎に対応する更新変数集合を特定し、複数の更新変数集合のうちの少なくとも１つをグループ変数として特定する（図１１）。同時性判断部２５が、プログラムブロックに対応する更新変数集合と、グループ変数の包含関係を用いて、プログラムブロックの同時更新度合いを判断して（図１３）、検査結果出力部２９がその判断結果をデータ更新漏れ検査結果Ｄ０４として、入出力装置１２もしくは表示装置１５に出力する（図１５）。判断結果を出力することにより、複数のプログラムブロックの中で、グループ変数に含まれる総ての変数（変数）が同時に更新されないプログラムブロックが有るか否かをユーザ通知することができる。その結果、ユーザは変数の更新漏れの可能性があるプログラムブロックの存在に気づくことができる。
【００７８】
同時更新度合いが一部であると同時性判断部２５により判断されたプログラムブロックがある場合、複数のプログラムブロックの中で、グループ変数に含まれる総ての変数（変数）が同時に更新されないプログラムブロックが有ることになる。この場合、１つの状態あるいは情報を表すために同時に更新される必要がある複数の変数に関して、変数の更新漏れの可能性がある。よって、判断結果を出力することにより、意味的結合度の高い変数（即ち、グループ変数）のうち、一部の変数が同時にアクセスされない箇所があることを検出できる。そして正しくコーディングされていない箇所があることをユーザに気づかせることができる。また、膨大なソースコードから、人の目で判断できない変数の更新漏れをユーザに気づかせることができる。レガシーコードのような仕様書が整備されていないコードや、分散開発等により他拠点で開発されたコードなど、変数同士の意味的な結合関係に関する情報が乏しいケースにおいて、ソースコードから自動的に検出できる効果は大きい。
【００７９】
データ更新漏れ検査装置は、同時更新度合いが一部であると同時性判断部２５により判断されたプログラムブロックを抽出する（図１４）更新漏れ箇所抽出部２６を備える。更新漏れ箇所抽出部２６により抽出されたプログラムブロックを特定する情報を、前述した判断結果に関連づけて出力する（図１５）。複数のプログラムブロックの中で検証すべきプログラムブロックが特定されるので、ユーザによる検証作業の効率を高めることができる。
【００８０】
データ更新漏れ検査装置は、同時更新度合いが一部であると同時性判断部２５により判断されたプログラムブロックの数（一部重複ブロック数）と同時更新度合いが完全であると同時性判断部２５により判断されたプログラムブロックの数（完全重複ブロック数）の和に対する、同時更新度合いが完全であると同時性判断部２５により判断されたプログラムブロックの数（完全重複ブロック数）の割合を結合度として算出する（図１４）結合度算出部２７を備える。そして、結合度算出部２７により算出された割合（結合度）を、前述した判断結果に関連づけて出力する（図１５）。そのため、変数の更新漏れの可能性を数値化することができる。ソースコードから自動的に変数同士の意味的結合度を測定することが可能になる。抽出された変数がグループ変数に属する一部の要素のみと重複するプログラムブロックがある場合において、割合（結合度）が高い程、つまり、１００％に近い程、変数の更新漏れの可能性が高まる。変数の更新漏れの可能性がある箇所として、複数の集合あるいは複数のプログラムブロックを特定する情報が出力される場合、検証対象としての優先度をユーザに伝えることができるので、ユーザによる検証作業の効率を高めることができる。結合度が１００％未満だが極めて１００％に近い値のグループ変数を点検することで、レガシーコードの移植ミスや、分散開発されたソースコードの結合ミスにより、一部の要素（変数）の更新が欠落してしまうような問題を、効率よく発見できる。
【００８１】
データ更新漏れ検査装置は、複数のプログラムブロックの中に、同時更新度合いが一部であると同時性判断部２５により判断されたプログラムブロックがある場合、グループ変数の要素の中から、当該プログラムブロックに対応する更新変数集合に属さない要素を抽出する（図１４）更新漏れ変数抽出部２８を備える。そして、更新漏れ変数抽出部２８により抽出された変数を、判断結果に関連づけて出力する（図１５）。そのため、更新漏れの可能性がある要素（変数）を特定することができる。ユーザは検証すべき箇所を容易に特定できるので、ユーザによる検証作業の効率を高めることができる。
【００８２】
データ更新漏れ検査装置は、複数のプログラムブロックの中に、同時更新度合いが一部であると同時性判断部２５により判断されたプログラムブロックがない場合、グループ変数を特定する情報を、前述した判断結果に関連づけて出力する。そのため、検査対象となるコンピュータプログラムにおいて、変数の更新漏れが無い要素（変数）の集合を特定することができる。よって、コンピュータプログラムの仕様として維持あるいは管理するべき情報として有用性の高い情報を容易に得ることができる。
【００８３】
以上、本発明の実施形態について説明したが、これらの実施形態は本発明の理解を容易にするために記載された単なる例示に過ぎず、本発明は当該実施形態に限定されるものではない。本発明の技術的範囲は、上記実施形態で開示した具体的な技術事項に限らず、そこから容易に導きうる様々な変形、変更、代替技術なども含むものである。この開示から当業者には様々な代替実施の形態、実施例及び運用技術が明らかとなろう。
【００８４】
本出願は、２０１３年１月２１日に出願された日本国特許願第２０１３−００８３５３号に基づく優先権を主張しており、この出願の全内容が参照により本明細書に組み込まれる。
【産業上の利用可能性】
【００８５】
本発明によれば、プログラムブロックの中で更新される変数を抽出して、そのプログラムブロックに対応する更新変数集合を特定し、その更新変数集合の中から少なくとも１つをグループ変数として特定する。そして更新変数集合とグループ変数の包含関係を用いることで、プログラムグループ毎にグループ変数に対する同時更新度合いを判断する。判断結果を出力することにより、１つの状態あるいは情報を表すために同時に更新される必要がある複数の変数に関して、変数の更新漏れの可能性をユーザに気づかせることができる。
【符号の説明】
【００８６】
２１  ソースコード入力部
２２  プログラムブロック分類部
２３  更新変数抽出部
２４  グループ変数特定部
２５  同時性判断部
２６  更新漏れ箇所抽出部
２７  結合度算出部
２８  更新漏れ変数抽出部
２９  検査結果出力部
３０  実行関数解析部
３１  プログラムブロック特定部
Ｄ０１  ソースコード（コンピュータプログラム）
Ｄ０２  エントリーポイント一覧
Ｄ０３  ブロックセパレータ一覧
Ｄ０４  データ更新漏れ検査結果
Ｐｉ  グループ変数
Ｑｎ  更新変数集合
【図１】
0005967225.tif 000002
【図２】
0005967225.tif 000003
【図３】
0005967225.tif 000004
【図４】
0005967225.tif 000005
【図５】
0005967225.tif 000006
【図６】
0005967225.tif 000007
【図７】
0005967225.tif 000008
【図８】
0005967225.tif 000009
【図９】
0005967225.tif 000010
【図１０】
0005967225.tif 000011
【図１１】
0005967225.tif 000012
【図１２】
0005967225.tif 000013
【図１３】
0005967225.tif 000014
【図１４】
0005967225.tif 000015
【図１５】
0005967225.tif 000016
【図１６】
0005967225.tif 000017