JPWO2018193548A1 - 等価性検証装置 - Google Patents
等価性検証装置 Download PDFInfo
- Publication number
- JPWO2018193548A1 JPWO2018193548A1 JP2019513138A JP2019513138A JPWO2018193548A1 JP WO2018193548 A1 JPWO2018193548 A1 JP WO2018193548A1 JP 2019513138 A JP2019513138 A JP 2019513138A JP 2019513138 A JP2019513138 A JP 2019513138A JP WO2018193548 A1 JPWO2018193548 A1 JP WO2018193548A1
- Authority
- JP
- Japan
- Prior art keywords
- function
- statement
- equivalence
- check
- program
- 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/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3692—Test management for test results analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
Description
このような状況下で収益力を維持または強化するには、制御プログラムの開発において、生産性の向上に取り組む必要がある。具体的な施策としては、通信処理、タイマ処理、スケジューラ、OS(Operating System)およびミドルウェアなどのプログラムの実行環境を導入することによって、プログラム開発を差分開発または派生開発へ移行することが考えられる。また、差分開発および派生開発の運用において、プログラムの品質確保および作業の効率化を実現するためのプログラム開発手法およびプログラム開発ツールをプログラム開発に適用することが考えられる。
特許文献1の技術では、プログラムの入力値列とプログラムの内部状態値列とプログラムの出力値列とソフトウェアの要件を記述した検査条件とが、充足可能性問題の制約条件として記述される。そして、プログラムが制約条件に違反しているか、充足可能性判定ツールで検査される。
特許文献2の技術では、内部状態値列の遷移が、定義された状態遷移と同じになるかを検証することによって、プログラムが検査される。
等価性検査は、二つのプログラムの間で論理的に演算内容が同じかどうかを関数単位で判定する技術である。
具体的には、一方のプログラムの関数に対する入力値列が他方のプログラムの関数に対する入力値列と等しいという条件のもと、それぞれの関数の出力値列が互いに一致するかどうか、充足可能性判定ツールまたはモデル検査ツールを利用して判定される。それぞれの関数の出力値列が互いに一致する場合、関数同士が等価であると判定される。
例えば、新たな実行環境への移行の前後またはバージョンの変更の前後における二つのプログラムの間で、演算内容が論理的に変更されていない同等部分と演算内容が論理的に変更された差異部分とを特定するために、等価性検証が行われる。
しかし、従来の等価性検証は、関数内で前のステップから次のステップへ引き継がれる内部状態値列を考慮していない。
例えば、同じ入力値列に対して常に同じ出力値列を返す関数の場合、内部状態値列は無いため、従来の等価性検査によって関数の等価性を正しく検査することができる。しかし、ステップごとに遷移する内部状態値列に依存して出力値列が決まる関数の場合、内部状態値列が有るため、従来の等価性検査によって関数同士の等価性を正しく検査することができない。ステップは、関数を呼び出して実行する工程である。
第1関数と第2関数との等価性を検査する形態について、図1から図18に基づいて説明する。
図1に基づいて、等価性検証装置100の構成を説明する。
等価性検証装置100は、プロセッサ901とメモリ902と補助記憶装置903といったハードウェアを備えるコンピュータである。これらのハードウェアは、信号線を介して互いに接続されている。
メモリ902は揮発性の記憶装置である。メモリ902は、主記憶装置またはメインメモリとも呼ばれる。例えば、メモリ902はRAM(Random Access Memory)である。メモリ902に記憶されたデータは必要に応じて補助記憶装置903に保存される。
補助記憶装置903は不揮発性の記憶装置である。例えば、補助記憶装置903は、ROM(Read Only Memory)、HDD(Hard Disk Drive)、またはフラッシュメモリである。補助記憶装置903に記憶されたデータは必要に応じてメモリ902にロードされる。
さらに、補助記憶装置903にはOS(Operating System)が記憶されている。OSの少なくとも一部は、メモリ902にロードされて、プロセッサ901によって実行される。
つまり、プロセッサ901は、OSを実行しながら、等価性検証プログラムを実行する。
等価性検証プログラムを実行して得られるデータは、メモリ902、補助記憶装置903、プロセッサ901内のレジスタまたはプロセッサ901内のキャッシュメモリといった記憶装置に記憶される。
第1プログラム210は、第1プログラムの具体例であり、記憶部191に予め記憶される。
第1プログラムは、等価性検査の対象となる2つのプログラムのうちの一方のプログラムである。
第1関数xは、第1関数の具体例である。
第1関数は、等価性検査の対象となる2つの関数のうちの一方の関数である。
第1関数は、第1プログラムに含まれる。例えば、第1関数xは、第1プログラム210に含まれる。
第1関数は、第1プログラムにおいて複数回実行される。例えば、第1関数xは、第1プログラム210のmain関数において特定の条件が満たされる間、繰り返し実行される。
第1関数は第1状態変数を使用し、第1状態変数の値は第1関数の実行の度に変わる。例えば、第1関数xは第1状態変数state_xを使用し、第1状態変数state_xの値は第1関数xの実行の度に変わる。具体的には、第1状態変数state_xの初期値は0である。第1状態変数state_xの値が0である場合に第1関数xが実行されると第1状態変数state_xの値は1に変わる。第1状態変数state_xの値が1である場合に第1関数xが実行されると第1状態変数state_xの値は2に変わる。第1状態変数state_xの値が2である場合に第1関数xが実行されると第1状態変数state_xの値は0に変わる。
第1関数は、第1状態変数に対応する値を出力する。例えば、第1関数xは、第1状態変数state_xに対応する値を出力する。具体的には、第1状態変数state_xの値が0である場合、第1関数xの出力値はin+1である。第1状態変数state_xの値が1である場合、第1関数xの出力値はin+2である。第1状態変数state_xの値が2である場合、第1関数xの出力値はin+3である。第1関数におけるinは第1関数xの入力値である。
第1初期化関数state_x_initは、第1初期化関数の具体例である。
第1初期化関数は、第1状態変数を初期化する関数である。具体的には、第1初期化関数state_x_initは、第1状態変数state_xに初期値0を設定する。
第2プログラム220は、第2プログラムの具体例であり、記憶部191に予め記憶される。
第2プログラムは、等価性検査の対象となる2つのプログラムのうちの他方のプログラムである。
第2関数yは、第2関数の具体例である。
第2関数は、等価性検査の対象となる2つの関数のうちの他方の関数である。
第2関数は、第2プログラムに含まれる。例えば、第2関数yは、第2プログラム220に含まれる。
第2関数は、第2プログラムにおいて複数回実行される。例えば、第2関数yは、第2プログラム220のmain関数において特定の条件が満たされる間、繰り返し実行される。
第2関数は第2状態変数を使用し、第2状態変数の値は第2関数の実行の度に変わる。例えば、第2関数yは第2状態変数state_yを使用し、第2状態変数state_yの値は第2関数yの実行の度に変わる。具体的には、第2状態変数state_yの初期値は1である。第2状態変数state_yの値が1である場合に第2関数yが実行されると第2状態変数state_yの値は2に変わる。第2状態変数state_yの値が2である場合に第2関数yが実行されると第2状態変数state_yの値は3に変わる。第2状態変数state_yの値が3である場合に第2関数yが実行されると第2状態変数state_yの値は1に変わる。
第2関数は、第2状態変数に対応する値を出力する。例えば、第2関数yは、第2状態変数state_yに対応する値を出力する。具体的には、第2状態変数state_yの値が1である場合、第2関数yの出力値はin+1である。第2状態変数state_yの値が2である場合、第2関数yの出力値はin+2である。第2状態変数state_yの値が3である場合、第2関数yの出力値はin+3である。第2関数におけるinは第2関数の入力値である。
第2初期化関数state_y_initは、第2初期化関数の具体例である。
第2初期化関数は、第2状態変数を初期化する関数である。具体的には、第2初期化関数state_y_initは、第2状態変数state_yに初期値1を設定する。
等価性検査の対象となるプログラムを対象プログラムという。具体的には、対象プログラムは第1プログラム210および第2プログラム220である。
等価性検査の対象となる関数を対象関数という。具体的には、対象関数は第1関数xおよび第2関数yである。
状態変数の値を状態値という。具体的には、状態値は第1状態変数state_xの値および第2状態変数state_yの値である。
ステップは、対象関数を呼び出して実行する工程である。
ステップ数は、対象関数が呼び出される回数、すなわち、対象関数が実行される回数である。
ステップ間において、対象関数の状態値が引き継がれる。つまり、第1ステップが終了したときの状態値が第2ステップで使用され、第2ステップが終了したときの状態値が第3ステップで使用される。入力値および出力値はステップ間で引き継がれない。
対象情報230は、記憶部191に予め記憶される。
対象情報230は、対象関数の入力変数、出力変数および初期化関数を示す。
入力変数は、入力値が設定される変数である。入力値は、関数に入力される値である。
出力変数は、出力値が設定される変数である。出力値は、関数から出力される値である。
入力値列は、ステップ数と同じ数の入力値であり、対象関数のステップ数毎の入力値から成る。in_x[t]は第1関数xの第tステップの入力値である。in_y[t]は第2関数yの第tステップの入力値である。
出力値列は、ステップ数と同じ数の出力値であり、対象関数のステップ数毎の出力値から成る。out_x[t]は第1関数xの第tステップの出力値である。out_y[t]は第2関数yの第tステップの出力値である。
入力値列および出力値列は、記憶部191に保存される。
検査ヘッダ240は、第1関数xと第1初期化関数state_x_initと第2関数yと第2初期化関数state_y_initとを検査ラッパー250から参照するために生成されるヘッダである。検査ヘッダ240の詳細については後述する。
検査ラッパー250は、第1関数xと第2関数yとの等価性を検査するために生成される検査ラッパーである。検査ラッパー250の詳細については後述する。
モデル検査ツールは、等価性検査を行う従来のツールである。
等価性検査では、事前条件の下で事後条件を満たすか検査される。事前条件の下で事後条件を満たす場合、対象関数同士が等価である。
等価性検証装置100の動作は等価性検証方法に相当する。また、等価性検証方法の手順は等価性検証プログラムの手順に相当する。
ステップS110において、生成部110は、検査ヘッダ240と検査ラッパー250とを生成する。
検査ヘッダ240は、図2の第1プログラム210と図3の第2プログラム220とに基づいて生成される。
検査ヘッダ240は、宣言文241と宣言文242とを含んでいる。
宣言文241は、第1関数xと第2関数yとを検査ラッパー250から参照するための宣言文である。
宣言文242は、第1初期化関数state_x_initと第2初期化関数state_y_initとを検査ラッパー250から参照するための宣言文である。
検査ラッパー250は、インクルード文251と定義文252と定義部分253と事前条件文254と初期化文255とループ文256と事後条件文257とを含んでいる。
インクルード文251は、検査ヘッダ240をインクルードする文である。
定義文252は、検査ステップ数を定義する文である。検査ステップ数は、ループ文256において第1関数xと第2関数yとを呼び出す回数である。
定義部分253は、検査関数judge_x_yの定義部分である。
事前条件文254は、第1関数xと第2関数yとの入力値同士が等しいという事前条件を定義する文である。
初期化文255は、第1状態変数state_xと第2状態変数state_yとを初期化するための文である。具体的には、初期化文255は、第1初期化関数state_x_initと第2初期化関数state_y_initとを呼び出す文である。初期化文255は、ループ文256より前に実行される文として記述される。
ループ文256は、第1関数xと第2関数yとを繰り返し呼び出すための文である。
事後条件文257は、第1関数xと第2関数yとの出力値同士が等しいという事後条件を定義する文である。
ステップS111において、生成部110は、検査ヘッダ240(図9参照)を生成する。
具体的には、生成部110は、宣言文241と宣言文242とを記述する。宣言文241と宣言文242とが記述されたファイルが検査ヘッダ240である。
生成部110は、第1プログラム210に対する構文解析を行うことによって第1プログラム210から第1関数xのプロトタイプを抽出し、第1関数xのプロトタイプを用いて第1関数xのextern宣言を生成する。
生成部110は、第2プログラム220に対する構文解析を行うことによって第2プログラム220から第2関数yのプロトタイプを抽出し、第2関数yのプロトタイプを用いて第2関数yのextern宣言を生成する。
そして、生成部110は、第1関数xのextern宣言と第2関数yのextern宣言とを記述する。
第1関数xのextern宣言および第2関数yのextern宣言が宣言文241である。
生成部110は、第1プログラム210に対する構文解析を行うことによって第1プログラム210から第1初期化関数state_x_initのプロトタイプを抽出する。生成部110は、第1初期化関数state_x_initのプロトタイプを用いて第1初期化関数state_x_initのextern宣言を生成する。
生成部110は、第2プログラム220に対する構文解析を行うことによって第2プログラム220から第2初期化関数state_y_initのプロトタイプを抽出する。生成部110は、第2初期化関数state_y_initのプロトタイプを用いて第2初期化関数state_y_initのextern宣言を生成する。
そして、生成部110は、第1初期化関数state_x_initのextern宣言と第2初期化関数state_y_initのextern宣言とを記述する。
第1初期化関数state_x_initのextern宣言および第2初期化関数state_y_initのextern宣言が宣言文242である。
具体的には、生成部110は、検査ヘッダ240のファイル名(analysis.h)を用いてインクルード文251を生成し、生成されたインクルード文251を検査ラッパー250の先頭に記述する。
具体的には、生成部110は、ステップ変数の変数名(STEP)と検査ステップ数(3)とを用いて定義文252を生成し、生成された定義文252をインクルード文251の下に記述する。ステップ変数の変数名および検査ステップ数は予め決められている。
まず、生成部110は、検査関数judge_x_yのプロトタイプを記述する。「void judge_x_y(){}」は検査関数judge_x_yのプロトタイプである。
次に、生成部110は、第1関数x用の入力変数と第2関数y用の入力変数との組を検査ステップ数と同じ数だけ生成し、生成された入力変数の組を検査関数judge_x_yの引数として記述する。in_x1およびin_x2が第1関数x用の入力変数である。in_y1およびin_y2が第2関数y用の入力変数である。
そして、生成部110は、検査関数judge_x_yの中で使用される内部変数を定義する定義文を定義文の形式に従って生成し、生成された定義文を検査関数judge_x_yの中に記述する。定義文の形式は予め決められている。
1つ目の定義文は内部変数iを定義する文である。内部変数iは、ループ文256においてループ数を制御するために用いられる変数である。
2つ目の定義文は内部変数in_x[]を定義する文である。内部変数in_x[]は第1関数x用の入力変数の値が設定される配列である。
3つ目の定義文は内部変数in_y[]を定義する文である。内部変数in_y[]は第2関数y用の入力変数の配列である。
4つ目の定義文は内部変数out_x[]と内部変数out_y[]とを定義する文である。内部変数out_x[]は第1関数xの出力値が設定される配列である。内部変数out_y[]は第2関数yの出力値が設定される配列である。
具体的には、生成部110は、検査ステップ数と同じ数の事前条件文を事前条件文の形式に従って生成し、生成された事前条件文を定義部分253の4つの定義文の下に記述する。生成された事前条件文が事前条件文254である。事前条件文の形式は予め決められている。
第n事前条件文は、第1関数xと第2関数yとのn回目の呼び出しにおいて第1関数xと第2関数yとの入力値同士が等しいという事前条件を定義する文である。nは1以上検査ステップ数以下の整数である。
具体的には、生成部110は、第1初期化関数state_x_initの関数名を用いて第1初期化文を生成し、第2初期化関数state_y_initの関数名を用いて第2初期化文を生成する。そして、生成部110は、第1初期化文と第2初期化文とを事前条件文254の下に記述する。第1初期化文および第2初期化文が初期化文255である。第1初期化文は第1初期化関数state_x_initを呼び出す文であり、第2初期化文は第2初期化関数state_y_initを呼び出す文である。
具体的には、生成部110は、内部変数iの値が検査ステップ数以下であることを繰り返しの条件とするfor文を初期化文255の下に記述する。そして、生成部110は、第1呼び出し文と第2呼び出し文とを呼び出し文の形式に従って生成し、第1呼び出し文と第2呼び出し文とをfor文の中に記述する。呼び出し文の形式は予め決められている。
第1呼び出し文は、i回目のループにおいて、第1関数x用の内部変数in_x[i]の値を入力値として第1関数xを呼び出して、第1関数x用の内部変数out_x[i]に第1関数xの出力値を設定するための文である。
第2呼び出し文は、i回目のループにおいて、第2関数y用の内部変数in_y[i]の値を入力値として第2関数yを呼び出して、第2関数y用の内部変数out_x[i]に第2関数yの出力値を設定するための文である。
具体的には、生成部110は、検査ステップ数と同じ数の事後条件文を事後条件文の形式に従って生成し、生成された事後条件文をループ文256の下に記述する。検査ステップ数と同じ数の事後条件文が事後条件文257である。
第n事後条件文は、第1関数xと第2関数yとのn回目の呼び出しにおいて第1関数xと第2関数yとの出力値同士が等しいという事後条件を定義する文である。nは1以上検査ステップ数以下の整数である。
ステップS120において、加工部120は、等価性検査のために第1プログラム210と第2プログラム220とを加工する。
加工後の第1プログラム210は、インクルード文211を含んでいる。
インクルード文211は、検査ヘッダ240をインクルードする文である。
加工後の第2プログラム220は、インクルード文221を含んでいる。
インクルード文221は、検査ヘッダ240をインクルードする文である。
ステップS121において、加工部120は、第1プログラム210にインクルード文211(図12参照)を記述する。
さらに、加工部120は、第2プログラム220にインクルード文221(図13参照)を記述する。
インクルード文211とインクルード文221とは互いに同じ文である。
具体的には、加工部120は、検査ヘッダ240のファイル名(analysis.h)を用いてインクルード文(211、221)を生成する。そして、加工部120は、生成されたインクルード文211を第1プログラム210の先頭に記述する。さらに、加工部120は、生成されたインクルード文221を第2プログラム220の先頭に記述する。
第1プログラム210の初期化関数名が第2プログラム220の初期化関数名と同じである場合、処理はステップS123に進む。
第1プログラム210の初期化関数名が第2プログラム220の初期化関数名と異なる場合、処理はステップS124に進む。
例えば、図15に示すように、第1プログラム210の初期化関数名と第2プログラム220の初期化関数名とが共にfuncである場合、加工部120は、それぞれの初期化関数名に識別子を付加する。具体的には、加工部120は、第1プログラム210の初期化関数名をfuncからfunc_aに変更し、第2プログラム220の初期化関数名をfuncからfunc_bに変更する。「_a」および「_b」が付加された識別子である。
第1プログラム210の対象関数名が第2プログラム220の対象関数名と同じである場合、処理はステップS125に進む。
第1プログラム210の対象関数名が第2プログラム220の対象関数名と異なる場合、加工処理(S120)は終了する。
例えば、図15に示すように、第1プログラム210の対象関数名と第2プログラム220の対象関数名とが共にfuncである場合、加工部120は、それぞれの対象関数名に識別子を付加する。具体的には、加工部120は、第1プログラム210の対象関数名をfuncからfunc_aに変更し、第2プログラム220の対象関数名をfuncからfunc_bに変更する。「_a」および「_b」が付加された識別子である。
ステップS130において、検査部130は、第1関数xと第2関数yとの等価性を検査する。
検査処理(S130)において、第1プログラム210は加工後の第1プログラム210を意味し、第2プログラム220は加工後の第2プログラム220を意味する。
これにより、第1関数xと第2関数yとが呼び出された回数毎に、第1関数xと第2関数yとの等価性が判定される。
変換機能を有するモデル検査ツールと変換機能を有さないモデル検査ツールが存在する。
変換機能は、対象プログラムと検査ラッパーとを検査コードに変換する機能である。
検査コードは、等価性検査用のプログラムコードである。
モデル検査ツールが変換機能を有する場合、検査部130は、第1プログラム210と第2プログラム220と検査ラッパー250とを入力として、モデル検査ツールを実行する。
モデル検査ツールが実行されると、第1プログラム210と第2プログラム220と検査ラッパー250とが検査コードに変換され、検査コードが実行される。検査コードが実行されると、実行結果260が出力される。
そして、検査部130は、検査コードを入力として、モデル検査ツールを実行する。
モデル検査ツールが実行されると、実行結果260が出力される。
実行結果260は、検査ラッパー250を用いてモデル検査ツールを実行することによって得られる結果である。
実行結果260は、第1ステップと第2ステップとの両方で第1関数xと第2関数yとが等価であることを示している。
出力値nは第nステップにおける第1関数xの出力値を意味し、出力値n’は第nステップにおける第2関数yの出力値を意味する。SUCCESSは事後条件を満たしたことを意味する。つまり、SUCCESSは等価を意味する。
第nステップは、第1関数xと第2関数yとがn回呼び出された段階を意味する。nは1以上検査ステップ数以下の整数である。
ステップS132において、検査部130は、ステップS131で得られた結果に基づいて、第1関数xと第2関数yとが検査ステップ数まで等価であったか判定する。
第1関数xと第2関数yとが検査ステップ数まで等価であった場合、処理はステップS134に進む。
第1関数xと第2関数yとが等価でない検査ステップがあった場合、処理はステップS133に進む。
不等価ステップ数は、第1関数xと第2関数yとが不等価となるときのステップ数、すなわち、第1関数xと第2関数yとが不等価となるときの呼び出し回数である。具体的には、不等価ステップ数は、第1関数xと第2関数yとが不等価となる最初のステップ数である。
例えば、ステップS131で得られた結果が図18の実行結果261である場合、第1ステップおよび第2ステップの判定結果がSUCCESSであり、第3ステップの判定結果がFAILUREであるため、不等価ステップ数は3である。FAILUREは事後条件を満たさなかったことを意味する。つまり、FAILUREは不等価を意味する。
検査結果は、第1関数xと第2関数yとが検査ステップ数まで等価であるか否かを示す。
第1関数xと第2関数yとが検査ステップ数まで等価でない場合、検査結果は、さらに、不等価ステップ数を示す。
前のステップから次のステップへ値を保持する状態値を保有する関数同士の等価性検査を実現することができる。具体的には、設定されたステップ数において等価または不等価という判定結果を得ることができる。
対象プログラム、対象関数、検査ラッパーおよび検査ヘッダはc言語以外のプログラミング言語を用いて記述されても構わない。検査ヘッダが無くても検査ラッパーから対象関数を呼び出すことが可能であれば、検査ヘッダは不要である。
検査ステップ数を決定する形態について、主に実施の形態1と異なる点を図19から図30に基づいて説明する。
図19に基づいて、等価性検証装置100の構成を説明する。
等価性検証装置100は、さらに、解析部140をソフトウェア要素として備える。
等価性検証プログラムは、さらに、解析部140としてコンピュータを機能させる。
対象情報231は、対象情報の一例であり、記憶部191に予め記憶されている。
対象情報231は、入力変数と出力変数と初期化関数との他に、状態変数を示している。
検査ヘッダ240は、第1プログラム210と第1解析ラッパー270とにインクルードされる。
第1解析ラッパー270は、第1巡回数を求めるための等価性検査で使用される検査ラッパーである。
第1巡回数は、第1状態変数の値が初期値に戻るときの第1関数の呼び出し回数である。
第1解析ラッパー270の詳細については後述する。
検査ヘッダ240は、第2プログラム220と第2解析ラッパー280とにインクルードされる。
第2解析ラッパー280は、第2巡回数を求めるための等価性検査で使用される検査ラッパーである。
第2巡回数は、第2状態変数の値が初期値に戻るときの第2関数の呼び出し回数である。
第2解析ラッパー280の詳細については後述する。
図22に基づいて、等価性検証方法を説明する。
ステップS210において、解析部140は、検査ラッパー250に定義する検査ステップ数を決定する。検査ステップ数を決定する方法については後述する。
但し、ステップS220において、生成部110は、ステップS210で決定された検査ステップ数を定義する文を定義文252として検査ラッパー250に記述する。
また、ステップS240において、第1関数と第2関数とが等価であると判定された場合、第1関数と第2関数とは完全に等価である。完全に等価とは、ステップ数に関わらず関数同士が等価であることを意味する。
ステップS211において、生成部110は、第1解析ラッパー270および第2解析ラッパー280を生成する。
第1解析ラッパー270は、インクルード文271と定義文272と定義部分273と事前条件文274と初期化文275とループ文276と事後条件文277とを含んでいる。
インクルード文271は、検査ヘッダ240をインクルードする文である。
定義文272は、解析ステップ数を定義する文である。
定義部分273は、検査関数step_judge_xの定義部分である。
事前条件文274は、第1関数xの1回目の入力値が第1関数xの2回目以降の入力値と等しいという第1事前条件を定義する文である。
初期化文275は、第1状態変数state_xを初期化するための文である。具体的には、初期化文275は、第1初期化関数state_x_initを呼び出す文である。初期化文275は、ループ文276より前に実行される文として記述される。
ループ文276は、第1関数xを繰り返し呼び出すための文である。
事後条件文277は、第1関数xの1回目の出力値が第1関数xの2回目以降の出力値と等しい、且つ、第1関数xの1回目の第1状態変数の値が第1関数xの2回目以降の第1状態変数の値と等しいという第1事後条件を定義する文である。
第2解析ラッパー280は、インクルード文281と定義文282と定義部分283と事前条件文284と初期化文285とループ文286と事後条件文287とを含んでいる。
インクルード文281は、検査ヘッダ240をインクルードする文である。
定義文282は、解析ステップ数を定義する文である。
定義部分283は、検査関数step_judge_yの定義部分である。
事前条件文284は、第2関数yの1回目の入力値が第2関数yの2回目以降の入力値と等しいという第2事前条件を定義する文である。
初期化文285は、第2状態変数state_yを初期化するための文である。具体的には、初期化文285は、第2初期化関数state_y_initを呼び出す文である。初期化文285は、ループ文286より前に実行される文として記述される。
ループ文286は、第2関数yを繰り返し呼び出すための文である。
事後条件文287は、第2関数xの1回目の出力値が第2関数yの2回目以降の出力値と等しい、且つ、第2関数yの1回目の第2状態変数の値が第2関数yの2回目以降の第2状態変数の値と等しいという第2事後条件を定義する文である。
ステップS2111において、生成部110は、検査ヘッダ240(図9参照)を生成する。
まず、生成部110は、検査関数step_judge_xのプロトタイプを記述する。「void step_judge_x(){}」は検査関数step_judge_xのプロトタイプである。
次に、生成部110は、第1関数x用の入力変数を解析ステップ数と同じ数だけ生成し、生成された入力変数を検査関数step_judge_xの引数として記述する。in_x1、in_x2およびin_x3が第1関数x用の入力変数である。
そして、生成部110は、検査関数step_judge_xの中で使用される内部変数を定義する定義文を定義文の形式に従って生成し、生成された定義文を検査関数step_judge_xの中に記述する。定義文の形式は予め決められている。
1つ目の定義文は内部変数iを定義する文である。内部変数iは、ループ文276においてループ数を制御するために用いられる変数である。
2つ目の定義文は内部変数in_x[]を定義する文である。内部変数in_x[]は第1関数x用の入力変数の値が設定される配列である。
3つ目の定義文は内部変数out_x[]を定義する文である。内部変数out_x[]は第1関数xの出力値が設定される配列である。
4つ目の定義文は内部変数state_x[]を定義する文である。内部変数state_x[]は第1状態変数の値が設定される配列である。
具体的には、生成部110は、解析ステップ数より1つ少ない数の事前条件文を事前条件文の形式に従って生成し、生成された事前条件文を定義部分273の4つの定義文の下に記述する。生成された事前条件文が事前条件文274である。事前条件文の形式は予め決められている。
第m事前条件文は、第1関数xの1回目の入力値が第1関数xのm+1回目の入力値と等しいという事前条件を定義する文である。mは1以上(解析ステップ数−1)以下の整数である。
具体的には、生成部110は、第1初期化関数state_x_initの関数名を用いて初期化文275を生成し、初期化文275を事前条件文274の下に記述する。さらに、生成部110は、第2初期化関数state_y_initの関数名を用いて初期化文285を生成し、初期化文285を事前条件文284の下に記述する。
具体的には、生成部110は、内部変数iの値が解析ステップ数以下であることを繰り返しの条件とするfor文を初期化文275の下に記述する。そして、生成部110は、呼び出し文を呼び出し文の形式に従って生成し、代入文を代入文の形式に従って生成し、呼び出し文と代入文とをfor文の中に記述する。呼び出し文の形式および代入文の形式は予め決められている。
呼び出し文は、i回目のループにおいて、第1関数x用の内部変数in_x[i]の値を入力値として第1関数xを呼び出して、第1関数x用の内部変数out_x[i]に第1関数xの出力値を設定するための文である。
代入文は、i回目のループにおいて、第1関数x用の内部変数state_x[i]に第1状態変数state_xの値を設定するための文である。
具体的には、生成部110は、解析ステップ数より1つ少ない数の事後条件文を事後条件文の形式に従って生成し、生成された事後条件文をループ文276の下に記述する。生成された事後条件文が事後条件文277である。
第m事後条件文は、第1関数xの1回目の出力値が第1関数xのm+1回目の出力値と等しいという事後条件を定義する文である。mは1以上(解析ステップ数−1)以下の整数である。
ステップS212において、加工部120は、等価性検査のために第1プログラム210と第2プログラム220とを加工する。
ステップS2121は、実施の形態1(図14参照)におけるステップS121と同じである。
ステップS2122は、実施の形態1(図14参照)におけるステップS122と同じである。
ステップS2123は、実施の形態1(図14参照)におけるステップS123と同じである。
ステップS2124は、実施の形態1(図14参照)におけるステップS124と同じである。
ステップS2125は、実施の形態1(図14参照)におけるステップS125と同じである。
ステップS213において、解析部140は、第1等価性検査と第2等価性検査とを行う。
第1等価性検査は、第1関数xに対する等価性検査である。第1関数xに対する等価性検査は、第1関数xが呼び出された回数毎に第1事後条件を満たすか判定するための検査である。
第2等価性検査は、第2関数yに対する等価性検査である。第2関数yに対する等価性検査は、第2関数yが呼び出された回数毎に第2事後条件を満たすか判定するための検査である。
さらに、解析部140は、第2解析ラッパー280を用いて、モデル検査ツールを実行する。これにより、第2関数yが呼び出された回数毎に第2事後条件を満たすか判定される。
モデル検査ツールが変換機能を有する場合、解析部140は、加工後の第1プログラム210と第1解析ラッパー270とを入力として、モデル検査ツールを実行する。これにより、加工後の第1プログラム210と第1解析ラッパー270とが検査コードに変換され、検査コードが実行される。そして、第1関数xに対する等価性検査の実行結果が出力される。
さらに、検査部130は、加工後の第2プログラム220と第2解析ラッパー280とを入力として、モデル検査ツールを実行する。これにより、加工後の第2プログラム220と第2解析ラッパー280とが検査コードに変換され、検査コードが実行される。そして、第2関数yに対する等価性検査の実行結果が出力される。
さらに、解析部140は、加工後の第2プログラム220と第2解析ラッパー280とを検査コードに変換する。変換方法は、変換機能を有するモデル検査ツールによる方法と同じである。そして、解析部140は、検査コードを入力として、モデル検査ツールを実行する。これにより、第2関数yに対する等価性検査の実行結果が出力される。
実行結果262は、ステップS213で得られる実行結果の一例である。
(ステップ1)出力値は、対象関数の1回目の出力値を意味する。
(ステップm)出力値は、対象関数のm回目の出力値を意味する。
(ステップ1)状態値は、対象関数の1回目の状態値を意味する。
(ステップm)状態値は、対象関数のm回目の状態値を意味する。
FAILUREは、事後条件を満たさなかったことを意味する。
SUCCESSは、事後条件を満たしたことを意味する。
ステップS214において、解析部140は、第1等価性検査の結果に基づいて第1巡回数を求め、第2等価性検査の結果に基づいて第2巡回数を求める。
ステップS2140において、解析部140は、第1等価性検査の結果を参照することによって、解析ステップ数まで成功したか判定する。成功は、第1事後条件が満たされたことを意味する。
解析ステップ数まで成功した場合、処理はステップS2141に進む。
成功しなかった解析ステップがあった場合、処理はステップS2142に進む。
ステップS2141の後、処理はステップS2145に進む。
第1成功ステップが有った場合、処理はステップS2143に進む。
第1成功ステップが無かった場合、処理はステップS2144に進む。
ステップS2143の後、処理はステップS2145に進む。
解析ステップ数まで成功した場合、処理はステップS2146に進む。
成功しなかった解析ステップがあった場合、処理はステップS2147に進む。
ステップS2146の後、巡回数決定処理(S214)は終了する。
第2成功ステップが有った場合、処理はステップS2148に進む。
第2成功ステップが無かった場合、処理はステップS2149に進む。
ステップS2148の後、巡回数決定処理(S214)は終了する。
ステップS215において、解析部140は、第1巡回数と第2巡回数とに基づいて検査ステップ数を決定する。
ステップS2151において、解析部140は、第1巡回数と第2巡回数との両方が0でないか判定する。
第1巡回数と第2巡回数との両方が0でない場合、処理はステップS2152に進む。
第1巡回数と第2巡回数との少なくともいずれかが0である場合、処理はステップS2153に進む。
そして、解析部140は、検査ステップ数を第1巡回数と第2巡回数との最小公倍数にする。
巡回数に対応する検査ステップ数を決定することができる。そして、巡回数に対応する検査ステップ数において等価性検査を行うことにより、関数同士が完全に等価であるか否かを判定することができる。
図31に基づいて、等価性検証装置100のハードウェア構成を説明する。
等価性検証装置100は処理回路990を備える。
処理回路990は、生成部110と加工部120と検査部130と解析部140とを実現するハードウェアである。
処理回路990は、専用のハードウェアであってもよいし、メモリ902に格納されるプログラムを実行するプロセッサ901であってもよい。
GAはGate Arrayの略称であり、ASICはApplication Specific Integrated Circuitの略称であり、FPGAはField Programmable Gate Arrayの略称である。
等価性検証装置100は、処理回路990を代替する複数の処理回路を備えてもよい。複数の処理回路は、処理回路990の役割を分担する。
Claims (13)
- 第1関数と第2関数とを繰り返し呼び出すためのループ文を含んだプログラムコードである検査ラッパーを用いて等価性検査を行うことによって、前記第1関数と前記第2関数との等価性を検査する検査部
を備える等価性検証装置。 - 前記検査部は、前記第1関数と前記第2関数とが呼び出された回数毎に前記第1関数と前記第2関数との等価性を判定する
請求項1に記載の等価性検証装置。 - 前記検査部は、前記第1関数と前記第2関数とが呼び出された回数毎の判定結果に基づいて、前記第1関数と前記第2関数とが不等価となるときの呼び出し回数を特定する
請求項2に記載の等価性検証装置。 - 前記第1関数は、第1プログラムに含まれ、前記第1プログラムにおいて複数回実行され、前記第1関数の実行の度に値が変わる第1状態変数を使用し、前記第1状態変数の値に対応する値を出力し、
前記第2関数は、第2プログラムに含まれ、前記第2プログラムにおいて複数回実行され、前記第2関数の実行の度に値が変わる第2状態変数を使用し、前記第2状態変数の値に対応する値を出力する
請求項1から請求項3のいずれか1項に記載の等価性検証装置。 - 前記ループ文を記述することによって前記検査ラッパーを生成する生成部を備える
請求項4に記載の等価性検証装置。 - 前記生成部は、さらに、前記第1状態変数と前記第2状態変数とを初期化するための初期化文を前記ループ文より前に実行される文として前記検査ラッパーに記述する
請求項5に記載の等価性検証装置。 - 前記初期化文は、前記第1状態変数を初期化する第1初期化関数と前記第2状態変数を初期化する第2初期化関数とを呼び出す文である
請求項6に記載の等価性検証装置。 - 前記生成部は、さらに、前記第1初期化関数と前記第2初期化関数とを参照するための宣言文を含んだ検査ヘッダをインクルードするためのインクルード文を前記検査ラッパーに記述する
請求項7に記載の等価性検証装置。 - 前記生成部は、さらに、前記第1関数と前記第2関数との入力値同士が等しいという事前条件を定義する事前条件文と、前記第1関数と前記第2関数との出力値同士が等しいという事後条件を定義する事後条件文とを前記検査ラッパーに記述する
請求項5から請求項8のいずれか1項に記載の等価性検証装置。 - 前記生成部は、さらに、前記第1関数と前記第2関数とを呼び出す回数を定義する定義文を前記検査ラッパーに記述する
請求項5から請求項9のいずれか1項に記載の等価性検証装置。 - 前記等価性検証装置は、
前記第1状態変数の値が初期値に戻るときの前記第1関数の呼び出し回数である第1巡回数と、前記第2状態変数の値が初期値に戻るときの前記第2関数の呼び出し回数である第2巡回数とを求め、前記第1関数と前記第2関数とを前記検査ラッパーによって呼び出す回数を前記第1巡回数と前記第2巡回数とに基づいて決定する解析部を備え、
前記生成部は、決定された回数を定義する文を前記定義文として前記検査ラッパーに記述する
請求項10に記載の等価性検証装置。 - 前記解析部は、前記第1関数を繰り返し呼び出すための第1ループ文を含んだプログラムコードである第1解析ラッパーを用いて等価性検査を行うことによって前記第1巡回数を求め、前記第2関数を繰り返し呼び出すための第2ループ文を含んだプログラムコードである第2解析ラッパーを用いて等価性検査を行うことによって前記第2巡回数を求める
請求項11に記載の等価性検証装置。 - 第1関数と第2関数とを繰り返し呼び出すためのループ文を含んだプログラムコードである検査ラッパーを用いて等価性検査を行うことによって、前記第1関数と前記第2関数との等価性を検査する検査処理
をコンピュータに実行させるための等価性検証プログラム。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/JP2017/015709 WO2018193548A1 (ja) | 2017-04-19 | 2017-04-19 | 等価性検証装置および等価性検証プログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP6556410B2 JP6556410B2 (ja) | 2019-08-07 |
JPWO2018193548A1 true JPWO2018193548A1 (ja) | 2019-11-07 |
Family
ID=63855736
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2019513138A Active JP6556410B2 (ja) | 2017-04-19 | 2017-04-19 | 等価性検証装置 |
Country Status (5)
Country | Link |
---|---|
US (1) | US20200034280A1 (ja) |
JP (1) | JP6556410B2 (ja) |
CN (1) | CN110520850B (ja) |
DE (1) | DE112017007271T5 (ja) |
WO (1) | WO2018193548A1 (ja) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2018154657A1 (ja) * | 2017-02-22 | 2018-08-30 | 三菱電機株式会社 | 等価性検証装置および等価性検証プログラム |
WO2021166167A1 (ja) * | 2020-02-20 | 2021-08-26 | 三菱電機株式会社 | 検証装置 |
CN112540787A (zh) * | 2020-12-14 | 2021-03-23 | 北京知道未来信息技术有限公司 | 程序逆向分析方法、装置及电子设备 |
WO2022239148A1 (ja) * | 2021-05-12 | 2022-11-17 | 三菱電機株式会社 | 等価性検査システムおよび等価性検査プログラム |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2013171350A (ja) * | 2012-02-17 | 2013-09-02 | Fuji Electric Co Ltd | 図式プログラムのテスト網羅性測定装置およびその方法、並びにプログラム |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2803369B2 (ja) | 1991-01-21 | 1998-09-24 | 日本電気株式会社 | 対話型システムの検査方法 |
US20060041873A1 (en) * | 2004-08-19 | 2006-02-23 | Cisco Technology, Inc. | Computer system and method for verifying functional equivalence |
JP4774237B2 (ja) * | 2005-05-02 | 2011-09-14 | 株式会社リコー | プログラム開発支援装置、プログラム動作比較方法および半導体集積回路製造方法 |
JP2016057969A (ja) | 2014-09-11 | 2016-04-21 | 日立オートモティブシステムズ株式会社 | プログラム検査装置、ソフトウェア検査装置、sat制約条件データ、記憶媒体 |
WO2016038741A1 (ja) * | 2014-09-12 | 2016-03-17 | 株式会社日立製作所 | ソースコード等価性検証装置、および、ソースコード等価性検証方法 |
CN104301089B (zh) * | 2014-09-23 | 2018-04-27 | 电子科技大学 | 用于对任意变量的两个布尔函数进行仿射等价的判定方法 |
-
2017
- 2017-04-19 CN CN201780089570.4A patent/CN110520850B/zh active Active
- 2017-04-19 US US16/489,262 patent/US20200034280A1/en not_active Abandoned
- 2017-04-19 JP JP2019513138A patent/JP6556410B2/ja active Active
- 2017-04-19 WO PCT/JP2017/015709 patent/WO2018193548A1/ja active Application Filing
- 2017-04-19 DE DE112017007271.9T patent/DE112017007271T5/de active Pending
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2013171350A (ja) * | 2012-02-17 | 2013-09-02 | Fuji Electric Co Ltd | 図式プログラムのテスト網羅性測定装置およびその方法、並びにプログラム |
Non-Patent Citations (1)
Title |
---|
安井力,ほか2名: "「テスト力」強化シリーズ第1弾! JUnitスーパーTips 一段上を行くテスティング・テクニック2", JAVA WORLD, vol. 第9巻,第10号, JPN6017022385, 1 October 2005 (2005-10-01), JP, pages 200 - 207, ISSN: 0004051788 * |
Also Published As
Publication number | Publication date |
---|---|
CN110520850A (zh) | 2019-11-29 |
WO2018193548A1 (ja) | 2018-10-25 |
CN110520850B (zh) | 2023-08-11 |
JP6556410B2 (ja) | 2019-08-07 |
US20200034280A1 (en) | 2020-01-30 |
DE112017007271T5 (de) | 2019-12-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP6556410B2 (ja) | 等価性検証装置 | |
US10025696B2 (en) | System and method for equivalence class analysis-based automated requirements-based test case generation | |
US9250973B2 (en) | Apparatus and associated methodology of generating a multi-core communications topology | |
JP6627658B2 (ja) | ソフトウェアプログラムを修復する方法、記憶媒体及びシステム | |
US9367658B2 (en) | Method and apparatus for designing and generating a stream processor | |
JP2016115175A (ja) | ソフトウェアテスト装置およびソフトウェアテストプログラム | |
US10268572B2 (en) | Interactive software program repair | |
US9396095B2 (en) | Software verification | |
KR101266565B1 (ko) | 요구 인터페이스의 명세 정보를 이용한 소프트웨어 컴포넌트의 테스트 케이스 생성 방법 및 실행 방법 | |
JP6559376B2 (ja) | テストケース選択装置およびテストケース選択プログラム | |
US20210389977A1 (en) | System migration support apparatus, system migration support method and program | |
JP7215501B2 (ja) | 依存関係検出装置および依存関係検出方法 | |
US11113140B2 (en) | Detecting error in executing computation graph on heterogeneous computing devices | |
García-Ferreira et al. | A survey on static analysis and model checking | |
US20190171956A1 (en) | Verification system, verification method, and recording medium for storing verification program | |
JP5755861B2 (ja) | テストケース生成装置、テストケース生成方法およびテストケース生成プログラム | |
Seth et al. | Minimum Spanning Tree-Based Approach for Reliability Estimation of COTS-Based Software Applications. | |
US20230305951A1 (en) | Systems and methods for continuous testing of microservice applications | |
US20090235223A1 (en) | Program generation apparatus and program generation method | |
CN117809849B (zh) | 一种认知功能障碍老人行走姿态的分析方法及系统 | |
JP7309099B2 (ja) | 等価性検査システムおよび等価性検査プログラム | |
Kozin et al. | Static verification of Linux kernel configurations | |
Gupta et al. | Formally Verifying Graphics FPU: An Intel® Experience | |
JP7184180B2 (ja) | オフロードサーバおよびオフロードプログラム | |
KR102255365B1 (ko) | 이기종 온디바이스 시스템에서의 그래프 기반 영상 처리 모델 실행 최적화 장치 및 그 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20190520 |
|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20190520 |
|
A871 | Explanation of circumstances concerning accelerated examination |
Free format text: JAPANESE INTERMEDIATE CODE: A871 Effective date: 20190520 |
|
A975 | Report on accelerated examination |
Free format text: JAPANESE INTERMEDIATE CODE: A971005 Effective date: 20190529 |
|
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: 20190611 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20190709 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 6556410 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |