(57)【特許請求の範囲】
【請求項１】
２つの値のみを設定可能なフラグを用いて２以上の異なる処理を切り替えて実行するコンピュータプログラムを検査するフラグアクセス不具合検査装置であって、
検査対象となる前記コンピュータプログラムの中から、前記フラグを検出するフラグ検出部と、
前記コンピュータプログラムの中で、前記フラグ検出部により検出された前記フラグにアクセスするステートメントを特定するアクセス箇所特定部と、
前記アクセス箇所特定部により特定された前記ステートメントにおける前記フラグに対する処理内容を分類する処理内容分類部と、
前記アクセス箇所特定部により特定された前記ステートメントの実行順序を特定するアクセス順序特定部と、
前記処理内容分類部により分類された前記フラグに対する処理内容、及び前記アクセス順序特定部により特定された前記ステートメントの実行順序に基づいて、前記フラグを用いて２以上の異なる処理を切り替えて実行できない可能性の有無を判断する不具合可能性判断部と、
前記不具合可能性判断部による判断結果を出力する検査結果出力部と
を備えることを特徴とするフラグアクセス不具合検査装置。
【請求項２】
請求項１に記載のフラグアクセス不具合検査装置であって、
前記処理内容分類部は、前記フラグに対する処理内容を、前記フラグに第１の値を書き込む処理、前記フラグに前記第１の値とは異なる第２の値を書き込む処理、或いは前記フラグの値を読み出す処理のいずれかに分類することを特徴とするフラグアクセス不具合検査装置。
【請求項３】
請求項２に記載のフラグアクセス不具合検査装置であって、
前記不具合可能性判断部は、前記コンピュータプログラムの中に、前記フラグに第１の値を書き込む処理を記述した第１のステートメント、前記フラグに前記第２の値を書き込む処理を記述した第２のステートメント、及び前記フラグの値を読み出す処理を記述した第３のステートメントの総てが含まれているか否かを判定し、前記第１〜第３のステートメントの総てが含まれていない場合、前記フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する
ことを特徴とするフラグアクセス不具合検査装置。
【請求項４】
請求項２又は３に記載のフラグアクセス不具合検査装置であって、
前記不具合可能性判断部は、前記フラグに第１の値を書き込む処理を記述した第１のステートメント或いは前記フラグに第２の値を書き込む処理を記述した第２のステートメントが実行された後に、前記フラグの値を読み出す処理を記述した第３のステートメントが実行されることなく、再び前記第１のステートメント或いは前記第２のステートメントが実行されるか否かを判定し、前記第３のステートメントが実行されることなく、再び前記第１のステートメント或いは前記第２のステートメントが実行される場合、前記フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する
ことを特徴とするフラグアクセス不具合検査装置。
【請求項５】
請求項２〜４のいずれか一項に記載のフラグアクセス不具合検査装置であって、
前記コンピュータプログラムに含まれるステートメントの中から、所定の条件文に基づいて分岐する一群のステートメントからなる分岐ブロックを特定する分岐ブロック特定部を更に備え、
前記不具合可能性判断部は、前記分岐ブロックの各々の中で、前記フラグに第１の値を書き込む処理を記述した第１のステートメント及び前記フラグに第２の値を書き込む処理を記述した第２のステートメントの両方のステートメントが実行されているか否かを判定し、前記両方のステートメントが実行されている場合、前記フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する
ことを特徴とするフラグアクセス不具合検査装置。
【請求項６】
請求項２〜５のいずれか一項に記載のフラグアクセス不具合検査装置であって、
前記コンピュータプログラムに含まれるステートメントの中から、所定の条件文に基づいて分岐する一群のステートメントからなる分岐ブロックを特定する分岐ブロック特定部を更に備え、
前記不具合可能性判断部は、前記フラグの値を読み出す処理を記述した第３のステートメントが実行された後に、前記第３のステートメントと同じ分岐ブロックの中で、前記フラグの値を書き換えるステートメントが実行されているか否かを判定し、前記フラグの値を書き換えるステートメントが実行されていない場合、前記フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する
ことを特徴とするフラグアクセス不具合検査装置。
【請求項７】
２つの値のみを設定可能なフラグを用いて２以上の異なる処理を切り替えて実行するコンピュータプログラムを検査するフラグアクセス不具合検査方法であって、
検査対象となる前記コンピュータプログラムの中から、前記フラグを検出し、
前記コンピュータプログラムの中で、検出された前記フラグにアクセスするステートメントを特定し、
特定された前記ステートメントにおける前記フラグに対する処理内容を分類し、
特定された前記ステートメントの実行順序を特定し、
分類された前記フラグに対する処理内容、及び特定された前記ステートメントの実行順序に基づいて、前記フラグを用いて２以上の異なる処理を切り替えて実行できない可能性の有無を判断し、
前記判断の結果を出力する
ことを特徴とするフラグアクセス不具合検査方法。
【請求項８】
２つの値のみを設定可能なフラグを用いて２以上の異なる処理を切り替えて実行するコンピュータプログラムを検査するためのフラグアクセス不具合検査プログラムであって、
コンピュータに、
検査対象となる前記コンピュータプログラムの中から、前記フラグを検出する機能と、
前記コンピュータプログラムの中で、検出された前記フラグにアクセスするステートメントを特定する機能と、
特定された前記ステートメントにおける前記フラグに対する処理内容を分類する機能と、
特定された前記ステートメントの実行順序を特定する機能と、
分類された前記フラグに対する処理内容、及び特定された前記ステートメントの実行順序に基づいて、前記フラグを用いて２以上の異なる処理を切り替えて実行できない可能性の有無を判断する機能と、
前記判断の結果を出力する機能と
を実現させることを特徴とするフラグアクセス不具合検査プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、フラグアクセス不具合検査装置、フラグアクセス不具合検査方法、フラグアクセス不具合検査プログラムに関するものである。
【背景技術】
【０００２】
従来から、プログラミング言語で記述されたソースプログラムにおける制御の流れやデータの流れを、そのソースプログラムを実行すること無しに解析する、静的解析方法が知られている（特許文献１参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平０９−２８２１７３号公報
【発明の概要】
【０００４】
特許文献１の静的解析方法によれば、入力と出力の関係を明確にしてプログラムの構造を可視化することはできる。しかし、可視化されたプログラムの構造のうち、不具合の可能性がある箇所をユーザに気づかせることはできない。
【０００５】
本発明は、上記課題に鑑みて成されたものであり、その目的は、プログラムの構造のうち、不具合の可能性がある箇所をユーザに気づかせることができるフラグアクセス不具合検査装置、フラグアクセス不具合検査方法、フラグアクセス不具合検査プログラムを提供することである。
【０００６】
本発明の一態様に係わるフラグアクセス不具合検査装置は、２つの値のみを設定可能なフラグを用いて２以上の異なる処理を切り替えて実行するコンピュータプログラムの中から、フラグを検出し、フラグにアクセスするステートメント、当該ステートメントにおけるフラグに対する処理内容、及び当該ステートメントの実行順序をそれぞれ特定する。そして、フラグに対する処理内容、及びステートメントの実行順序に基づいて、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性の有無を判断し、その判断結果を出力する。
【図面の簡単な説明】
【０００７】
【図１】図１は、本発明の実施形態に係わるフラグアクセス不具合検査装置のハードウェア構成を示すブロック図である。
【図２】図２は、ＣＰＵ１１の機能的構成を示すブロック図である。
【図３】図３は、本発明の実施形態に係わるフラグアクセス不具合検査装置によって実行される情報処理の流れ及び情報処理の途中で生成される中間データを示すデータフロー図である。
【図４】図４（ａ）〜（ｇ）は、読み込まれたソースコードＤ０１としてＣ言語で記述されたコンピュータプログラムの一例を示す図である。
【図５】図５は、変数検出処理（Ｓ０１）により検出された変数の一覧である「変数アクセス一覧（ＤＯ２）」を示す表である。
【図６】図６は、フラグ抽出処理（Ｓ０２）により抽出されたフラグの一覧である「フラグ一覧（ＤＯ３）」を示す表である。
【図７】図７（ａ）〜（ｇ）は、分岐ブロック特定部２２により特定された分岐ブロックＩＤ１〜ＩＤ４を示す図である。
【図８】図８は、上記した分岐ブロック特定処理（Ｓ０３）により特定された分岐ブロックの一覧である「ブロックＩＤ一覧（ＤＯ４）」を示す表である。
【図９】図９は、フラグにアクセスするステートメントが属する分岐ブロックの一覧である「フラグアクセス一覧（Ｄ０５）」を示す表である。
【図１０】図１０は、フラグに対する処理内容の分類結果である「フラグ判定一覧（Ｄ０６）」を示す表である。
【図１１】図１１（ａ）〜（ｄ）は、分岐ブロックＩＤ１〜ＩＤ４の各々について、各ステートメントの実行順序を特定した結果である「ステートメント番号割付一覧（Ｄ０７）」を示す表である。
【図１２】図１２は、フラグアクセス順序特定処理（Ｓ０７）の結果である「フラグアクセス順序一覧（Ｄ０８）」を示す表である。
【図１３】図１３（ａ）、（ｂ）は、フラグ（Flag）の状態に応じて２つの処理（処理１及び処理２）を切り替えて実行する正常なコンピュータプログラムの事例を示すフローチャートである。
【図１４】図１４（ａ）、（ｂ）は、第１不具合パターン判定処理（Ｓ０８）によって検出できる不具合の事例を示すフローチャートである。
【図１５】図１５（ａ）、（ｂ）は、第２不具合パターン判定処理（Ｓ０９）によって検出できる不具合の事例を示すフローチャートである。
【図１６】図１６（ａ）、（ｂ）は、第３不具合パターン判定処理（Ｓ１０）によって検出できる不具合の事例を示すフローチャートである。
【図１７】図１７（ａ）〜（ｃ）は、フラグ（Flag）の状態に応じて３つの処理（処理１、処理２、及び処理３）を切り替えて実行する正常なコンピュータプログラムの事例を示すフローチャートである。
【図１８】図１８（ａ）〜（ｃ）は、第４不具合パターン判定処理（Ｓ１１）によって検出できる不具合の事例を示すフローチャートである。
【図１９】図１９は、「第１不具合パターン判定結果（Ｄ０９）」を示す表である。
【図２０】図２０は、「第２不具合パターン判定結果（Ｄ１０）」を示す表である。
【図２１】図２１は、「第３不具合パターン判定結果（Ｄ１１）」を示す表である。
【図２２】図２２は、「第４不具合パターン判定結果（Ｄ１２）」を示す表である。
【図２３】図２３は、「判断結果一覧（Ｄ１３）」の一例を示す表である。
【図２４】図２４（ａ）〜（ｇ）は、図２３に示す判断結果一覧（Ｄ１３）に基づいて、図４（ａ）〜（ｇ）に示すコンピュータプログラムを修正した結果を示す図である。
【図２５】図２５（ａ）〜（ｇ）は、フラグに書き込んでいる値が間違えているコンピュータプログラムの一例を示す図である。
【図２６】図２６は、図２５（ａ）〜（ｇ）に示すコンピュータプログラムを検査対象とした場合の「判断結果一覧（Ｄ１３）」の一例を示す表である。
【図２７】図２７（ａ）〜（ｇ）は、フラグにアクセスする処理が記述された箇所が間違えているコンピュータプログラムの一例を示す図である。
【図２８】図２８は、図２７（ａ）〜（ｇ）に示すコンピュータプログラムを検査対象とした場合の「判断結果一覧（Ｄ１３）」の一例を示す表である。
【発明を実施するための形態】
【０００８】
図面を参照して、本発明の実施形態を説明する。図面の記載において同一部分には同一符号を付し説明を省略する。
【０００９】
［フラグアクセス不具合検査装置のハードウェア構成］
本発明の実施形態に係わるフラグアクセス不具合検査装置は、例えば車両に搭載される電子制御装置（ＥＣＵ）により実行されるコンピュータプログラムのフラグアクセス不具合検査処理に適用することができる。特に、２つの値のみを設定可能なフラグを用いて２以上の異なる処理を切り替えて実行するコンピュータプログラムにおける、フラグのコーディング間違い或いはコーディング漏れの可能性を検査することができる。
【００１０】
図１を参照して、本発明の実施形態に係わるフラグアクセス不具合検査装置のハードウェア構成を説明する。フラグアクセス不具合検査装置のハードウェア構成として、汎用のコンピュータを用いることができる。例えば、フラグアクセス不具合検査装置は、記憶媒体から検査対象となるコンピュータプログラム（ソースコードＤ０１）を読み込む入出力装置１２と、入出力装置１２で読み込んだソースコードＤ０１や解析の途中で生成される中間データを一時的に記憶する記憶部１４と、各種演算を実行してソースコードＤ０１を解析するＣＰＵ（中央処理装置）１１と、ユーザが解析に必要な情報を入力するための入力装置１３と、ＣＰＵ１１から出力される検査結果を表示する表示装置１５とを備える。検査結果は、入出力装置１２を用いて記憶媒体に書き込むことも可能である。
【００１１】
また、フラグアクセス不具合検査装置は、クライアントサーバモデルとしても実現可能である。例えば、汎用のパーソナルコンピュータ（クライアント）をコンピュータネットワークを介してサーバに接続する。これにより、図１に示すＣＰＵ１１を備えるサーバを、コンピュータネットワークを介して、入出力装置１２、入力装置１３、記憶部１４、或いは表示装置１５に接続することができる。この場合、フラグアクセス不具合検査装置は、主にＣＰＵ１１（サーバ）により構成され、入出力装置１２、入力装置１３、記憶部１４、或いは表示装置１５はフラグアクセス不具合検査装置に含まれない。この場合、解析の途中で生成される中間データは、記憶部１４の代わりに、サーバ１１が備える内部ハードディスクに一時的に格納すればよい。
【００１２】
図２を参照して、ＣＰＵ１１の機能的構成を説明する。ＣＰＵ１１を備えるコンピュータをフラグアクセス不具合検査装置として機能させるためのコンピュータプログラム（フラグアクセス不具合検査プログラム）を、ＣＰＵ１１を備えるコンピュータにインストールして実行する。これにより、ＣＰＵ１１は、以下に示す各情報処理部を構成する。なお、ここでは、ソフトウェアによってフラグアクセス不具合検査装置を実現する例を示すが、もちろん、以下に示す各情報処理を実行するための専用のハードウェアを用意して、フラグアクセス不具合検査装置を構成することも可能である。
【００１３】
ＣＰＵ１１は、フラグ検出部２１、分岐ブロック特定部２２、アクセス箇所特定部２３、処理内容分類部２４、アクセス順序特定部２５、不具合可能性判断部２６及び検査結果出力部２７を構成する。フラグ検出部２１には、変数検出部２８と、フラグ抽出部２９とが含まれる。不具合可能性判断部２６には、第１不具合パターン判定部３０と、第２不具合パターン判定部３１と、第３不具合パターン判定部３２と、第４不具合パターン判定部３３とが含まれる。
【００１４】
フラグ検出部２１は、記憶部１４からソースコードＤ０１を読み込み、ソースコードＤ０１の中から、フラグを検出する。「フラグ」とは、ソースコードＤ０１の中でアクセスされている変数のうち、例えば「０」及び「１」等、２つの値のみを設定可能な変数である。「ソースコードＤ０１の中でアクセスされている変数」とは、ソースコードＤ０１の中で書き込み処理或いは読み出し処理の対象として記述された変数を示す。「変数」とは、ＲＡＭ領域に割り当てられているローカル変数、グローバル変数、スタティック（Static）変数など、ソースコードＤ０１の中でその値の変更が可能なシンボルである。具体的に、変数検出部２８は、ソースコードＤ０１の中でアクセスされている変数を検出する。検出された変数は、記憶部１４に一時的に記憶される。フラグ抽出部２９は、記憶部１４に記憶されている変数を読み出し、変数検出部２８により検出された変数の中から、フラグを抽出する。フラグ検出部２１により抽出されたフラグは、記憶部１４に一時的に記憶される。
【００１５】
分岐ブロック特定部２２は、記憶部１４からソースコードＤ０１を読み込み、ソースコードＤ０１に含まれるステートメントの中から、所定の条件文に基づいて分岐する一群のステートメントからなる分岐ブロックを特定する。「所定の条件文」には、例えばＣ言語の場合、if文或いはswitch文が含まれる。「所定の条件文に基づいて分岐する一群のステートメント」とは、例えばＣ言語の場合、if文或いはswitch文、及びその後に続くブラケット”{”,”}”で囲まれた処理単位を指す。予め、条件分岐と判定できる箇所として例えば「if」及び「switch」を定めておく。分岐ブロック特定部２２は、解析対象となるソースコードＤ０１の中から、条件分岐と判定できる箇所を特定し、その後に続く“{”と“}”で囲まれた処理単位を分岐ブロックとして特定する。分岐ブロック特定部２２により特定された分岐ブロックは、記憶部１４に一時的に記憶される。
【００１６】
アクセス箇所特定部２３は、記憶部１４からソースコードＤ０１及びフラグ検出部２１により抽出されたフラグを読み込む。そして、アクセス箇所特定部２３は、ソースコードＤ０１の中で、フラグ検出部２１により検出されたフラグにアクセスするステートメントを特定する。すなわち、アクセス箇所特定部２３は、フラグへのアクセス箇所を特定する。特定されたステートメントを示す情報は、記憶部１４に一時的に記憶される。
【００１７】
処理内容分類部２４は、ステートメントを示す情報を記憶部１４から読み込み、アクセス箇所特定部２３により特定されたステートメントにおけるフラグに対する処理内容を分類する。処理内容分類部２４は、フラグに対する処理内容を、フラグに対する書き込み処理、或いはフラグに対する読み出し処理に分類する。更に、処理内容分類部２４は、フラグに対する書き込み処理を、フラグに第１の値を書き込む処理、或いはフラグに第１の値とは異なる第２の値を書き込む処理に分類する。「第１の値」及び「第２の値」は、例えば「０」及び「１」等、フラグに対して設定可能な２つの値を示す。処理内容の分類結果は、記憶部１４に一時的に記憶される。
【００１８】
アクセス順序特定部２５は、ステートメントを示す情報を記憶部１４から読み込み、アクセス箇所特定部２３により特定されたステートメントの実行順序を特定する。具体的に、アクセス順序特定部２５は、検査対象となるソースコードＤ０１からステートメントを１行ずつ読み込み、各ステートメントの実行順序を特定する。アクセス順序特定部２５は、アクセス箇所特定部２３により特定されたフラグへのアクセス箇所（ステートメント）と、各ステートメントの実行順序とに基づいて、フラグにアクセスするステートメントの実行順序を特定する。特定された実行順序は、記憶部１４に一時的に記憶される。
【００１９】
不具合可能性判断部２６は、処理内容の分類結果、及び特定された実行順序を記憶部１４から読み込む。そして、不具合可能性判断部２６は、処理内容分類部２４により分類されたフラグに対する処理内容、及びアクセス順序特定部２５により特定されたステートメントの実行順序に基づいて、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性の有無を判断する。具体的に、不具合可能性判断部２６は、第１不具合パターン判定部３０、第２不具合パターン判定部３１、第３不具合パターン判定部３２、第４不具合パターン判定部３３のうち少なくとも１つの判定部による判定結果に応じて、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性の有無を判断する。
【００２０】
第１不具合パターン判定部３０は、ソースコードＤ０１の中に、フラグに第１の値を書き込む処理を記述した第１のステートメント、フラグに第２の値を書き込む処理を記述した第２のステートメント、及びフラグの値を読み出す処理を記述した第３のステートメントの総てが含まれているか否かを判定する。ソースコードＤ０１の中に、第１〜第３のステートメントの総てが含まれていないと第１不具合パターン判定部３０が判断した場合、不具合可能性判断部２６は、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する。
【００２１】
第２不具合パターン判定部３１は、第１のステートメント或いは第２のステートメントが実行された後に、第３のステートメントが実行されることなく、再び第１のステートメント或いは第２のステートメントが実行されるか否かを判定する。第１のステートメント或いは第２のステートメントが実行された後に、第３のステートメントが実行されることなく、再び第１のステートメント或いは第２のステートメントが実行されると第２不具合パターン判定部３１が判定した場合、不具合可能性判断部２６は、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する。
【００２２】
第３不具合パターン判定部３２は、分岐ブロックの各々の中で、第１のステートメント及び第２のステートメントの両方のステートメントが実行されているか否かを判定する。両方のステートメントが実行されていると第３不具合パターン判定部３２が判定した場合、不具合可能性判断部２６は、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する。
【００２３】
第４不具合パターン判定部３３は、第３のステートメントが実行された後に、第３のステートメントと同じ分岐ブロックの中で、フラグの値を書き換えるステートメントが実行されているか否かを判定する。具体的に、第４不具合パターン判定部３３は、フラグに第１の値が設定されている状態において第２のステートメントが実行されているか否か、或いは、フラグに第２の値が設定されている状態においてフラグに第１のステートメントが実行されているか否か、を判定する。第３のステートメントが実行された後に、第３のステートメントと同じ分岐ブロックの中で、フラグの値を書き換えるステートメントが実行されていないと第４不具合パターン判定部３３が判定した場合、不具合可能性判断部２６は、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する。
【００２４】
検査結果出力部２７は、不具合可能性判断部２６による判断結果を、表示装置１５或いは入出力装置１２に挿入された記憶媒体へ出力する。
【００２５】
［フラグアクセス不具合検査装置により実行される情報処理の手順］
次に、図３〜図２４を参照して、本発明の実施形態に係わるフラグアクセス不具合検査方法の一例として、図１及び図２に示すフラグアクセス不具合検査装置によって実行される情報処理の手順を説明する。
【００２６】
先ず、ＣＰＵ１１は、検査対象となるソースコードＤ０１を入出力装置１２から読み込む。なお、ソースコードＤ０１は、予め入出力装置１２を用いてユーザによりフラグアクセス不具合検査装置内に読み込まれ、記憶部１４に格納されていてもよい。図４（ａ）〜（ｇ）は、読み込まれたソースコードＤ０１として、Ｃ言語で記述されたコンピュータプログラムの一例を示す。検査対象となるコンピュータプログラムは、図４（ａ）〜（ｇ）に示す７つのファイルに跨って記述されている。図４（ａ）のファイル名は「Task1.c」であり、図４（ｂ）のファイル名は「Task2.c」であり、図４（ｃ）のファイル名は「Task3.c」であり、図４（ｄ）のファイル名は「Task4.c」であり、図４（ｅ）のファイル名は「foo.c」であり、図４（ｆ）のファイル名は「calc.c」であり、図４（ｇ）のファイル名は「output.c」である。Ｃ言語で記述されたプログラムの一例において、各ファイルの左端部に記載された１から始まる連続番号は、各ファイルの「行番号」を示す。
【００２７】
変数検出部２８は、図３に示す「変数検出」処理（Ｓ０１）を実行する。変数検出処理（Ｓ０１）では、ソースコードＤ０１の中でアクセスされている変数を検出して、「変数アクセス一覧」（Ｄ０２）を生成する。図５の表は、上記した変数検出処理（Ｓ０１）により検出された変数の一覧を示す「変数アクセス一覧（ＤＯ２）」の一例である。図５の表の中では、検出された変数名、変数の種類、ファイル名、行番号、タスク名、ステートメント、Ｒ／Ｗ、及び変数の値を出力する。上記した項目のうち、ファイル名、行番号、タスク名、及びステートメントは、変数へのアクセス箇所を示す項目である。Ｒ／Ｗのうち、「Ｗ」は変数に書き込みを行っていることを示し、「Ｒ」は変数の読み出しを行っていることを示す。変数の値として、「val」は変数に設定される値が可変であることを示し、「L」は変数がローカル変数であることを示す。「変数アクセス一覧」（Ｄ０２）は、記憶部１４に一時的に記憶される。
【００２８】
フラグ抽出部２９は、「フラグ抽出」処理（Ｓ０２）を実行する。フラグ抽出処理（Ｓ０２）では、記憶部１４から「変数アクセス一覧」（Ｄ０２）を読み込み、検出された変数の中から、以下の（１）〜（５）の条件を総て満たす変数をフラグとして抽出して、「フラグ一覧」（Ｄ０３）を生成する。
【００２９】
（１）グローバル（global）変数若しくはスタティック（static）変数である。
【００３０】
（２）算術演算に使われていない。
【００３１】
（３）固定値ではある。
【００３２】
（４）少なくとも一回の書き込みがある。
【００３３】
（５）「０」へのクリア、及び「１」へのセットなど、予め定めた２つの値への書き込み処理は有るが、それ以外の値への書き込み処理は無い。
【００３４】
図６の表は、上記したフラグ抽出処理（Ｓ０２）により抽出されたフラグの一覧を示す「フラグ一覧（ＤＯ３）」の一例である。図６の例では、図５に示す変数のうち、変数「val」及び変数「F1」がフラグとして抽出されている。このように、変数検出処理（Ｓ０１）及びフラグ抽出処理（Ｓ０２）を実行することにより、フラグ検出部２１は、ソースコードＤ０１の中から、フラグを検出することができる。「フラグ一覧（ＤＯ３）」は、記憶部１４に一時的に記憶される。
【００３５】
一方、分岐ブロック特定部２２は、図３に示す「分岐ブロック特定」処理（Ｓ０３）を実行する。分岐ブロック特定処理（Ｓ０３）では、記憶部１４からソースコードＤ０１を読み込み、ソースコードＤ０１に含まれるステートメントの中から、if文或いはswitch文に基づいて分岐する一群のステートメントからなる分岐ブロックを特定する。分岐ブロックの開始位置として、「if」及び「switch」を特定する。そして、特定された「if」及び「switch」の後に続く“{”と“}”で囲まれた箇所を分岐ブロックとして特定し、特定された分岐ブロックに識別番号（ブロックＩＤ）を順次付与する。
【００３６】
図７（ａ）〜（ｇ）は、分岐ブロック特定部２２により特定された分岐ブロックＩＤ１〜ＩＤ４を示す。「Tsk1.c」及び「foo.c」に跨って分岐ブロックＩＤ１が特定され、「Task2.c」、「calc.c」、及び「output.c」に跨って分岐ブロックＩＤ２が特定され、「Task3.c」の中に分岐ブロックＩＤ３が特定され、「Task4.c」の中に分岐ブロックＩＤ４が特定された。分岐ブロック特定部２２は、分岐ブロック特定処理（Ｓ０３）の結果として、「ブロックＩＤ一覧」（Ｄ０４）を生成する。図８の表は、上記した分岐ブロック特定処理（Ｓ０３）により特定された分岐ブロックの一覧を示す「ブロックＩＤ一覧（ＤＯ４）」の一例である。図８の例では、分岐ブロック毎に、ブロック開始箇所及びブロック終了箇所として、ファイル名及び行番号を出力する。「ブロックＩＤ一覧」（Ｄ０４）は、記憶部１４に一時的に記憶される。
【００３７】
アクセス箇所特定部２３は、図３に示す「フラグアクセス箇所特定」処理（Ｓ０４）を実行する。フラグアクセス箇所特定処理（Ｓ０４）では、記憶部１４から「フラグ一覧（ＤＯ３）」及び「ブロックＩＤ一覧」（Ｄ０４）を読み込む。そして、ソースコードＤ０１の中で、フラグ抽出処理（Ｓ０２）により抽出されたフラグにアクセスするステートメントを特定する。例えば、図６に示すフラグにアクセスするステートメントが、分岐ブロック特定処理（Ｓ０３）により特定された分岐ブロックのいずれに属するかを特定する。アクセス箇所特定部２３は、図６に示す「フラグ一覧（ＤＯ３）」と図８に示す「ブロックＩＤ一覧（ＤＯ４）」とに基づいて、フラグにアクセスするステートメントが属する分岐ブロックを特定する。アクセス箇所特定部２３は、フラグアクセス箇所特定処理（Ｓ０４）の結果として、「フラグアクセス一覧」（Ｄ０５）を生成する。図９の表は、「フラグアクセス一覧（Ｄ０５）」の一例を示す。図９の表は、図６に示す「フラグ一覧（ＤＯ３）」に対して、フラグにアクセスするステートメントが属する「ブロックＩＤ」の項目を付加したものである。「フラグアクセス一覧」（Ｄ０５）は、記憶部１４に一時的に記憶される。
【００３８】
処理内容分類部２４は、図３に示す「処理内容分類」処理（Ｓ０５）を実行する。処理内容分類処理（Ｓ０５）では、記憶部１４から「フラグアクセス一覧」（Ｄ０５）を読み込み、フラグアクセス箇所特定処理（Ｓ０４）により特定されたステートメントにおけるフラグに対する処理内容を分類する。具体的には、フラグに対する処理内容を、フラグに第１の値を書き込む処理、フラグに第２の値を書き込む処理、或いはフラグに対する読み出し処理のいずれかに分類する。処理内容分類部２４は、処理内容分類処理（Ｓ０５）の結果として、「フラグ判定一覧」（Ｄ０６）を生成する。図１０の表は、「フラグ判定一覧（Ｄ０６）」の一例を示す。図１０の表は、図９に示す「フラグアクセス一覧（Ｄ０５）」に対して、フラグに対する処理内容の分類結果を示す「セット／クリア／コンペア」の項目を付加したものである。「セット」はフラグに「１」を書き込む処理を示し、「クリア」はフラグに「０」を書き込む処理を示し、「コンペア」はフラグに対する読み出し処理を示す。「フラグ判定一覧」（Ｄ０６）は、記憶部１４に一時的に記憶される。
【００３９】
以上説明したソースコードＤ０１の解析処理により、フラグがどのブロックで「１」にセット,「０」へクリア、或いは比較されているかが可視化される。
【００４０】
次に、アクセス順序特定部２５は、図３に示す「ステートメント番号割付」処理（Ｓ０６）及び「フラグアクセス順序特定」処理（Ｓ０７）を実行することにより、フラグにアクセスするステートメントの実行順序を特定する。
【００４１】
「ステートメント番号割付」処理（Ｓ０６）では、検査対象となるソースコードＤ０１からステートメントを１行ずつ読み込み、各ステートメントの実行順序を特定する。例えば、記憶部１４から検査対象となるソースコードＤ０１を読み込み、ソースコードＤ０１に記述されたステートメントの切り出しを行う。「ステートメントの切り出し」とは、ソースコードを１行ずつ読み込み、ステートメント本文として、１行ずつ出力する。ここでは、ソースコード１行毎の文字解析は重要ではない。説明を簡便化するため、検査対象のソースコードＤ０１は前提条件として１行１ステップの記述としている。「１ステップ」とは１処理を示す。条件文の場合、条件式で１ステップ、代入式で１ステップとなる。また、切り出されたステートメントに対して、１行切り出すごとにカウントアップするステートメント番号を割り振る。「ステートメント番号」は、各モジュールの各ステートメントを識別するための固有の値であり、ステートメントの実行順序を示す。アクセス順序特定部２５は、ステートメント番号割付処理（Ｓ０６）の結果として、「ステートメント番号割付一覧」（Ｄ０７）を生成する。図１１（ａ）〜（ｄ）の表は、「ステートメント番号割付一覧（Ｄ０７）」の一例を示す。図１１（ａ）〜（ｄ）の例では、分岐ブロックＩＤ１〜ＩＤ４の各々について、各ステートメントの実行順序を特定している。「ステートメント番号割付一覧」（Ｄ０７）は、記憶部１４に一時的に記憶される。
【００４２】
「フラグアクセス順序特定」処理（Ｓ０７）では、「フラグ判定一覧」（Ｄ０６）及び「ステートメント番号割付一覧」（Ｄ０７）を記憶部１４から読み込む。そして、フラグアクセス箇所特定処理（Ｓ０４）により特定されたフラグへのアクセス箇所（ステートメント）と、ステートメント番号割付処理（Ｓ０６）により特定された各ステートメントの実行順序とに基づいて、フラグにアクセスするステートメントの実行順序を特定する。例えば、図１１（ａ）〜（ｄ）に示すステートメント番号割付一覧（Ｄ０７）を用いて、図１０に示す各ステートメントに対して、ステートメント番号を追加し、図１０に示す各ステートメントをその実行順序にしたがって並べ替える。アクセス順序特定部２５は、フラグアクセス順序特定処理（Ｓ０７）の結果として、「フラグアクセス順序一覧」（Ｄ０８）を生成する。図１２の表は、「フラグアクセス順序一覧（Ｄ０８）」の一例を示す。図１２の表には、フラグにアクセスするステートメントが属する分岐ブロック（ブロックＩＤ）、フラグにアクセスするステートメントの処理内容（セット／クリア／コンペア）、及びフラグにアクセスするステートメントの実行順序（ステートメント番号）とが含まれる。「フラグアクセス順序一覧」（Ｄ０８）は記憶部１４に一時的に記憶される。
【００４３】
以上説明したアクセス順序特定部２５による解析処理により、フラグにアクセスしてるステートメントの実行順序が更に可視化される。
【００４４】
次に、不具合可能性判断部２６は、記憶部１４から「フラグアクセス順序一覧」（Ｄ０８）を読み込み、図３に示す「第１不具合パターン判定」（Ｓ０８）〜「第４不具合パターン判定」処理（Ｓ１１）を実行する。具体的には、第１不具合パターン判定部３０が「第１不具合パターン判定」処理（Ｓ０８）を実行し、第２不具合パターン判定部３１が「第２不具合パターン判定」処理（Ｓ０９）を実行し、第３不具合パターン判定部３２が「第３不具合パターン判定」処理（Ｓ１０）を実行し、第４不具合パターン判定部３３が「第４不具合パターン判定」処理（Ｓ１１）を実行する。
【００４５】
ここで、第１不具合パターン判定処理（Ｓ０８）によって検出できる不具合の事例を説明する。先ず、図１３（ａ）、（ｂ）を参照して正常なコンピュータプログラムの事例を説明する。「１」及び「０」のみを取り得るフラグ（Flag）の状態に応じて２つの処理（処理１及び処理２）を切り替えて実行するコンピュータプログラムを想定する。このコンピュータプログラムは、図１３（ａ）に示す「Task1」の起動時に「Flag」が「１」にセットされている場合、処理１を実行し、「Flag」を「０」にクリアする。次に、あるタイミングで図１３（ｂ）に示す「Task2」が起動された時、「Flag」が「０」にクリアされているため、処理２を実行し、「Flag」を再び「１」にセットする。次に、「Task1」が起動された時、「Flag」が「１」にセットされているため、処理１が実行され、「Flag」が再び「０」にクリアされる。このように、フラグ（Flag）は、「０」及び「１」の間で切り替わることにより、処理１及び処理２を切り替えて実行する目的で使用される。
【００４６】
次に、図１４（ａ）、（ｂ）を参照して、第１不具合パターン判定処理（Ｓ０８）によって検出できる不具合の事例を説明する。本事例では、処理１と処理２が切り替わらない不具合が発生する可能性がある。設計者は、処理１と処理２を切り替えて実行する意図を持って、コンピュータプログラムを実装していると想定する。「Task1」の起動時に「Flag」が「１」にセットされている場合、処理１を実行し、「Flag」は「０」にクリアされる。この状態で、「Task2」が起動されると、「Flag」が「０」にクリアされているため、処理２を実行する。しかし、「Flag」は「０」のままであるため、その後「Task1」が起動されても処理１を実行することはない。つまり、処理１と処理２が切り替わらなくなってしまう。「Flag」に対する処理内容として、「１」にセットする処理、「０」にクリアする処理、及び比較する処理の総てがコンピュータプログラムの中に存在しなけらばならない、という観点で検査することにより、図１４（ａ）、（ｂ）に示す事例の不具合は検出することができる。
【００４７】
そこで、「第１不具合パターン判定」処理（Ｓ０８）では、ソースコードＤ０１の中に、第１のステートメント、第２のステートメント、及び第３のステートメントの総てが含まれているか否かを判定する。第１不具合パターン判定部３０は、第１不具合パターン判定処理（Ｓ０８）の結果として、「第１不具合パターン判定結果」（Ｄ０９）を生成する。図１９の表は、「第１不具合パターン判定結果（Ｄ０９）」の一例を示す。フラグ「val」に関して、「０」にクリアする処理、及び比較する（読み出す）処理は存在するが、「１」にセットする処理が存在しない。そのため、第１不具合パターン判定結果はＮＧとなる。つまり、ソースコードＤ０１の中に、第１のステートメント、第２のステートメント、及び第３のステートメントの総てが含まれていないと判定される。また、フラグ「F1」に関しては、「０」にクリアする処理、「１」にセットする処理、及び比較する処理の総てが存在する。よって、第１不具合パターン判定結果はＯＫとなる。「第１不具合パターン判定結果（Ｄ０９）」は記憶部１４に一時的に記憶される。
【００４８】
次に、図１５（ａ）、（ｂ）を参照して、第２不具合パターン判定処理（Ｓ０９）によって検出できる不具合の事例を説明する。本事例では、処理１と処理２が切り替わらない不具合が発生する可能性がある。設計者は、処理１と処理２を交互に実行する意図を持って、コンピュータプログラムを実装していると想定する。「Task1」の起動時に処理１が実行されて「Flag」が「０」にクリアされる。この状態で「Task2」が起動された場合、処理２が実行されるべきであるところ、処理２の前に「Flag」を１にセットする処理を記述している。このため、処理２は実行されない。これにより、処理１は実行されるが、処理２は実行されない。つまり、処理１と処理２が切り替わらなくなってしまう。フラグは「１」にセット或いは「０」にクリアしたら上書きせずに比較しなければならない、という観点で検査することにより、図１５（ａ）、（ｂ）に示す事例の不具合は検出することができる。
【００４９】
そこで、「第２不具合パターン判定」処理（Ｓ０９）では、第１のステートメント或いは第２のステートメントが実行された後に、第３のステートメントが実行されることなく、再び第１のステートメント或いは第２のステートメントが実行されるか否かを判定する。第２不具合パターン判定部３１は、第２不具合パターン判定処理（Ｓ０９）の結果として、「第２不具合パターン判定結果」（Ｄ１０）を生成する。図２０の表は、「第２不具合パターン判定結果（Ｄ１０）」の一例を示す。フラグ「val」に関して、「Task1」のステートメント番号２で書込処理を行った後に、「Task2」のステートメント番号１で読み出す処理（比較処理）を行うまでに書込処理が存在しない。よって、第２不具合パターン判定結果はＯＫとなる。フラグ「F1」に関して、「Task3」のステートメント番号１で書込処理を行った後に、「Task4」のステートメント番号１及び「Task3」のステートメント番号３で読み出す処理（比較処理）を行うまでに書込処理が存在しない。よって、第２不具合パターン判定結果はＯＫとなる。「第２不具合パターン判定結果（Ｄ１０）」は記憶部１４に一時的に記憶される。
【００５０】
次に、図１６（ａ）、（ｂ）を参照して、第３不具合パターン判定処理（Ｓ１０）によって検出できる不具合の事例を説明する。本事例では、処理１と処理２が切り替わらない不具合が発生する可能性がある。設計者は、処理１と処理２を交互に実行する意図を持って、コンピュータプログラムを実装していると想定する。「Task1」の起動時に処理１が実行されて「Flag」が「０」にクリアされる。この状態で「Task2」が起動された場合、処理２が実行される。処理２の後、「Flag」は「１」にセットされた後、再び「０」にクリアされる。これにより、処理２は実行されるが、処理１は実行されなくなる。つまり、処理１と処理２が切り替わらなくなってしまう。「１」にセットする処理および、「０」にクリアする処理は必ず一つのタスクでなければならない（２つのタスクに存在してはいけない）という観点で検査することにより、図１６（ａ）、（ｂ）に示す事例の不具合は検出することができる。
【００５１】
そこで、「第３不具合パターン判定」処理（Ｓ１０）では、分岐ブロックの各々の中で、第１のステートメント及び第２のステートメントの両方のステートメントが実行されているか否かを判定する。第３不具合パターン判定部３２は、第３不具合パターン判定処理（Ｓ１０）の結果として、「第３不具合パターン判定結果」（Ｄ１１）を生成する。図２１の表は、「第３不具合パターン判定結果（Ｄ１１）」の一例を示す。フラグ「val」及び「F1」に関して、分岐ブロックの各々（ＩＤ１〜４）の中で、「１」にセットする処理及び「０」にクリアする処理の両方が実行されていないため、第３不具合パターン判定結果は共にＯＫとなる。「第３不具合パターン判定結果（Ｄ１１）」は記憶部１４に一時的に記憶される。
【００５２】
次に、第４不具合パターン判定処理（Ｓ１１）によって検出できる不具合の事例を説明する。先ず、図１７（ａ）〜（ｃ）を参照して正常なコンピュータプログラムの事例を説明する。設計者は、処理１と処理２或いは処理３との間で切り替えて実行する意図でコンピュータプログラムを設計していると想定する。「Task1」の起動時に処理１を実行した場合、その後、「Flag」は「０」にクリアされるので、「Task2」又は「Task3」の起動時に処理２もしくは処理３を実行する。このように、フラグ（Flag）は、「０」及び「１」の間で切り替わることにより、処理１と処理２もしくは処理３とを切り替えて実行する目的で使用される。
【００５３】
次に、図１８（ａ）〜（ｃ）を参照して、第４不具合パターン判定処理（Ｓ１１）によって検出できる不具合の事例を説明する。処理２を実行した後に「Flag」を「１」にセットする処理を実装していない場合、処理１ではなく処理２や処理３が再度実行されてしまう。処理２を実行した後に処理１を実行することができなくなる。フラグを条件文で比較したら、その後、条件文と同じ分岐ブロックの中で、フラグを書き換える処理を実行しなければならない、という観点で検査することにより、図１８（ａ）〜（ｃ）に示す事例の不具合は検出することができる。
【００５４】
なお、上記した４つの事例に係わる不具合は「Task1」、「Task2」及び「Task3」を個別に評価するテスト（単体テスト）では検出することはできない。また、総ての「Flag」の構造を可視化してもこの不具合を検出することはできない。結合テストで検出することもできない。また、静的解析ツールでこのような観点を持って検証するツールは存在しない。
【００５５】
そこで、「第４不具合パターン判定」処理（Ｓ１１）では、第３のステートメントが実行された後に、第３のステートメントと同じ分岐ブロックの中で、フラグの値を書き換えるステートメントが実行されているか否かを判定する。第４不具合パターン判定部３３は、第４不具合パターン判定処理（Ｓ１１）の結果として、「第４不具合パターン判定結果」（Ｄ１２）を生成する。図２２の表は、「第４不具合パターン判定結果（Ｄ１２）」の一例を示す。フラグ「val」に関して、「Task2」のステートメント番号１に記述された比較処理は分岐ブロックＩＤ３に属する。分岐ブロックＩＤ３内に「１」にセットする処理、もしくは「０」にクリアする処理が存在しない。よって、第４不具合パターン判定結果はＮＧとなる。また、フラグ「F1」に関して、「Task3」のステートメント番号１に記述された比較処理は分岐ブロックＩＤ３に属する。分岐ブロックＩＤ３のステートメント番号３に「０」にクリアする処理が記述されている。また、「Task4」のステートメント番号１に記述された比較処理は分岐ブロックＩＤ４に属する。分岐ブロックＩＤ４のステートメント番号３に「１」にセットする処理が記述されている。よって、第４不具合パターン判定結果はＯＫとなる。「第４不具合パターン判定結果（Ｄ１２）」は記憶部１４に一時的に記憶される。
【００５６】
以上、不具合可能性判断部２６は、第１不具合パターン判定結果（Ｄ０９）〜第４不具合パターン判定結果（Ｄ１２）の各々を、不具合可能性判断部２６による判断結果として出力する。
【００５７】
次に、不具合可能性判断部２６は、図３に示す「結果結合」処理（Ｓ１２）を実行する。結果結合処理（Ｓ１２）では、第１不具合パターン判定結果（Ｄ０９）〜第４不具合パターン判定結果（Ｄ１２）を記憶部１４から読み込み、これらを結合させたものを、不具合可能性判断部２６による判断結果として出力する。具体的には、図１９〜図２２に示す第１不具合パターン判定結果（Ｄ０９）〜第４不具合パターン判定結果（Ｄ１２）をまとめた「判断結果一覧」（Ｄ１３）を生成する。図２３の表は、「判断結果一覧（Ｄ１３）」の一例を示す。図２３に示す「第１不具合」〜「第４不具合」は、図１９〜図２２に示す「第１不具合パターン判定結果」〜「第４不具合パターン判定結果」とそれぞれ同義である。
【００５８】
検査結果出力部２７は、結果結合処理（Ｓ１２）において生成された「判断結果一覧」（Ｄ１３）を、図１に示す表示装置１５或いは入出力装置１２に挿入された記憶媒体へ出力する。
【００５９】
ユーザは、出力された「判断結果一覧」（Ｄ１３）を参照することにより、フラグを用いて２以上の異なる処理を切り替えて実行できなくなる不具合の可能性がある箇所に気づくことができる。例えば、フラグ「val」に関して、プログラム設計者（ユーザ）は、第１不具合パターン判定結果（ＮＧ）から、「１」にセットする処理が無いことに気づく。また、第４不具合パターン判定結果（ＮＧ）から、「Task2」の４行目に記述された比較処理が存在する分岐ブロックＩＤ２の中で、「１」にセットする処理或いは「０」にクリアする処理が無いことが特定される。プログラム設計者（ユーザ）は、この特定事項から、フラグ「val」に関して、分岐ブロックＩＤ２内に「１」にセットする処理が無いことに気づく。
【００６０】
図２４（ａ）〜（ｇ）は、図２３に示す判断結果一覧（Ｄ１３）に基づいて、図４（ａ）〜（ｇ）に示すコンピュータプログラムを修正した結果を示す。図２４（ｂ）に示すファイル「Task2.c」の８行目に、フラグ「val」を「１」にセットする処理を示すステートメント「val=1」を追加している点が、図４（ｂ）と相違する。このように、本実施形態では、特定のフラグ処理（書込処理）が抜けていることにより起こりうる不具合を特定することができる。
【００６１】
また、フラグ処理は漏れていなくてもフラグに書き込んでいる値が間違えている事例もある。図２５（ａ）〜（ｇ）は、フラグに書き込んでいる値が間違えているコンピュータプログラムの一例を示す。図２６は、図２５（ａ）〜（ｇ）に示すコンピュータプログラムを検査対象とした場合の「判断結果一覧（Ｄ１３）」の一例を示す。図２５（ｂ）に示すファイル「Task2.c」の８行目に、フラグ「val」を「０」にクリアする処理が実装されている。この場合、フラグ「val」を「１」にセットする処理が無いため、第１不具合パターン判定結果はＮＧとなる。「val」を「０」にクリアする処理が２つのタスクに存在するため、第３具合パターン判定結果はＮＧとなる。また、分岐ブロックＩＤ２の比較処理後に、「val」を「１」にセットする処理が存在しないため、第４不具合パターン判定結果はＮＧとなる。ユーザは、図２６に示す「判断結果一覧」（Ｄ１３）を参照することにより、フラグ「val」に関して「１」にセットする処理が無く、「０」にクリアする処理が余分にあることに気づく。よって、プログラム設計者（ユーザ）は、ブロックＩＤ２に属するフラグ「val」にアクセスする処理のうち、図２５（ｂ）の８行目に記述された「０」にクリアする処理が間違いであり、「１」にセットする処理が正しいことに気づくことができる。
【００６２】
また、フラグアクセス処理が漏れておらず、且つ書き込んでいる値に間違えが無い場合であっても、フラグアクセス処理の記述箇所を間違える事例もある。図２７（ａ）〜（ｇ）は、フラグにアクセスする処理が記述された箇所が間違えているコンピュータプログラムの一例を示す。図２８は、図２７（ａ）〜（ｇ）に示すコンピュータプログラムを検査対象とした場合の「判断結果一覧（Ｄ１３）」の一例を示す。図２７（ｂ）に示すファイル「Task2.c」の４行目に、フラグ「val」を「１」にセットする処理が実装されている。この場合、「１」にセットする処理があるため、第１不具合パターン判定結果、第３不具合パターン判定結果、及び第４不具合パターン判定結果は、総てＯＫとなる。しかし、図２７（ｅ）に示すファイル「foo.c」の４行目で「val」を「０」にクリアする処理を実行した後に、「val」を読み出す処理を実行することなく、図２７（ｂ）に示すファイル「Task2.c」の４行目で「val」を「１」にセットする処理を実行している。このため、第２不具合パターン判定結果はＮＧとなる。ユーザは、図２８に示す「判断結果一覧」（Ｄ１３）を参照することにより、フラグ「val」の書込処理を実行した後に、フラグ「val」の比較処理を実行する前に、再度書込処理を実行していることに気づく。よって、プログラム設計者（ユーザ）は、ファイル「Task2.c」の４行目で「val」を「１」にセットする処理が間違えていることに気づく。
【００６３】
［実施形態による効果］
このように、実施形態に係わるフラグアクセス不具合検査装置によれば、フラグアクセス処理の漏れ、書き込んでる値の間違い、及びフラグアクセスの記述箇所の間違いを、プログラム設計者（ユーザ）に気づかせることができる。よって、これらのコーディングミスを未然に防止することができる。
【００６４】
なお、コンピュータプログラムに含まれる関数（Task1()、foo()、Task2、calc、output、Task3、Task4）の各々を単体テストを用いて検査する場合を考える。更に、関数「Task2」を設計したプログラム設計者が、関数「Task2」の詳細仕様でフラグ「val」を条件文if(val==0)に特定される分岐ブロックの中で「１」にセットすることに気づいていない場合を想定する。この場合、単体テストでの入力値と出力値が間違えており、単体テストの結果はＯＫとなり、不具合を特定できない。また、結合テストを用いて関数「Task2」を検査しても同じことになる。また、知見者によるレビューを実施しようとしても、従来、レビューする手段が存在しなかった。例えば、コンピュータプログラムが以前から流用しているソースコード、所謂レガシーコードであって、コンピュータプログラムの仕様が存在しない場合、フラグとして扱われている変数を特定することができない。また、仮にレガシーコードでなくても、フラグとして扱っている変数を設計段階で管理してなければ、どれがフラグであるかが分からない。フラグが特定できたとしても、フラグに関するコンピュータプログラムの構造を可視化することができなく、どのよな構造が不具合のリスクがあるかも分からない。実施形態に係わるフラグアクセス不具合検査装置によれば、単体テスト、結合テスト或いは知見者によるレビューであっても検出することが難しい不具合の箇所をユーザに気づかせることができる。
【００６５】
具体的には、図２に示すように、フラグ検出部２１は、検査対象となるソースコードＤ０１の中から、フラグを検出する。アクセス箇所特定部２３は、ソースコードＤ０１の中で、フラグ検出部２１により検出されたフラグにアクセスするステートメントを特定する。処理内容分類部２４は、アクセス箇所特定部２３により特定されたステートメントにおけるフラグに対する処理内容を分類する。アクセス順序特定部２５は、アクセス箇所特定部２３により特定されたステートメントの実行順序を特定する。不具合可能性判断部２６は、処理内容分類部２４により分類されたフラグに対する処理内容、及びアクセス順序特定部２５により特定されたステートメントの実行順序に基づいて、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性の有無を判断する。検査結果出力部２７は、不具合可能性判断部２６による判断結果を出力する。フラグに対する処理内容及びステートメントの実行順序によってソースコードＤ０１の構造が可視化される。可視化されたソースコードＤ０１の構造に基づいて、フラグを用いて２以上の異なる処理を切り替えて実行できなくなる不具合が発生する可能性の有無を判断することができる。この判断結果を出力することにより、不具合の可能性がある箇所をユーザに気づかせることができる。
【００６６】
処理内容分類部２４は、フラグに対する処理内容を、フラグに第１の値（例えば「０」）を書き込む処理、フラグに第１の値とは異なる第２の値（例えば、「１」）を書き込む処理、或いはフラグの値を読み出す処理のいずれかに分類する。フラグに対する処理内容を可視化することができる。可視化されたフラグに対する処理内容に基づいて、フラグを用いて２以上の異なる処理を切り替えて実行できなくなる不具合が発生する可能性の有無を判断することができる。
【００６７】
不具合可能性判断部２６は、ソースコードＤ０１の中に、フラグに第１の値を書き込む処理を記述した第１のステートメント、フラグに第２の値を書き込む処理を記述した第２のステートメント、及びフラグの値を読み出す処理を記述した第３のステートメントの総てが含まれているか否かを判定する。第１〜第３のステートメントの総てが含まれていない場合、不具合可能性判断部２６は、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する。第１〜第３のステートメントの総てが含まれていない場合、フラグの値が切り替わらない可能性がある。このため、フラグを用いて２以上の異なる処理を切り替えて実行できなくなる可能性があると判断することができる。
【００６８】
不具合可能性判断部２６は、第１のステートメント或いは第２のステートメントが実行された後に、第３のステートメントが実行されることなく、再び第１のステートメント或いは第２のステートメントが実行されるか否かを判定する。第３のステートメントが実行されることなく、再び第１のステートメント或いは第２のステートメントが実行される場合、不具合可能性判断部２６は、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する。第３のステートメントが実行されることなく、再び第１のステートメント或いは第２のステートメントが実行される場合、フラグの値を切り替えることはできるが、２以上の異なる処理を切り替えて実行できない可能性が有る。このため、フラグを用いて２以上の異なる処理を切り替えて実行できなくなる可能性があると判断することができる。
【００６９】
フラグアクセス不具合検査装置は、ソースコードＤ０１に含まれるステートメントの中から、所定の条件文に基づいて分岐する一群のステートメントからなる分岐ブロックを特定する分岐ブロック特定部２２を更に備える。不具合可能性判断部２６は、分岐ブロックの各々の中で、第１のステートメント及び第２のステートメントの両方のステートメントが実行されているか否かを判定する。両方のステートメントが実行されている場合、不具合可能性判断部２６は、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する。第１及び第２のステートメントの両方が１つの分岐ブロックの中で実行されている場合、フラグを切り替えることはできるが、２以上の異なる処理を切り替えて実行できない可能性が有る。このため、フラグを用いて２以上の異なる処理を切り替えて実行できなくなる可能性があると判断することができる。
【００７０】
不具合可能性判断部２６は、第３のステートメントが実行された後に、第３のステートメントと同じ分岐ブロックの中で、フラグの値を書き換えるステートメントが実行されているか否かを判定する。フラグの値を書き換えるステートメントが実行されていない場合、不具合可能性判断部２６は、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性が有ると判断する。第３のステートメントが実行された後に、第３のステートメントと同じ分岐ブロックの中で、フラグの値を書き換えるステートメントが実行されていない場合、フラグの値が切り替わらない可能性がある。このため、フラグを用いて２以上の異なる処理を切り替えて実行できなくなる可能性があると判断することができる。
【００７１】
上記のように、本発明の実施形態を記載したが、この開示の一部をなす論述及び図面はこの発明を限定するものであると理解すべきではない。この開示から当業者には様々な代替実施の形態、実施例及び運用技術が明らかとなろう。
【００７２】
実施形態（図２３）では、第１〜第４不具合パターン判定部（３０〜３３）の判定結果の各々を、不具合可能性判断部２６による判断結果として出力するとする例を示した。この他にも、例えば、不具合可能性判断部２６は、第１〜第４不具合パターン判定部（３０〜３３）の判定結果のうち２つ以上の判定結果を組み合わせて、１つの判断結果を生成してもよい。２つ以上の判定結果を組み合わせることにより、フラグを用いて２以上の異なる処理を切り替えて実行できない可能性を数値化することができる。よって、複数のフラグについての判断結果が出力される場合に、検証対象としての優先度をユーザに伝えることができるので、ユーザによる検証作業の効率を高めることができる。
【００７３】
特願２０１３−００８３５４号（出願日：２０１３年１月２１日）の全内容は、ここに援用される。
【符号の説明】
【００７４】
２１  フラグ検出部
２２  分岐ブロック特定部
２３  アクセス箇所特定部
２４  処理内容分類部
２５  アクセス順序特定部
２６  不具合可能性判断部
２７  検査結果出力部
３０  第１不具合パターン判定部（不具合可能性判断部）
３１  第２不具合パターン判定部（不具合可能性判断部）
３２  第３不具合パターン判定部（不具合可能性判断部）
３３  第４不具合パターン判定部（不具合可能性判断部）
Ｄ０１  ソースコード（コンピュータプログラム）
【図１】
0005962779.tif 000002
【図２】
0005962779.tif 000003
【図３】
0005962779.tif 000004
【図４】
0005962779.tif 000005
【図５】
0005962779.tif 000006
【図６】
0005962779.tif 000007
【図７】
0005962779.tif 000008
【図８】
0005962779.tif 000009
【図９】
0005962779.tif 000010
【図１０】
0005962779.tif 000011
【図１１】
0005962779.tif 000012
【図１２】
0005962779.tif 000013
【図１３】
0005962779.tif 000014
【図１４】
0005962779.tif 000015
【図１５】
0005962779.tif 000016
【図１６】
0005962779.tif 000017
【図１７】
0005962779.tif 000018
【図１８】
0005962779.tif 000019
【図１９】
0005962779.tif 000020
【図２０】
0005962779.tif 000021
【図２１】
0005962779.tif 000022
【図２２】
0005962779.tif 000023
【図２３】
0005962779.tif 000024
【図２４】
0005962779.tif 000025
【図２５】
0005962779.tif 000026
【図２６】
0005962779.tif 000027
【図２７】
0005962779.tif 000028
【図２８】
0005962779.tif 000029