JPWO2014112316A1 - フラグアクセス不具合検査装置、フラグアクセス不具合検査方法、フラグアクセス不具合検査プログラム - Google Patents
フラグアクセス不具合検査装置、フラグアクセス不具合検査方法、フラグアクセス不具合検査プログラム Download PDFInfo
- Publication number
- JPWO2014112316A1 JPWO2014112316A1 JP2014557381A JP2014557381A JPWO2014112316A1 JP WO2014112316 A1 JPWO2014112316 A1 JP WO2014112316A1 JP 2014557381 A JP2014557381 A JP 2014557381A JP 2014557381 A JP2014557381 A JP 2014557381A JP WO2014112316 A1 JPWO2014112316 A1 JP WO2014112316A1
- Authority
- JP
- Japan
- Prior art keywords
- flag
- statement
- access
- executed
- unit
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/28—Error detection; Error correction; Monitoring by checking the correct order of processing
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
フラグアクセス不具合検査装置は、2つの値のみを設定可能なフラグを用いて2以上の異なる処理を切り替えて実行するコンピュータプログラムの中から、フラグを検出し(S01、S02)、フラグにアクセスするステートメント(D05)、ステートメントにおけるフラグに対する処理内容(D06)、及びステートメントの実行順序(D08)をそれぞれ特定する(S04、S05、S07)。フラグに対する処理内容(D06)、及びステートメントの実行順序(D08)に基づいて、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性の有無を判断し(S08〜S11)、その判断結果を出力する(S12)。
Description
本発明は、フラグアクセス不具合検査装置、フラグアクセス不具合検査方法、フラグアクセス不具合検査プログラムに関するものである。
従来から、プログラミング言語で記述されたソースプログラムにおける制御の流れやデータの流れを、そのソースプログラムを実行すること無しに解析する、静的解析方法が知られている(特許文献1参照)。
特許文献1の静的解析方法によれば、入力と出力の関係を明確にしてプログラムの構造を可視化することはできる。しかし、可視化されたプログラムの構造のうち、不具合の可能性がある箇所をユーザに気づかせることはできない。
本発明は、上記課題に鑑みて成されたものであり、その目的は、プログラムの構造のうち、不具合の可能性がある箇所をユーザに気づかせることができるフラグアクセス不具合検査装置、フラグアクセス不具合検査方法、フラグアクセス不具合検査プログラムを提供することである。
本発明の一態様に係わるフラグアクセス不具合検査装置は、2つの値のみを設定可能なフラグを用いて2以上の異なる処理を切り替えて実行するコンピュータプログラムの中から、フラグを検出し、フラグにアクセスするステートメント、当該ステートメントにおけるフラグに対する処理内容、及び当該ステートメントの実行順序をそれぞれ特定する。そして、フラグに対する処理内容、及びステートメントの実行順序に基づいて、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性の有無を判断し、その判断結果を出力する。
図面を参照して、本発明の実施形態を説明する。図面の記載において同一部分には同一符号を付し説明を省略する。
[フラグアクセス不具合検査装置のハードウェア構成]
本発明の実施形態に係わるフラグアクセス不具合検査装置は、例えば車両に搭載される電子制御装置(ECU)により実行されるコンピュータプログラムのフラグアクセス不具合検査処理に適用することができる。特に、2つの値のみを設定可能なフラグを用いて2以上の異なる処理を切り替えて実行するコンピュータプログラムにおける、フラグのコーディング間違い或いはコーディング漏れの可能性を検査することができる。
本発明の実施形態に係わるフラグアクセス不具合検査装置は、例えば車両に搭載される電子制御装置(ECU)により実行されるコンピュータプログラムのフラグアクセス不具合検査処理に適用することができる。特に、2つの値のみを設定可能なフラグを用いて2以上の異なる処理を切り替えて実行するコンピュータプログラムにおける、フラグのコーディング間違い或いはコーディング漏れの可能性を検査することができる。
図1を参照して、本発明の実施形態に係わるフラグアクセス不具合検査装置のハードウェア構成を説明する。フラグアクセス不具合検査装置のハードウェア構成として、汎用のコンピュータを用いることができる。例えば、フラグアクセス不具合検査装置は、記憶媒体から検査対象となるコンピュータプログラム(ソースコードD01)を読み込む入出力装置12と、入出力装置12で読み込んだソースコードD01や解析の途中で生成される中間データを一時的に記憶する記憶装置14と、各種演算を実行してソースコードD01を解析するCPU(中央処理装置)11と、ユーザが解析に必要な情報を入力するための入力装置13と、CPU11から出力される検査結果を表示する表示装置15とを備える。検査結果は、入出力装置12を用いて記憶媒体に書き込むことも可能である。
また、フラグアクセス不具合検査装置は、クライアントサーバモデルとしても実現可能である。例えば、汎用のパーソナルコンピュータ(クライアント)をコンピュータネットワークを介してサーバに接続する。これにより、図1に示すCPU11を備えるサーバを、コンピュータネットワークを介して、入出力装置12、入力装置13、記憶装置14、或いは表示装置15に接続することができる。この場合、フラグアクセス不具合検査装置は、主にCPU11(サーバ)により構成され、入出力装置12、入力装置13、記憶装置14、或いは表示装置15はフラグアクセス不具合検査装置に含まれない。この場合、解析の途中で生成される中間データは、記憶装置14の代わりに、サーバ11が備える内部ハードディスクに一時的に格納すればよい。
図2を参照して、CPU11の機能的構成を説明する。CPU11を備えるコンピュータをフラグアクセス不具合検査装置として機能させるためのコンピュータプログラム(フラグアクセス不具合検査プログラム)を、CPU11を備えるコンピュータにインストールして実行する。これにより、CPU11は、以下に示す各情報処理部を構成する。なお、ここでは、ソフトウェアによってフラグアクセス不具合検査装置を実現する例を示すが、もちろん、以下に示す各情報処理を実行するための専用のハードウェアを用意して、フラグアクセス不具合検査装置を構成することも可能である。
CPU11は、フラグ検出部21、分岐ブロック特定部22、アクセス箇所特定部23、処理内容分類部24、アクセス順序特定部25、不具合可能性判断部26及び検査結果出力部27を構成する。フラグ検出部21には、変数検出部28と、フラグ抽出部29とが含まれる。不具合可能性判断部26には、第1不具合パターン判定部30と、第2不具合パターン判定部31と、第3不具合パターン判定部32と、第4不具合パターン判定部33とが含まれる。
フラグ検出部21は、記憶装置14からソースコードD01を読み込み、ソースコードD01の中から、フラグを検出する。「フラグ」とは、ソースコードD01の中でアクセスされている変数のうち、例えば「0」及び「1」等、2つの値のみを設定可能な変数である。「ソースコードD01の中でアクセスされている変数」とは、ソースコードD01の中で書き込み処理或いは読み出し処理の対象として記述された変数を示す。「変数」とは、RAM領域に割り当てられているローカル変数、グローバル変数、スタティック(Static)変数など、ソースコードD01の中でその値の変更が可能なシンボルである。具体的に、変数検出部28は、ソースコードD01の中でアクセスされている変数を検出する。検出された変数は、記憶部14に一時的に記憶される。フラグ抽出部29は、記憶部14に記憶されている変数を読み出し、変数検出部28により検出された変数の中から、フラグを抽出する。フラグ検出部21により抽出されたフラグは、記憶部14に一時的に記憶される。
分岐ブロック特定部22は、記憶装置14からソースコードD01を読み込み、ソースコードD01に含まれるステートメントの中から、所定の条件文に基づいて分岐する一群のステートメントからなる分岐ブロックを特定する。「所定の条件文」には、例えばC言語の場合、if文或いはswitch文が含まれる。「所定の条件文に基づいて分岐する一群のステートメント」とは、例えばC言語の場合、if文或いはswitch文、及びその後に続くブラケット”{”,”}”で囲まれた処理単位を指す。予め、条件分岐と判定できる箇所として例えば「if」及び「switch」を定めておく。分岐ブロック特定部22は、解析対象となるソースコードD01の中から、条件分岐と判定できる箇所を特定し、その後に続く“{”と“}”で囲まれた処理単位を分岐ブロックとして特定する。分岐ブロック特定部22により特定された分岐ブロックは、記憶部14に一時的に記憶される。
アクセス箇所特定部23は、記憶装置14からソースコードD01及びフラグ検出部21により抽出されたフラグを読み込む。そして、アクセス箇所特定部23は、ソースコードD01の中で、フラグ検出部21により検出されたフラグにアクセスするステートメントを特定する。すなわち、アクセス箇所特定部23は、フラグへのアクセス箇所を特定する。特定されたステートメントを示す情報は、記憶部14に一時的に記憶される。
処理内容分類部24は、ステートメントを示す情報を記憶部14から読み込み、アクセス箇所特定部23により特定されたステートメントにおけるフラグに対する処理内容を分類する。処理内容分類部24は、フラグに対する処理内容を、フラグに対する書き込み処理、或いはフラグに対する読み出し処理に分類する。更に、処理内容分類部24は、フラグに対する書き込み処理を、フラグに第1の値を書き込む処理、或いはフラグに第1の値とは異なる第2の値を書き込む処理に分類する。「第1の値」及び「第2の値」は、例えば「0」及び「1」等、フラグに対して設定可能な2つの値を示す。処理内容の分類結果は、記憶部14に一時的に記憶される。
アクセス順序特定部25は、ステートメントを示す情報を記憶部14から読み込み、アクセス箇所特定部23により特定されたステートメントの実行順序を特定する。具体的に、アクセス順序特定部25は、検査対象となるソースコードD01からステートメントを1行ずつ読み込み、各ステートメントの実行順序を特定する。アクセス順序特定部25は、アクセス箇所特定部23により特定されたフラグへのアクセス箇所(ステートメント)と、各ステートメントの実行順序とに基づいて、フラグにアクセスするステートメントの実行順序を特定する。特定された実行順序は、記憶部14に一時的に記憶される。
不具合可能性判断部26は、処理内容の分類結果、及び特定された実行順序を記憶部14から読み込む。そして、不具合可能性判断部26は、処理内容分類部24により分類されたフラグに対する処理内容、及びアクセス順序特定部25により特定されたステートメントの実行順序に基づいて、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性の有無を判断する。具体的に、不具合可能性判断部26は、第1不具合パターン判定部30、第2不具合パターン判定部31、第3不具合パターン判定部32、第4不具合パターン判定部33のうち少なくとも1つの判定部による判定結果に応じて、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性の有無を判断する。
第1不具合パターン判定部30は、ソースコードD01の中に、フラグに第1の値を書き込む処理を記述した第1のステートメント、フラグに第2の値を書き込む処理を記述した第2のステートメント、及びフラグの値を読み出す処理を記述した第3のステートメントの総てが含まれているか否かを判定する。ソースコードD01の中に、第1〜第3のステートメントの総てが含まれていないと第1不具合パターン判定部30が判断した場合、不具合可能性判断部26は、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する。
第2不具合パターン判定部31は、第1のステートメント或いは第2のステートメントが実行された後に、第3のステートメントが実行されることなく、再び第1のステートメント或いは第2のステートメントが実行されるか否かを判定する。第1のステートメント或いは第2のステートメントが実行された後に、第3のステートメントが実行されることなく、再び第1のステートメント或いは第2のステートメントが実行されると第2不具合パターン判定部31が判定した場合、不具合可能性判断部26は、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する。
第3不具合パターン判定部32は、分岐ブロックの各々の中で、第1のステートメント及び第2のステートメントの両方のステートメントが実行されているか否かを判定する。両方のステートメントが実行されていると第3不具合パターン判定部32が判定した場合、不具合可能性判断部26は、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する。
第4不具合パターン判定部33は、第3のステートメントが実行された後に、第3のステートメントと同じ分岐ブロックの中で、フラグの値を書き換えるステートメントが実行されているか否かを判定する。具体的に、第4不具合パターン判定部33は、フラグに第1の値が設定されている状態において第2のステートメントが実行されているか否か、或いは、フラグに第2の値が設定されている状態においてフラグに第1のステートメントが実行されているか否か、を判定する。第3のステートメントが実行された後に、第3のステートメントと同じ分岐ブロックの中で、フラグの値を書き換えるステートメントが実行されていないと第4不具合パターン判定部33が判定した場合、不具合可能性判断部26は、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する。
検査結果出力部27は、不具合可能性判断部26による判断結果を、表示装置15或いは入出力装置12に挿入された記憶媒体へ出力する。
[フラグアクセス不具合検査装置により実行される情報処理の手順]
次に、図3〜図24を参照して、本発明の実施形態に係わるフラグアクセス不具合検査方法の一例として、図1及び図2に示すフラグアクセス不具合検査装置によって実行される情報処理の手順を説明する。
次に、図3〜図24を参照して、本発明の実施形態に係わるフラグアクセス不具合検査方法の一例として、図1及び図2に示すフラグアクセス不具合検査装置によって実行される情報処理の手順を説明する。
先ず、CPU11は、検査対象となるソースコードD01を入出力装置12から読み込む。なお、ソースコードD01は、予め入出力装置12を用いてユーザによりフラグアクセス不具合検査装置内に読み込まれ、記憶装置14に格納されていてもよい。図4(a)〜(g)は、読み込まれたソースコードD01として、C言語で記述されたコンピュータプログラムの一例を示す。検査対象となるコンピュータプログラムは、図4(a)〜(g)に示す7つのファイルに跨って記述されている。図4(a)のファイル名は「Task1.c」であり、図4(b)のファイル名は「Task2.c」であり、図4(c)のファイル名は「Task3.c」であり、図4(d)のファイル名は「Task4.c」であり、図4(e)のファイル名は「foo.c」であり、図4(f)のファイル名は「calc.c」であり、図4(g)のファイル名は「output.c」である。C言語で記述されたプログラムの一例において、各ファイルの左端部に記載された1から始まる連続番号は、各ファイルの「行番号」を示す。
変数検出部28は、図3に示す「変数検出」処理(S01)を実行する。変数検出処理(S01)では、ソースコードD01の中でアクセスされている変数を検出して、「変数アクセス一覧」(D02)を生成する。図5の表は、上記した変数検出処理(S01)により検出された変数の一覧を示す「変数アクセス一覧(DO2)」の一例である。図5の表の中では、検出された変数名、変数の種類、ファイル名、行番号、タスク名、ステートメント、R/W、及び変数の値を出力する。上記した項目のうち、ファイル名、行番号、タスク名、及びステートメントは、変数へのアクセス箇所を示す項目である。R/Wのうち、「W」は変数に書き込みを行っていることを示し、「R」は変数の読み出しを行っていることを示す。変数の値として、「val」は変数に設定される値が可変であることを示し、「L」は変数がローカル変数であることを示す。「変数アクセス一覧」(D02)は、記憶部14に一時的に記憶される。
フラグ抽出部29は、「フラグ抽出」処理(S02)を実行する。フラグ抽出処理(S02)では、記憶部14から「変数アクセス一覧」(D02)を読み込み、検出された変数の中から、以下の(1)〜(5)の条件を総て満たす変数をフラグとして抽出して、「フラグ一覧」(D03)を生成する。
(1)グローバル(global)変数若しくはスタティック(static)変数である。
(2)算術演算に使われていない。
(3)固定値ではある。
(4)少なくとも一回の書き込みがある。
(5)「0」へのクリア、及び「1」へのセットなど、予め定めた2つの値への書き込み処理は有るが、それ以外の値への書き込み処理は無い。
図6の表は、上記したフラグ抽出処理(S02)により抽出されたフラグの一覧を示す「フラグ一覧(DO3)」の一例である。図6の例では、図5に示す変数のうち、変数「val」及び変数「F1」がフラグとして抽出されている。このように、変数検出処理(S01)及びフラグ抽出処理(S02)を実行することにより、フラグ検出部21は、ソースコードD01の中から、フラグを検出することができる。「フラグ一覧(DO3)」は、記憶部14に一時的に記憶される。
一方、分岐ブロック特定部22は、図3に示す「分岐ブロック特定」処理(S03)を実行する。分岐ブロック特定処理(S03)では、記憶部14からソースコードD01を読み込み、ソースコードD01に含まれるステートメントの中から、if文或いはswitch文に基づいて分岐する一群のステートメントからなる分岐ブロックを特定する。分岐ブロックの開始位置として、「if」及び「switch」を特定する。そして、特定された「if」及び「switch」の後に続く“{”と“}”で囲まれた箇所を分岐ブロックとして特定し、特定された分岐ブロックに識別番号(ブロックID)を順次付与する。
図7(a)〜(g)は、分岐ブロック特定部22により特定された分岐ブロックID1〜ID4を示す。「Tsk1.c」及び「foo.c」に跨って分岐ブロックID1が特定され、「Task2.c」、「calc.c」、及び「output.c」に跨って分岐ブロックID2が特定され、「Task3.c」の中に分岐ブロックID3が特定され、「Task4.c」の中に分岐ブロックID4が特定された。分岐ブロック特定部22は、分岐ブロック特定処理(S03)の結果として、「ブロックID一覧」(D04)を生成する。図8の表は、上記した分岐ブロック特定処理(S03)により特定された分岐ブロックの一覧を示す「ブロックID一覧(DO4)」の一例である。図8の例では、分岐ブロック毎に、ブロック開始箇所及びブロック終了箇所として、ファイル名及び行番号を出力する。「ブロックID一覧」(D04)は、記憶部14に一時的に記憶される。
アクセス箇所特定部23は、図3に示す「フラグアクセス箇所特定」処理(S04)を実行する。フラグアクセス箇所特定処理(S04)では、記憶部14から「フラグ一覧(DO3)」及び「ブロックID一覧」(D04)を読み込む。そして、ソースコードD01の中で、フラグ抽出処理(S02)により抽出されたフラグにアクセスするステートメントを特定する。例えば、図6に示すフラグにアクセスするステートメントが、分岐ブロック特定処理(S03)により特定された分岐ブロックのいずれに属するかを特定する。アクセス箇所特定部23は、図6に示す「フラグ一覧(DO3)」と図8に示す「ブロックID一覧(DO4)」とに基づいて、フラグにアクセスするステートメントが属する分岐ブロックを特定する。アクセス箇所特定部23は、フラグアクセス箇所特定処理(S04)の結果として、「フラグアクセス一覧」(D05)を生成する。図9の表は、「フラグアクセス一覧(D05)」の一例を示す。図9の表は、図6に示す「フラグ一覧(DO3)」に対して、フラグにアクセスするステートメントが属する「ブロックID」の項目を付加したものである。「フラグアクセス一覧」(D05)は、記憶部14に一時的に記憶される。
処理内容分類部24は、図3に示す「処理内容分類」処理(S05)を実行する。処理内容分類処理(S05)では、記憶部14から「フラグアクセス一覧」(D05)を読み込み、フラグアクセス箇所特定処理(S04)により特定されたステートメントにおけるフラグに対する処理内容を分類する。具体的には、フラグに対する処理内容を、フラグに第1の値を書き込む処理、フラグに第2の値を書き込む処理、或いはフラグに対する読み出し処理のいずれかに分類する。処理内容分類部24は、処理内容分類処理(S05)の結果として、「フラグ判定一覧」(D06)を生成する。図10の表は、「フラグ判定一覧(D06)」の一例を示す。図10の表は、図9に示す「フラグアクセス一覧(D05)」に対して、フラグに対する処理内容の分類結果を示す「セット/クリア/コンペア」の項目を付加したものである。「セット」はフラグに「1」を書き込む処理を示し、「クリア」はフラグに「0」を書き込む処理を示し、「コンペア」はフラグに対する読み出し処理を示す。「フラグ判定一覧」(D06)は、記憶部14に一時的に記憶される。
以上説明したソースコードD01の解析処理により、フラグがどのブロックで「1」にセット,「0」へクリア、或いは比較されているかが可視化される。
次に、アクセス順序特定部25は、図3に示す「ステートメント番号割付」処理(S06)及び「フラグアクセス順序特定」処理(S07)を実行することにより、フラグにアクセスするステートメントの実行順序を特定する。
「ステートメント番号割付」処理(S06)では、検査対象となるソースコードD01からステートメントを1行ずつ読み込み、各ステートメントの実行順序を特定する。例えば、記憶部14から検査対象となるソースコードD01を読み込み、ソースコードD01に記述されたステートメントの切り出しを行う。「ステートメントの切り出し」とは、ソースコードを1行ずつ読み込み、ステートメント本文として、1行ずつ出力する。ここでは、ソースコード1行毎の文字解析は重要ではない。説明を簡便化するため、検査対象のソースコードD01は前提条件として1行1ステップの記述としている。「1ステップ」とは1処理を示す。条件文の場合、条件式で1ステップ、代入式で1ステップとなる。また、切り出されたステートメントに対して、1行切り出すごとにカウントアップするステートメント番号を割り振る。「ステートメント番号」は、各モジュールの各ステートメントを識別するための固有の値であり、ステートメントの実行順序を示す。アクセス順序特定部25は、ステートメント番号割付処理(S06)の結果として、「ステートメント番号割付一覧」(D07)を生成する。図11(a)〜(d)の表は、「ステートメント番号割付一覧(D07)」の一例を示す。図11(a)〜(d)の例では、分岐ブロックID1〜ID4の各々について、各ステートメントの実行順序を特定している。「ステートメント番号割付一覧」(D07)は、記憶部14に一時的に記憶される。
「フラグアクセス順序特定」処理(S07)では、「フラグ判定一覧」(D06)及び「ステートメント番号割付一覧」(D07)を記憶部14から読み込む。そして、フラグアクセス箇所特定処理(S04)により特定されたフラグへのアクセス箇所(ステートメント)と、ステートメント番号割付処理(S06)により特定された各ステートメントの実行順序とに基づいて、フラグにアクセスするステートメントの実行順序を特定する。例えば、図11(a)〜(d)に示すステートメント番号割付一覧(D07)を用いて、図10に示す各ステートメントに対して、ステートメント番号を追加し、図10に示す各ステートメントをその実行順序にしたがって並べ替える。アクセス順序特定部25は、フラグアクセス順序特定処理(S07)の結果として、「フラグアクセス順序一覧」(D08)を生成する。図12の表は、「フラグアクセス順序一覧(D08)」の一例を示す。図12の表には、フラグにアクセスするステートメントが属する分岐ブロック(ブロックID)、フラグにアクセスするステートメントの処理内容(セット/クリア/コンペア)、及びフラグにアクセスするステートメントの実行順序(ステートメント番号)とが含まれる。「フラグアクセス順序一覧」(D08)は記憶部14に一時的に記憶される。
以上説明したアクセス順序特定部25による解析処理により、フラグにアクセスしてるステートメントの実行順序が更に可視化される。
次に、不具合可能性判断部26は、記憶部14から「フラグアクセス順序一覧」(D08)を読み込み、図3に示す「第1不具合パターン判定」(S08)〜「第4不具合パターン判定」処理(S11)を実行する。具体的には、第1不具合パターン判定部30が「第1不具合パターン判定」処理(S08)を実行し、第2不具合パターン判定部31が「第2不具合パターン判定」処理(S09)を実行し、第3不具合パターン判定部32が「第3不具合パターン判定」処理(S10)を実行し、第4不具合パターン判定部33が「第4不具合パターン判定」処理(S11)を実行する。
ここで、第1不具合パターン判定処理(S08)によって検出できる不具合の事例を説明する。先ず、図13(a)、(b)を参照して正常なコンピュータプログラムの事例を説明する。「1」及び「0」のみを取り得るフラグ(Flag)の状態に応じて2つの処理(処理1及び処理2)を切り替えて実行するコンピュータプログラムを想定する。このコンピュータプログラムは、図13(a)に示す「Task1」の起動時に「Flag」が「1」にセットされている場合、処理1を実行し、「Flag」を「0」にクリアする。次に、あるタイミングで図13(b)に示す「Task2」が起動された時、「Flag」が「0」にクリアされているため、処理2を実行し、「Flag」を再び「1」にセットする。次に、「Task1」が起動された時、「Flag」が「1」にセットされているため、処理1が実行され、「Flag」が再び「0」にクリアされる。このように、フラグ(Flag)は、「0」及び「1」の間で切り替わることにより、処理1及び処理2を切り替えて実行する目的で使用される。
次に、図14(a)、(b)を参照して、第1不具合パターン判定処理(S08)によって検出できる不具合の事例を説明する。本事例では、処理1と処理2が切り替わらない不具合が発生する可能性がある。設計者は、処理1と処理2を切り替えて実行する意図を持って、コンピュータプログラムを実装していると想定する。「Task1」の起動時に「Flag」が「1」にセットされている場合、処理1を実行し、「Flag」は「0」にクリアされる。この状態で、「Task2」が起動されると、「Flag」が「0」にクリアされているため、処理2を実行する。しかし、「Flag」は「0」のままであるため、その後「Task1」が起動されても処理1を実行することはない。つまり、処理1と処理2が切り替わらなくなってしまう。「Flag」に対する処理内容として、「1」にセットする処理、「0」にクリアする処理、及び比較する処理の総てがコンピュータプログラムの中に存在しなけらばならない、という観点で検査することにより、図14(a)、(b)に示す事例の不具合は検出することができる。
そこで、「第1不具合パターン判定」処理(S08)では、ソースコードD01の中に、第1のステートメント、第2のステートメント、及び第3のステートメントの総てが含まれているか否かを判定する。第1不具合パターン判定部30は、第1不具合パターン判定処理(S08)の結果として、「第1不具合パターン判定結果」(D09)を生成する。図19の表は、「第1不具合パターン判定結果(D09)」の一例を示す。フラグ「val」に関して、「0」にクリアする処理、及び比較する(読み出す)処理は存在するが、「1」にセットする処理が存在しない。そのため、第1不具合パターン判定結果はNGとなる。つまり、ソースコードD01の中に、第1のステートメント、第2のステートメント、及び第3のステートメントの総てが含まれていないと判定される。また、フラグ「F1」に関しては、「0」にクリアする処理、「1」にセットする処理、及び比較する処理の総てが存在する。よって、第1不具合パターン判定結果はOKとなる。「第1不具合パターン判定結果(D09)」は記憶部14に一時的に記憶される。
次に、図15(a)、(b)を参照して、第2不具合パターン判定処理(S09)によって検出できる不具合の事例を説明する。本事例では、処理1と処理2が切り替わらない不具合が発生する可能性がある。設計者は、処理1と処理2を交互に実行する意図を持って、コンピュータプログラムを実装していると想定する。「Task1」の起動時に処理1が実行されて「Flag」が「0」にクリアされる。この状態で「Task2」が起動された場合、処理2が実行されるべきであるところ、処理2の前に「Flag」を1にセットする処理を記述している。このため、処理2は実行されない。これにより、処理1は実行されるが、処理2は実行されない。つまり、処理1と処理2が切り替わらなくなってしまう。フラグは「1」にセット或いは「0」にクリアしたら上書きせずに比較しなければならない、という観点で検査することにより、図15(a)、(b)に示す事例の不具合は検出することができる。
そこで、「第2不具合パターン判定」処理(S09)では、第1のステートメント或いは第2のステートメントが実行された後に、第3のステートメントが実行されることなく、再び第1のステートメント或いは第2のステートメントが実行されるか否かを判定する。第2不具合パターン判定部31は、第2不具合パターン判定処理(S09)の結果として、「第2不具合パターン判定結果」(D10)を生成する。図20の表は、「第2不具合パターン判定結果(D10)」の一例を示す。フラグ「val」に関して、「Task1」のステートメント番号2で書込処理を行った後に、「Task2」のステートメント番号2で読み出す処理(比較処理)を行うまでに書込処理が存在しない。よって、第2不具合パターン判定結果はOKとなる。フラグ「F1」に関して、「Task3」のステートメント番号3で書込処理を行った後に、「Task4」のステートメント番号1及び「Task3」のステートメント番号3で読み出す処理(比較処理)を行うまでに書込処理が存在しない。よって、第2不具合パターン判定結果はOKとなる。「第2不具合パターン判定結果(D10)」は記憶部14に一時的に記憶される。
次に、図16(a)、(b)を参照して、第3不具合パターン判定処理(S10)によって検出できる不具合の事例を説明する。本事例では、処理1と処理2が切り替わらない不具合が発生する可能性がある。設計者は、処理1と処理2を交互に実行する意図を持って、コンピュータプログラムを実装していると想定する。「Task1」の起動時に処理1が実行されて「Flag」が「0」にクリアされる。この状態で「Task2」が起動された場合、処理2が実行される。処理2の後、「Flag」は「1」にセットされた後、再び「0」にクリアされる。これにより、処理2は実行されるが、処理1は実行されなくなる。つまり、処理1と処理2が切り替わらなくなってしまう。「1」にセットする処理および、「0」にクリアする処理は必ず一つのタスクでなければならない(2つのタスクに存在してはいけない)という観点で検査することにより、図16(a)、(b)に示す事例の不具合は検出することができる。
そこで、「第3不具合パターン判定」処理(S10)では、分岐ブロックの各々の中で、第1のステートメント及び第2のステートメントの両方のステートメントが実行されているか否かを判定する。第3不具合パターン判定部32は、第3不具合パターン判定処理(S10)の結果として、「第3不具合パターン判定結果」(D11)を生成する。図21の表は、「第3不具合パターン判定結果(D11)」の一例を示す。フラグ「val」及び「F1」に関して、分岐ブロックの各々(ID1〜4)の中で、「1」にセットする処理及び「0」にクリアする処理の両方が実行されていないため、第3不具合パターン判定結果は共にOKとなる。「第3不具合パターン判定結果(D11)」は記憶部14に一時的に記憶される。
次に、第4不具合パターン判定処理(S11)によって検出できる不具合の事例を説明する。先ず、図17(a)〜(c)を参照して正常なコンピュータプログラムの事例を説明する。設計者は、処理1と処理2或いは処理3との間で切り替えて実行する意図でコンピュータプログラムを設計していると想定する。「Task1」の起動時に処理1を実行した場合、その後、「Flag」は「0」にクリアされるので、「Task2」又は「Task3」の起動時に処理2もしくは処理3を実行する。このように、フラグ(Flag)は、「0」及び「1」の間で切り替わることにより、処理1と処理2もしくは処理3とを切り替えて実行する目的で使用される。
次に、図18(a)〜(c)を参照して、第4不具合パターン判定処理(S11)によって検出できる不具合の事例を説明する。処理2を実行した後に「Flag」を「1」にセットする処理を実装していない場合、処理1ではなく処理2や処理3が再度実行されてしまう。処理2を実行した後に処理1を実行することができなくなる。フラグを条件文で比較したら、その後、条件文と同じ分岐ブロックの中で、フラグを書き換える処理を実行しなければならない、という観点で検査することにより、図18(a)〜(c)に示す事例の不具合は検出することができる。
なお、上記した4つの事例に係わる不具合は「Task1」、「Task2」及び「Task3」を個別に評価するテスト(単体テスト)では検出することはできない。また、総ての「Flag」の構造を可視化してもこの不具合を検出することはできない。結合テストで検出することもできない。また、静的解析ツールでこのような観点を持って検証するツールは存在しない。
そこで、「第4不具合パターン判定」処理(S11)では、第3のステートメントが実行された後に、第3のステートメントと同じ分岐ブロックの中で、フラグの値を書き換えるステートメントが実行されているか否かを判定する。第4不具合パターン判定部33は、第4不具合パターン判定処理(S11)の結果として、「第4不具合パターン判定結果」(D12)を生成する。図22の表は、「第4不具合パターン判定結果(D12)」の一例を示す。フラグ「val」に関して、「Task2」のステートメント番号1に記述された比較処理は分岐ブロックID3に属する。分岐ブロックID3内に「1」にセットする処理、もしくは「0」にクリアする処理が存在しない。よって、第4不具合パターン判定結果はNGとなる。また、フラグ「F1」に関して、「Task3」のステートメント番号1に記述された比較処理は分岐ブロックID4に属する。分岐ブロックID4のステートメント番号3に「0」にクリアする処理が記述されている。また、「Task4」のステートメント番号1に記述された比較処理は分岐ブロックID5に属する。分岐ブロックID5のステートメント番号3に「1」にセットする処理が記述されている。よって、第4不具合パターン判定結果はOKとなる。「第4不具合パターン判定結果(D12)」は記憶部14に一時的に記憶される。
以上、不具合可能性判断部26は、第1不具合パターン判定結果(D09)〜第4不具合パターン判定結果(D12)の各々を、不具合可能性判断部26による判断結果として出力する。
次に、不具合可能性判断部26は、図3に示す「結果結合」処理(S12)を実行する。結果結合処理(S12)では、第1不具合パターン判定結果(D09)〜第4不具合パターン判定結果(D12)を記憶部14から読み込み、これらを結合させたものを、不具合可能性判断部26による判断結果として出力する。具体的には、図19〜図22に示す第1不具合パターン判定結果(D09)〜第4不具合パターン判定結果(D12)をまとめた「判断結果一覧」(D13)を生成する。図23の表は、「判断結果一覧(D13)」の一例を示す。図23に示す「第1不具合」〜「第4不具合」は、図19〜図22に示す「第1不具合パターン判定結果」〜「第4不具合パターン判定結果」とそれぞれ同義である。
検査結果出力部27は、結果結合処理(S12)において生成された「判断結果一覧」(D13)を、図1に示す表示装置15或いは入出力装置12に挿入された記憶媒体へ出力する。
ユーザは、出力された「判断結果一覧」(D13)を参照することにより、フラグを用いて2以上の異なる処理を切り替えて実行できなくなる不具合の可能性がある箇所に気づくことができる。例えば、フラグ「val」に関して、プログラム設計者(ユーザ)は、第1不具合パターン判定結果(NG)から、「1」にセットする処理が無いことに気づく。また、第4不具合パターン判定結果(NG)から、「Task2」の4行目に記述された比較処理が存在する分岐ブロックID3の中で、「1」にセットする処理或いは「0」にクリアする処理が無いことが特定される。プログラム設計者(ユーザ)は、この特定事項から、フラグ「val」に関して、分岐ブロックID3内に「1」にセットする処理が無いことに気づく。
図24(a)〜(g)は、図23に示す判断結果一覧(D13)に基づいて、図4(a)〜(g)に示すコンピュータプログラムを修正した結果を示す。図24(b)に示すファイル「Task2.c」の8行目に、フラグ「val」を「1」にセットする処理を示すステートメント「val=1」を追加している点が、図4(b)と相違する。このように、本実施形態では、特定のフラグ処理(書込処理)が抜けていることにより起こりうる不具合を特定することができる。
また、フラグ処理は漏れていなくてもフラグに書き込んでいる値が間違えている事例もある。図25(a)〜(g)は、フラグに書き込んでいる値が間違えているコンピュータプログラムの一例を示す。図26は、図25(a)〜(g)に示すコンピュータプログラムを検査対象とした場合の「判断結果一覧(D13)」の一例を示す。図25(b)に示すファイル「Task2.c」の8行目に、フラグ「val」を「0」にクリアする処理が実装されている。この場合、フラグ「val」を「1」にセットする処理が無いため、第1不具合パターン判定結果はNGとなる。「val」を「0」にクリアする処理が2つのタスクに存在するため、第3具合パターン判定結果はNGとなる。また、分岐ブロックID2の比較処理後に、「val」を「1」にセットする処理が存在しないため、第4不具合パターン判定結果はNGとなる。ユーザは、図26に示す「判断結果一覧」(D13)を参照することにより、フラグ「val」に関して「1」にセットする処理が無く、「0」にクリアする処理が余分にあることに気づく。よって、プログラム設計者(ユーザ)は、ブロックID3に属するフラグ「val」にアクセスする処理のうち、図25(b)の8行目に記述された「0」にクリアする処理が間違いであり、「1」にセットする処理が正しいことに気づくことができる。
また、フラグアクセス処理が漏れておらず、且つ書き込んでいる値に間違えが無い場合であっても、フラグアクセス処理の記述箇所を間違える事例もある。図27(a)〜(g)は、フラグにアクセスする処理が記述された箇所が間違えているコンピュータプログラムの一例を示す。図28は、図27(a)〜(g)に示すコンピュータプログラムを検査対象とした場合の「判断結果一覧(D13)」の一例を示す。図27(b)に示すファイル「Task2.c」の4行目に、フラグ「val」を「1」にセットする処理が実装されている。この場合、「1」にセットする処理があるため、第1不具合パターン判定結果、第3不具合パターン判定結果、及び第4不具合パターン判定結果は、総てOKとなる。しかし、図27(e)に示すファイル「foo.c」の4行目で「val」を「0」にクリアする処理を実行した後に、「val」を読み出す処理を実行することなく、図27(b)に示すファイル「Task2.c」の4行目で「val」を「1」にセットする処理を実行している。このため、第2不具合パターン判定結果はNGとなる。ユーザは、図28に示す「判断結果一覧」(D13)を参照することにより、フラグ「val」の書込処理を実行した後に、フラグ「val」の比較処理を実行する前に、再度書込処理を実行していることに気づく。よって、プログラム設計者(ユーザ)は、ファイル「Task2.c」の4行目で「val」を「1」にセットする処理が間違えていることに気づく。
[実施形態による効果]
このように、実施形態に係わるフラグアクセス不具合検査装置によれば、フラグアクセス処理の漏れ、書き込んでる値の間違い、及びフラグアクセスの記述箇所の間違いを、プログラム設計者(ユーザ)に気づかせることができる。よって、これらのコーディングミスを未然に防止することができる。
このように、実施形態に係わるフラグアクセス不具合検査装置によれば、フラグアクセス処理の漏れ、書き込んでる値の間違い、及びフラグアクセスの記述箇所の間違いを、プログラム設計者(ユーザ)に気づかせることができる。よって、これらのコーディングミスを未然に防止することができる。
なお、コンピュータプログラムに含まれる関数(Task1()、foo()、Task2、calc、output、Task3、Task4)の各々を単体テストを用いて検査する場合を考える。更に、関数「Task2」を設計したプログラム設計者が、関数「Task2」の詳細仕様でフラグ「val」を条件文if(val==0)に特定される分岐ブロックの中で「1」にセットすることに気づいていない場合を想定する。この場合、単体テストでの入力値と出力値が間違えており、単体テストの結果はOKとなり、不具合を特定できない。また、結合テストを用いて関数「Task2」を検査しても同じことになる。また、知見者によるレビューを実施しようとしても、従来、レビューする手段が存在しなかった。例えば、コンピュータプログラムが以前から流用しているソースコード、所謂レガシーコードであって、コンピュータプログラムの仕様が存在しない場合、フラグとして扱われている変数を特定することができない。また、仮にレガシーコードでなくても、フラグとして扱っている変数を設計段階で管理してなければ、どれがフラグであるかが分からない。フラグが特定できたとしても、フラグに関するコンピュータプログラムの構造を可視化することができなく、どのよな構造が不具合のリスクがあるかも分からない。実施形態に係わるフラグアクセス不具合検査装置によれば、単体テスト、結合テスト或いは知見者によるレビューであっても検出することが難しい不具合の箇所をユーザに気づかせることができる。
具体的には、図2に示すように、フラグ検出部21は、検査対象となるソースコードD01の中から、フラグを検出する。アクセス箇所特定部23は、ソースコードD01の中で、フラグ検出部21により検出されたフラグにアクセスするステートメントを特定する。処理内容分類部24は、アクセス箇所特定部23により特定されたステートメントにおけるフラグに対する処理内容を分類する。アクセス順序特定部25は、アクセス箇所特定部23により特定されたステートメントの実行順序を特定する。不具合可能性判断部26は、処理内容分類部24により分類されたフラグに対する処理内容、及びアクセス順序特定部25により特定されたステートメントの実行順序に基づいて、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性の有無を判断する。検査結果出力部27は、不具合可能性判断部26による判断結果を出力する。フラグに対する処理内容及びステートメントの実行順序によってソースコードD01の構造が可視化される。可視化されたソースコードD01の構造に基づいて、フラグを用いて2以上の異なる処理を切り替えて実行できなくなる不具合が発生する可能性の有無を判断することができる。この判断結果を出力することにより、不具合の可能性がある箇所をユーザに気づかせることができる。
処理内容分類部24は、フラグに対する処理内容を、フラグに第1の値(例えば「0」)を書き込む処理、フラグに第1の値とは異なる第2の値(例えば、「1」)を書き込む処理、或いはフラグの値を読み出す処理のいずれかに分類する。フラグに対する処理内容を可視化することができる。可視化されたフラグに対する処理内容に基づいて、フラグを用いて2以上の異なる処理を切り替えて実行できなくなる不具合が発生する可能性の有無を判断することができる。
不具合可能性判断部26は、ソースコードD01の中に、フラグに第1の値を書き込む処理を記述した第1のステートメント、フラグに第2の値を書き込む処理を記述した第2のステートメント、及びフラグの値を読み出す処理を記述した第3のステートメントの総てが含まれているか否かを判定する。第1〜第3のステートメントの総てが含まれていない場合、不具合可能性判断部26は、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する。第1〜第3のステートメントの総てが含まれていない場合、フラグの値が切り替わらない可能性がある。このため、フラグを用いて2以上の異なる処理を切り替えて実行できなくなる可能性があると判断することができる。
不具合可能性判断部26は、第1のステートメント或いは第2のステートメントが実行された後に、第3のステートメントが実行されることなく、再び第1のステートメント或いは第2のステートメントが実行されるか否かを判定する。第3のステートメントが実行されることなく、再び第1のステートメント或いは第2のステートメントが実行される場合、不具合可能性判断部26は、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する。第3のステートメントが実行されることなく、再び第1のステートメント或いは第2のステートメントが実行される場合、フラグの値を切り替えることはできるが、2以上の異なる処理を切り替えて実行できない可能性が有る。このため、フラグを用いて2以上の異なる処理を切り替えて実行できなくなる可能性があると判断することができる。
フラグアクセス不具合検査装置は、ソースコードD01に含まれるステートメントの中から、所定の条件文に基づいて分岐する一群のステートメントからなる分岐ブロックを特定する分岐ブロック特定部22を更に備える。不具合可能性判断部26は、分岐ブロックの各々の中で、第1のステートメント及び第2のステートメントの両方のステートメントが実行されているか否かを判定する。両方のステートメントが実行されている場合、不具合可能性判断部26は、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する。第1及び第2のステートメントの両方が1つの分岐ブロックの中で実行されている場合、フラグを切り替えることはできるが、2以上の異なる処理を切り替えて実行できない可能性が有る。このため、フラグを用いて2以上の異なる処理を切り替えて実行できなくなる可能性があると判断することができる。
不具合可能性判断部26は、第3のステートメントが実行された後に、第3のステートメントと同じ分岐ブロックの中で、フラグの値を書き換えるステートメントが実行されているか否かを判定する。フラグの値を書き換えるステートメントが実行されていない場合、不具合可能性判断部26は、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する。第3のステートメントが実行された後に、第3のステートメントと同じ分岐ブロックの中で、フラグの値を書き換えるステートメントが実行されていない場合、フラグの値が切り替わらない可能性がある。このため、フラグを用いて2以上の異なる処理を切り替えて実行できなくなる可能性があると判断することができる。
上記のように、本発明の実施形態を記載したが、この開示の一部をなす論述及び図面はこの発明を限定するものであると理解すべきではない。この開示から当業者には様々な代替実施の形態、実施例及び運用技術が明らかとなろう。
実施形態(図23)では、第1〜第4不具合パターン判定部(30〜33)の判定結果の各々を、不具合可能性判断部26による判断結果として出力するとする例を示した。この他にも、例えば、不具合可能性判断部26は、第1〜第4不具合パターン判定部(30〜33)の判定結果のうち2つ以上の判定結果を組み合わせて、1つの判断結果を生成してもよい。2つ以上の判定結果を組み合わせることにより、フラグを用いて2以上の異なる処理を切り替えて実行できない可能性を数値化することができる。よって、複数のフラグについての判断結果が出力される場合に、検証対象としての優先度をユーザに伝えることができるので、ユーザによる検証作業の効率を高めることができる。
特願2013−008354号(出願日:2013年1月21日)の全内容は、ここに援用される。
21 フラグ検出部
22 分岐ブロック特定部
23 アクセス箇所特定部
24 処理内容分類部
25 アクセス順序特定部
26 不具合可能性判断部
27 検査結果出力部
30 第1不具合パターン判定部(不具合可能性判断部)
31 第2不具合パターン判定部(不具合可能性判断部)
32 第3不具合パターン判定部(不具合可能性判断部)
33 第4不具合パターン判定部(不具合可能性判断部)
D01 ソースコード(コンピュータプログラム)
22 分岐ブロック特定部
23 アクセス箇所特定部
24 処理内容分類部
25 アクセス順序特定部
26 不具合可能性判断部
27 検査結果出力部
30 第1不具合パターン判定部(不具合可能性判断部)
31 第2不具合パターン判定部(不具合可能性判断部)
32 第3不具合パターン判定部(不具合可能性判断部)
33 第4不具合パターン判定部(不具合可能性判断部)
D01 ソースコード(コンピュータプログラム)
図1を参照して、本発明の実施形態に係わるフラグアクセス不具合検査装置のハードウェア構成を説明する。フラグアクセス不具合検査装置のハードウェア構成として、汎用のコンピュータを用いることができる。例えば、フラグアクセス不具合検査装置は、記憶媒体から検査対象となるコンピュータプログラム(ソースコードD01)を読み込む入出力装置12と、入出力装置12で読み込んだソースコードD01や解析の途中で生成される中間データを一時的に記憶する記憶部14と、各種演算を実行してソースコードD01を解析するCPU(中央処理装置)11と、ユーザが解析に必要な情報を入力するための入力装置13と、CPU11から出力される検査結果を表示する表示装置15とを備える。検査結果は、入出力装置12を用いて記憶媒体に書き込むことも可能である。
また、フラグアクセス不具合検査装置は、クライアントサーバモデルとしても実現可能である。例えば、汎用のパーソナルコンピュータ(クライアント)をコンピュータネットワークを介してサーバに接続する。これにより、図1に示すCPU11を備えるサーバを、コンピュータネットワークを介して、入出力装置12、入力装置13、記憶部14、或いは表示装置15に接続することができる。この場合、フラグアクセス不具合検査装置は、主にCPU11(サーバ)により構成され、入出力装置12、入力装置13、記憶部14、或いは表示装置15はフラグアクセス不具合検査装置に含まれない。この場合、解析の途中で生成される中間データは、記憶部14の代わりに、サーバ11が備える内部ハードディスクに一時的に格納すればよい。
フラグ検出部21は、記憶部14からソースコードD01を読み込み、ソースコードD01の中から、フラグを検出する。「フラグ」とは、ソースコードD01の中でアクセスされている変数のうち、例えば「0」及び「1」等、2つの値のみを設定可能な変数である。「ソースコードD01の中でアクセスされている変数」とは、ソースコードD01の中で書き込み処理或いは読み出し処理の対象として記述された変数を示す。「変数」とは、RAM領域に割り当てられているローカル変数、グローバル変数、スタティック(Static)変数など、ソースコードD01の中でその値の変更が可能なシンボルである。具体的に、変数検出部28は、ソースコードD01の中でアクセスされている変数を検出する。検出された変数は、記憶部14に一時的に記憶される。フラグ抽出部29は、記憶部14に記憶されている変数を読み出し、変数検出部28により検出された変数の中から、フラグを抽出する。フラグ検出部21により抽出されたフラグは、記憶部14に一時的に記憶される。
分岐ブロック特定部22は、記憶部14からソースコードD01を読み込み、ソースコードD01に含まれるステートメントの中から、所定の条件文に基づいて分岐する一群のステートメントからなる分岐ブロックを特定する。「所定の条件文」には、例えばC言語の場合、if文或いはswitch文が含まれる。「所定の条件文に基づいて分岐する一群のステートメント」とは、例えばC言語の場合、if文或いはswitch文、及びその後に続くブラケット”{”,”}”で囲まれた処理単位を指す。予め、条件分岐と判定できる箇所として例えば「if」及び「switch」を定めておく。分岐ブロック特定部22は、解析対象となるソースコードD01の中から、条件分岐と判定できる箇所を特定し、その後に続く“{”と“}”で囲まれた処理単位を分岐ブロックとして特定する。分岐ブロック特定部22により特定された分岐ブロックは、記憶部14に一時的に記憶される。
アクセス箇所特定部23は、記憶部14からソースコードD01及びフラグ検出部21により抽出されたフラグを読み込む。そして、アクセス箇所特定部23は、ソースコードD01の中で、フラグ検出部21により検出されたフラグにアクセスするステートメントを特定する。すなわち、アクセス箇所特定部23は、フラグへのアクセス箇所を特定する。特定されたステートメントを示す情報は、記憶部14に一時的に記憶される。
先ず、CPU11は、検査対象となるソースコードD01を入出力装置12から読み込む。なお、ソースコードD01は、予め入出力装置12を用いてユーザによりフラグアクセス不具合検査装置内に読み込まれ、記憶部14に格納されていてもよい。図4(a)〜(g)は、読み込まれたソースコードD01として、C言語で記述されたコンピュータプログラムの一例を示す。検査対象となるコンピュータプログラムは、図4(a)〜(g)に示す7つのファイルに跨って記述されている。図4(a)のファイル名は「Task1.c」であり、図4(b)のファイル名は「Task2.c」であり、図4(c)のファイル名は「Task3.c」であり、図4(d)のファイル名は「Task4.c」であり、図4(e)のファイル名は「foo.c」であり、図4(f)のファイル名は「calc.c」であり、図4(g)のファイル名は「output.c」である。C言語で記述されたプログラムの一例において、各ファイルの左端部に記載された1から始まる連続番号は、各ファイルの「行番号」を示す。
そこで、「第2不具合パターン判定」処理(S09)では、第1のステートメント或いは第2のステートメントが実行された後に、第3のステートメントが実行されることなく、再び第1のステートメント或いは第2のステートメントが実行されるか否かを判定する。第2不具合パターン判定部31は、第2不具合パターン判定処理(S09)の結果として、「第2不具合パターン判定結果」(D10)を生成する。図20の表は、「第2不具合パターン判定結果(D10)」の一例を示す。フラグ「val」に関して、「Task1」のステートメント番号2で書込処理を行った後に、「Task2」のステートメント番号1で読み出す処理(比較処理)を行うまでに書込処理が存在しない。よって、第2不具合パターン判定結果はOKとなる。フラグ「F1」に関して、「Task3」のステートメント番号1で書込処理を行った後に、「Task4」のステートメント番号1及び「Task3」のステートメント番号3で読み出す処理(比較処理)を行うまでに書込処理が存在しない。よって、第2不具合パターン判定結果はOKとなる。「第2不具合パターン判定結果(D10)」は記憶部14に一時的に記憶される。
そこで、「第4不具合パターン判定」処理(S11)では、第3のステートメントが実行された後に、第3のステートメントと同じ分岐ブロックの中で、フラグの値を書き換えるステートメントが実行されているか否かを判定する。第4不具合パターン判定部33は、第4不具合パターン判定処理(S11)の結果として、「第4不具合パターン判定結果」(D12)を生成する。図22の表は、「第4不具合パターン判定結果(D12)」の一例を示す。フラグ「val」に関して、「Task2」のステートメント番号1に記述された比較処理は分岐ブロックID3に属する。分岐ブロックID3内に「1」にセットする処理、もしくは「0」にクリアする処理が存在しない。よって、第4不具合パターン判定結果はNGとなる。また、フラグ「F1」に関して、「Task3」のステートメント番号1に記述された比較処理は分岐ブロックID3に属する。分岐ブロックID3のステートメント番号3に「0」にクリアする処理が記述されている。また、「Task4」のステートメント番号1に記述された比較処理は分岐ブロックID4に属する。分岐ブロックID4のステートメント番号3に「1」にセットする処理が記述されている。よって、第4不具合パターン判定結果はOKとなる。「第4不具合パターン判定結果(D12)」は記憶部14に一時的に記憶される。
ユーザは、出力された「判断結果一覧」(D13)を参照することにより、フラグを用いて2以上の異なる処理を切り替えて実行できなくなる不具合の可能性がある箇所に気づくことができる。例えば、フラグ「val」に関して、プログラム設計者(ユーザ)は、第1不具合パターン判定結果(NG)から、「1」にセットする処理が無いことに気づく。また、第4不具合パターン判定結果(NG)から、「Task2」の4行目に記述された比較処理が存在する分岐ブロックID2の中で、「1」にセットする処理或いは「0」にクリアする処理が無いことが特定される。プログラム設計者(ユーザ)は、この特定事項から、フラグ「val」に関して、分岐ブロックID2内に「1」にセットする処理が無いことに気づく。
また、フラグ処理は漏れていなくてもフラグに書き込んでいる値が間違えている事例もある。図25(a)〜(g)は、フラグに書き込んでいる値が間違えているコンピュータプログラムの一例を示す。図26は、図25(a)〜(g)に示すコンピュータプログラムを検査対象とした場合の「判断結果一覧(D13)」の一例を示す。図25(b)に示すファイル「Task2.c」の8行目に、フラグ「val」を「0」にクリアする処理が実装されている。この場合、フラグ「val」を「1」にセットする処理が無いため、第1不具合パターン判定結果はNGとなる。「val」を「0」にクリアする処理が2つのタスクに存在するため、第3具合パターン判定結果はNGとなる。また、分岐ブロックID2の比較処理後に、「val」を「1」にセットする処理が存在しないため、第4不具合パターン判定結果はNGとなる。ユーザは、図26に示す「判断結果一覧」(D13)を参照することにより、フラグ「val」に関して「1」にセットする処理が無く、「0」にクリアする処理が余分にあることに気づく。よって、プログラム設計者(ユーザ)は、ブロックID2に属するフラグ「val」にアクセスする処理のうち、図25(b)の8行目に記述された「0」にクリアする処理が間違いであり、「1」にセットする処理が正しいことに気づくことができる。
Claims (8)
- 2つの値のみを設定可能なフラグを用いて2以上の異なる処理を切り替えて実行するコンピュータプログラムを検査するフラグアクセス不具合検査装置であって、
検査対象となる前記コンピュータプログラムの中から、前記フラグを検出するフラグ検出部と、
前記コンピュータプログラムの中で、前記フラグ検出部により検出された前記フラグにアクセスするステートメントを特定するアクセス箇所特定部と、
前記アクセス箇所特定部により特定された前記ステートメントにおける前記フラグに対する処理内容を分類する処理内容分類部と、
前記アクセス箇所特定部により特定された前記ステートメントの実行順序を特定するアクセス順序特定部と、
前記処理内容分類部により分類された前記フラグに対する処理内容、及び前記アクセス順序特定部により特定された前記ステートメントの実行順序に基づいて、前記フラグを用いて2以上の異なる処理を切り替えて実行できない可能性の有無を判断する不具合可能性判断部と、
前記不具合可能性判断部による判断結果を出力する検査結果出力部と
を備えることを特徴とするフラグアクセス不具合検査装置。 - 請求項1に記載のフラグアクセス不具合検査装置であって、
前記処理内容分類部は、前記フラグに対する処理内容を、前記フラグに第1の値を書き込む処理、前記フラグに前記第1の値とは異なる第2の値を書き込む処理、或いは前記フラグの値を読み出す処理のいずれかに分類することを特徴とするフラグアクセス不具合検査装置。 - 請求項2に記載のフラグアクセス不具合検査装置であって、
前記不具合可能性判断部は、前記コンピュータプログラムの中に、前記フラグに第1の値を書き込む処理を記述した第1のステートメント、前記フラグに前記第2の値を書き込む処理を記述した第2のステートメント、及び前記フラグの値を読み出す処理を記述した第3のステートメントの総てが含まれているか否かを判定し、前記第1〜第3のステートメントの総てが含まれていない場合、前記フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する
ことを特徴とするフラグアクセス不具合検査装置。 - 請求項2又は3に記載のフラグアクセス不具合検査装置であって、
前記不具合可能性判断部は、前記フラグに第1の値を書き込む処理を記述した第1のステートメント或いは前記フラグに第2の値を書き込む処理を記述した第2のステートメントが実行された後に、前記フラグの値を読み出す処理を記述した第3のステートメントが実行されることなく、再び前記第1のステートメント或いは前記第2のステートメントが実行されるか否かを判定し、前記第3のステートメントが実行されることなく、再び前記第1のステートメント或いは前記第2のステートメントが実行される場合、前記フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する
ことを特徴とするフラグアクセス不具合検査装置。 - 請求項2〜4のいずれか一項に記載のフラグアクセス不具合検査装置であって、
前記コンピュータプログラムに含まれるステートメントの中から、所定の条件文に基づいて分岐する一群のステートメントからなる分岐ブロックを特定する分岐ブロック特定部を更に備え、
前記不具合可能性判断部は、前記分岐ブロックの各々の中で、前記フラグに第1の値を書き込む処理を記述した第1のステートメント及び前記フラグに第2の値を書き込む処理を記述した第2のステートメントの両方のステートメントが実行されているか否かを判定し、前記両方のステートメントが実行されている場合、前記フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する
ことを特徴とするフラグアクセス不具合検査装置。 - 請求項2〜5のいずれか一項に記載のフラグアクセス不具合検査装置であって、
前記コンピュータプログラムに含まれるステートメントの中から、所定の条件文に基づいて分岐する一群のステートメントからなる分岐ブロックを特定する分岐ブロック特定部を更に備え、
前記不具合可能性判断部は、前記フラグの値を読み出す処理を記述した第3のステートメントが実行された後に、前記第3のステートメントと同じ分岐ブロックの中で、前記フラグの値を書き換えるステートメントが実行されているか否かを判定し、前記フラグの値を書き換えるステートメントが実行されていない場合、前記フラグを用いて2以上の異なる処理を切り替えて実行できない可能性が有ると判断する
ことを特徴とするフラグアクセス不具合検査装置。 - 2つの値のみを設定可能なフラグを用いて2以上の異なる処理を切り替えて実行するコンピュータプログラムを検査するフラグアクセス不具合検査方法であって、
検査対象となる前記コンピュータプログラムの中から、前記フラグを検出し、
前記コンピュータプログラムの中で、検出された前記フラグにアクセスするステートメントを特定し、
特定された前記ステートメントにおける前記フラグに対する処理内容を分類し、
特定された前記ステートメントの実行順序を特定し、
分類された前記フラグに対する処理内容、及び特定された前記ステートメントの実行順序に基づいて、前記フラグを用いて2以上の異なる処理を切り替えて実行できない可能性の有無を判断し、
前記判断の結果を出力する
ことを特徴とするフラグアクセス不具合検査方法。 - 2つの値のみを設定可能なフラグを用いて2以上の異なる処理を切り替えて実行するコンピュータプログラムを検査するためのフラグアクセス不具合検査プログラムであって、
コンピュータに、
検査対象となる前記コンピュータプログラムの中から、前記フラグを検出する機能と、
前記コンピュータプログラムの中で、検出された前記フラグにアクセスするステートメントを特定する機能と、
特定された前記ステートメントにおける前記フラグに対する処理内容を分類する機能と、
特定された前記ステートメントの実行順序を特定する機能と、
分類された前記フラグに対する処理内容、及び特定された前記ステートメントの実行順序に基づいて、前記フラグを用いて2以上の異なる処理を切り替えて実行できない可能性の有無を判断する機能と、
前記判断の結果を出力する機能と
を実現させることを特徴とするフラグアクセス不具合検査プログラム。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2013008354 | 2013-01-21 | ||
JP2013008354 | 2013-01-21 | ||
PCT/JP2013/084880 WO2014112316A1 (ja) | 2013-01-21 | 2013-12-26 | フラグアクセス不具合検査装置、フラグアクセス不具合検査方法、フラグアクセス不具合検査プログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP5962779B2 JP5962779B2 (ja) | 2016-08-03 |
JPWO2014112316A1 true JPWO2014112316A1 (ja) | 2017-01-19 |
Family
ID=51209418
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2014557381A Active JP5962779B2 (ja) | 2013-01-21 | 2013-12-26 | フラグアクセス不具合検査装置、フラグアクセス不具合検査方法、フラグアクセス不具合検査プログラム |
Country Status (3)
Country | Link |
---|---|
JP (1) | JP5962779B2 (ja) |
CN (1) | CN104937559B (ja) |
WO (1) | WO2014112316A1 (ja) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110162482A (zh) * | 2019-06-11 | 2019-08-23 | 宋岩 | 一种标志访问缺陷检查装置和标志访问缺陷检查方法 |
US20230063382A1 (en) * | 2020-02-27 | 2023-03-02 | Nippon Telegraph And Telephone Corporation | Signature generation device, signature generation method, and signature generation program |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH07219819A (ja) * | 1993-12-10 | 1995-08-18 | Nec Corp | プログラム評価データ作成方法 |
JP2003316615A (ja) * | 2002-04-26 | 2003-11-07 | Nissan Motor Co Ltd | 演算順序チェック装置およびその方法 |
JP2006331027A (ja) * | 2005-05-25 | 2006-12-07 | Nissan Motor Co Ltd | 検査装置、検査方法、及び検査プログラム |
JP4218766B2 (ja) * | 2006-03-09 | 2009-02-04 | インターナショナル・ビジネス・マシーンズ・コーポレーション | シナリオをテストする方法、装置、及びプログラム |
JP2008090696A (ja) * | 2006-10-04 | 2008-04-17 | Nissan Motor Co Ltd | プログラム解析装置及びプログラム解析方法 |
-
2013
- 2013-12-26 JP JP2014557381A patent/JP5962779B2/ja active Active
- 2013-12-26 CN CN201380071049.XA patent/CN104937559B/zh active Active
- 2013-12-26 WO PCT/JP2013/084880 patent/WO2014112316A1/ja active Application Filing
Also Published As
Publication number | Publication date |
---|---|
JP5962779B2 (ja) | 2016-08-03 |
CN104937559B (zh) | 2016-10-26 |
WO2014112316A1 (ja) | 2014-07-24 |
CN104937559A (zh) | 2015-09-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9342285B2 (en) | Method and apparatus for detecting code change | |
US8209658B2 (en) | Method of creating signatures for classifying program failures | |
CN106776334B (zh) | 基于注释生成测试用例方法及装置 | |
US7685471B2 (en) | System and method for detecting software defects | |
CN110688658B (zh) | 未知病毒感染追溯方法、装置及系统 | |
JP5962779B2 (ja) | フラグアクセス不具合検査装置、フラグアクセス不具合検査方法、フラグアクセス不具合検査プログラム | |
JP5967225B2 (ja) | データ更新漏れ検査装置、データ更新漏れ検査方法、データ更新漏れ検査プログラム | |
JP6107455B2 (ja) | テストスケジュール決定装置、プログラム | |
US8291389B2 (en) | Automatically detecting non-modifying transforms when profiling source code | |
CN108804308B (zh) | 新版本程序缺陷检测方法及装置 | |
US8589342B2 (en) | Log message optimization to ignore or identify redundant log messages | |
DeMott et al. | Towards an automatic exploit pipeline | |
US9600245B2 (en) | Computer-implemented method for generating control unit program code and message management environment relating thereto | |
US20150199183A1 (en) | Program analysis apparatus and program analysis method | |
JP6015778B2 (ja) | 変数アクセス一貫性検査装置、変数アクセス一貫性検査方法、変数アクセス一貫性検査プログラム | |
JPWO2015008575A1 (ja) | ソフトウェア検査装置、ソフトウェア検査方法、ソフトウェア検査プログラム | |
JP6037034B2 (ja) | ソフトウェア検査装置、ソフトウェア検査方法、ソフトウェア検査プログラム | |
JP2021096685A (ja) | テスト実行プログラム、テスト実行方法、およびテスト実行装置 | |
JP5343840B2 (ja) | プログラムの解析装置及び解析方法 | |
CN111611153B (zh) | 一种用户界面过度绘制的检测方法和装置 | |
KR20240129928A (ko) | 러스트 언어를 위한 취약점 탐지 장치, 취약점 탐지 방법 및 컴퓨터 프로그램 | |
JP2013061893A (ja) | 情報処理装置及び情報処理方法及びプログラム | |
JP6476994B2 (ja) | 指摘選別装置、指摘選別方法及びプログラム | |
JP6397800B2 (ja) | テスト支援システムおよびテスト支援方法 | |
CN116185716A (zh) | 数据还原方法、装置、电子设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20160531 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20160613 |
|
R151 | Written notification of patent or utility model registration |
Ref document number: 5962779 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R151 |