JPWO2018193548A1 - 等価性検証装置 - Google Patents

等価性検証装置 Download PDF

Info

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
Application number
JP2019513138A
Other languages
English (en)
Other versions
JP6556410B2 (ja
Inventor
一樹 米持
誠 磯田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Mitsubishi Electric Corp
Original Assignee
Mitsubishi Electric Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Mitsubishi Electric Corp filed Critical Mitsubishi Electric Corp
Application granted granted Critical
Publication of JP6556410B2 publication Critical patent/JP6556410B2/ja
Publication of JPWO2018193548A1 publication Critical patent/JPWO2018193548A1/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3692Test management for test results analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version 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

生成部(110)は、第1関数と第2関数との等価性を検査するための検査ラッパーを生成する。検査ラッパーは、第1関数と第2関数とを繰り返し呼び出すためのループ文を含む。検査部(130)は、検査ラッパーを用いて等価性検査を行うことによって、第1関数と前記第2関数とが呼び出された回数毎に第1関数と第2関数との等価性を判定する。

Description

本発明は、関数同士の等価性を検査するための技術に関するものである。
多機能化および付加価値の向上に応えるための制御機能の電子化により、制御装置に搭載される制御プログラムの大規模化および複雑化が急速に進んでいる。さらに、派生機種または仕向け地の違いにより、制御プログラムのバリエーションが、今後急増していくことが見込まれる。
このような状況下で収益力を維持または強化するには、制御プログラムの開発において、生産性の向上に取り組む必要がある。具体的な施策としては、通信処理、タイマ処理、スケジューラ、OS(Operating System)およびミドルウェアなどのプログラムの実行環境を導入することによって、プログラム開発を差分開発または派生開発へ移行することが考えられる。また、差分開発および派生開発の運用において、プログラムの品質確保および作業の効率化を実現するためのプログラム開発手法およびプログラム開発ツールをプログラム開発に適用することが考えられる。
特許文献1および特許文献2は、プログラムの品質確保を目的とした検証技術を開示している。
特許文献1の技術では、プログラムの入力値列とプログラムの内部状態値列とプログラムの出力値列とソフトウェアの要件を記述した検査条件とが、充足可能性問題の制約条件として記述される。そして、プログラムが制約条件に違反しているか、充足可能性判定ツールで検査される。
特許文献2の技術では、内部状態値列の遷移が、定義された状態遷移と同じになるかを検証することによって、プログラムが検査される。
非特許文献1は、等価性検査という技術を開示している。
等価性検査は、二つのプログラムの間で論理的に演算内容が同じかどうかを関数単位で判定する技術である。
具体的には、一方のプログラムの関数に対する入力値列が他方のプログラムの関数に対する入力値列と等しいという条件のもと、それぞれの関数の出力値列が互いに一致するかどうか、充足可能性判定ツールまたはモデル検査ツールを利用して判定される。それぞれの関数の出力値列が互いに一致する場合、関数同士が等価であると判定される。
等価性検証は、一つのプログラムに対する検証ではなく、二つのプログラムに対する検証である。
例えば、新たな実行環境への移行の前後またはバージョンの変更の前後における二つのプログラムの間で、演算内容が論理的に変更されていない同等部分と演算内容が論理的に変更された差異部分とを特定するために、等価性検証が行われる。
特開2016−57969号公報 特開平4−236636号公報
Rupak Majumdar, "Compositional Equivalence Checking for Models and Code of Control Systems," 52nd IEEE Conference on Decision and Control, December 2013.
従来の等価性検査では、検査対象の関数同士の入力値列および出力値列が制約条件として網羅的に解析される。
しかし、従来の等価性検証は、関数内で前のステップから次のステップへ引き継がれる内部状態値列を考慮していない。
例えば、同じ入力値列に対して常に同じ出力値列を返す関数の場合、内部状態値列は無いため、従来の等価性検査によって関数の等価性を正しく検査することができる。しかし、ステップごとに遷移する内部状態値列に依存して出力値列が決まる関数の場合、内部状態値列が有るため、従来の等価性検査によって関数同士の等価性を正しく検査することができない。ステップは、関数を呼び出して実行する工程である。
本発明は、ステップごとに遷移する内部状態値列に依存して出力値が決まる関数同士の等価性を正しく検査できるようにすることを目的とする。
本発明の等価性検証装置は、第1関数と第2関数とを繰り返し呼び出すためのループ文を含んだプログラムコードである検査ラッパーを用いて等価性検査を行うことによって、前記第1関数と前記第2関数との等価性を検査する検査部を備える。
本発明によれば、第1関数と第2関数とを繰り返し呼び出しながら第1関数と第2関数との等価性を検査することができる。そのため、ステップごとに遷移する内部状態値列に依存して出力値が決まる関数同士の等価性を正しく検査することが可能となる。
実施の形態1における等価性検証装置100の構成図。 実施の形態1における第1プログラム210を示す図。 実施の形態1における第2プログラム220を示す図。 実施の形態1におけるステップを説明するための図。 実施の形態1における対象情報230を示す図。 実施の形態1における入力値列と出力値列とを説明するための図。 実施の形態1におけるプログラムコードの関係図。 実施の形態1における等価性検証方法のフローチャート。 実施の形態1における検査ヘッダ240を示す図。 実施の形態1における検査ラッパー250を示す図。 実施の形態1における生成処理(S110)のフローチャート。 実施の形態1における第1プログラム210を示す図。 実施の形態1における第2プログラム220を示す図。 実施の形態1における加工処理(S120)のフローチャート。 実施の形態1における関数名の関係図。 実施の形態1における検査処理(S130)のフローチャート。 実施の形態1における実行結果260を示す図。 実施の形態1における実行結果261を示す図。 実施の形態2における等価性検証装置100の構成図。 実施の形態2における対象情報231を示す図。 実施の形態2におけるプログラムコードの関係図。 実施の形態2における等価性検証方法のフローチャート。 実施の形態2における解析処理(S210)のフローチャート。 実施の形態2における第1解析ラッパー270を示す図。 実施の形態2における第2解析ラッパー280を示す図。 実施の形態2における生成処理(S211)のフローチャート。 実施の形態2における加工処理(S212)のフローチャート。 実施の形態2における実行結果262を示す図。 実施の形態2における巡回数決定処理(S214)のフローチャート。 実施の形態2における検査ステップ数決定処理(S215)のフローチャート。 実施の形態における等価性検証装置100のハードウェア構成図。
実施の形態および図面において、同じ要素および対応する要素には同じ符号を付している。同じ符号が付された要素の説明は適宜に省略または簡略化する。図中の矢印はデータの流れ又は処理の流れを主に示している。
実施の形態1.
第1関数と第2関数との等価性を検査する形態について、図1から図18に基づいて説明する。
***構成の説明***
図1に基づいて、等価性検証装置100の構成を説明する。
等価性検証装置100は、プロセッサ901とメモリ902と補助記憶装置903といったハードウェアを備えるコンピュータである。これらのハードウェアは、信号線を介して互いに接続されている。
プロセッサ901は、演算処理を行うIC(Integrated Circuit)であり、他のハードウェアを制御する。例えば、プロセッサ901は、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、またはGPU(Graphics Processing Unit)である。
メモリ902は揮発性の記憶装置である。メモリ902は、主記憶装置またはメインメモリとも呼ばれる。例えば、メモリ902はRAM(Random Access Memory)である。メモリ902に記憶されたデータは必要に応じて補助記憶装置903に保存される。
補助記憶装置903は不揮発性の記憶装置である。例えば、補助記憶装置903は、ROM(Read Only Memory)、HDD(Hard Disk Drive)、またはフラッシュメモリである。補助記憶装置903に記憶されたデータは必要に応じてメモリ902にロードされる。
等価性検証装置100は、生成部110と加工部120と検査部130といったソフトウェア要素を備える。ソフトウェア要素はソフトウェアで実現される要素である。
補助記憶装置903には、生成部110と加工部120と検査部130としてコンピュータを機能させるための等価性検証プログラムが記憶されている。等価性検証プログラムは、メモリ902にロードされて、プロセッサ901によって実行される。
さらに、補助記憶装置903にはOS(Operating System)が記憶されている。OSの少なくとも一部は、メモリ902にロードされて、プロセッサ901によって実行される。
つまり、プロセッサ901は、OSを実行しながら、等価性検証プログラムを実行する。
等価性検証プログラムを実行して得られるデータは、メモリ902、補助記憶装置903、プロセッサ901内のレジスタまたはプロセッサ901内のキャッシュメモリといった記憶装置に記憶される。
メモリ902はデータを記憶する記憶部191として機能する。但し、他の記憶装置が、メモリ902の代わりに、又は、メモリ902と共に、記憶部191として機能してもよい。
等価性検証装置100は、プロセッサ901を代替する複数のプロセッサを備えてもよい。複数のプロセッサは、プロセッサ901の役割を分担する。
等価性検証プログラムは、磁気ディスク、光ディスクまたはフラッシュメモリ等の不揮発性の記憶媒体にコンピュータ読み取り可能に記憶することができる。不揮発性の記憶媒体は、一時的でない有形の媒体である。
図2に基づいて、第1プログラム210を説明する。
第1プログラム210は、第1プログラムの具体例であり、記憶部191に予め記憶される。
第1プログラムは、等価性検査の対象となる2つのプログラムのうちの一方のプログラムである。
第1プログラム210は、c言語で記述されたプログラムコードであり、第1関数xを含んでいる。
第1関数xは、第1関数の具体例である。
第1関数は、等価性検査の対象となる2つの関数のうちの一方の関数である。
第1関数は以下のような特徴を有する。
第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プログラム210は、第1初期化関数state_x_initを有する。
第1初期化関数state_x_initは、第1初期化関数の具体例である。
第1初期化関数は、第1状態変数を初期化する関数である。具体的には、第1初期化関数state_x_initは、第1状態変数state_xに初期値0を設定する。
図3に基づいて、第2プログラム220を説明する。
第2プログラム220は、第2プログラムの具体例であり、記憶部191に予め記憶される。
第2プログラムは、等価性検査の対象となる2つのプログラムのうちの他方のプログラムである。
第2プログラム220は、c言語で記述されたプログラムコードであり、第2関数yを含んでいる。
第2関数yは、第2関数の具体例である。
第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プログラム220は、第2初期化関数state_y_initを有する。
第2初期化関数state_y_initは、第2初期化関数の具体例である。
第2初期化関数は、第2状態変数を初期化する関数である。具体的には、第2初期化関数state_y_initは、第2状態変数state_yに初期値1を設定する。
図4に基づいて、実施の形態1におけるステップを説明する。
等価性検査の対象となるプログラムを対象プログラムという。具体的には、対象プログラムは第1プログラム210および第2プログラム220である。
等価性検査の対象となる関数を対象関数という。具体的には、対象関数は第1関数xおよび第2関数yである。
状態変数の値を状態値という。具体的には、状態値は第1状態変数state_xの値および第2状態変数state_yの値である。
ステップは、対象関数を呼び出して実行する工程である。
ステップ数は、対象関数が呼び出される回数、すなわち、対象関数が実行される回数である。
ステップ間において、対象関数の状態値が引き継がれる。つまり、第1ステップが終了したときの状態値が第2ステップで使用され、第2ステップが終了したときの状態値が第3ステップで使用される。入力値および出力値はステップ間で引き継がれない。
図5に基づいて、対象情報230を説明する。
対象情報230は、記憶部191に予め記憶される。
対象情報230は、対象関数の入力変数、出力変数および初期化関数を示す。
入力変数は、入力値が設定される変数である。入力値は、関数に入力される値である。
出力変数は、出力値が設定される変数である。出力値は、関数から出力される値である。
具体的には、対象情報230は、第1関数xの情報である第1入力変数in、第1出力変数outおよび第1初期化関数state_x_initを示す。さらに、対象情報230は、第2関数yの情報である第2入力変数in、第2出力変数outおよび第2初期化関数stete_y_initを示す。
図6に基づいて、入力値列および出力値列を説明する。
入力値列は、ステップ数と同じ数の入力値であり、対象関数のステップ数毎の入力値から成る。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に保存される。
図7に基づいて、第1プログラム210と第2プログラム220と検査ヘッダ240と検査ラッパー250との関係を説明する。
検査ヘッダ240は、第1関数xと第1初期化関数state_x_initと第2関数yと第2初期化関数state_y_initとを検査ラッパー250から参照するために生成されるヘッダである。検査ヘッダ240の詳細については後述する。
検査ラッパー250は、第1関数xと第2関数yとの等価性を検査するために生成される検査ラッパーである。検査ラッパー250の詳細については後述する。
検査ラッパーは、モデル検査ツールによる等価性検査のために使用されるプログラムコードである。
モデル検査ツールは、等価性検査を行う従来のツールである。
等価性検査では、事前条件の下で事後条件を満たすか検査される。事前条件の下で事後条件を満たす場合、対象関数同士が等価である。
***動作の説明***
等価性検証装置100の動作は等価性検証方法に相当する。また、等価性検証方法の手順は等価性検証プログラムの手順に相当する。
図8に基づいて、等価性検証方法を説明する。
ステップS110において、生成部110は、検査ヘッダ240と検査ラッパー250とを生成する。
図9に基づいて、検査ヘッダ240を説明する。
検査ヘッダ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から参照するための宣言文である。
図10に基づいて、検査ラッパー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との出力値同士が等しいという事後条件を定義する文である。
図11に基づいて、生成処理(S110)の手順を説明する。
ステップS111において、生成部110は、検査ヘッダ240(図9参照)を生成する。
具体的には、生成部110は、宣言文241と宣言文242とを記述する。宣言文241と宣言文242とが記述されたファイルが検査ヘッダ240である。
生成部110は、宣言文241を以下のように記述する。
生成部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は、宣言文242を以下のように記述する。
生成部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である。
ステップS112からステップS118によって、生成部110は、検査ラッパー250(図10参照)を生成する。
ステップS112において、生成部110は、インクルード文251(図10参照)を記述する。
具体的には、生成部110は、検査ヘッダ240のファイル名(analysis.h)を用いてインクルード文251を生成し、生成されたインクルード文251を検査ラッパー250の先頭に記述する。
ステップS113において、生成部110は、検査ステップ数の定義文252(図10参照)を記述する。
具体的には、生成部110は、ステップ変数の変数名(STEP)と検査ステップ数(3)とを用いて定義文252を生成し、生成された定義文252をインクルード文251の下に記述する。ステップ変数の変数名および検査ステップ数は予め決められている。
ステップS114において、生成部110は、検査関数judge_x_yの定義部分253(図10参照)を記述する。
具体的には、生成部110は、定義部分253を以下のように生成し、生成された定義部分253を定義文252の下に記述する。
まず、生成部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の出力値が設定される配列である。
ステップS115において、生成部110は、検査関数judge_x_yの中に事前条件文254(図10参照)を記述する。
具体的には、生成部110は、検査ステップ数と同じ数の事前条件文を事前条件文の形式に従って生成し、生成された事前条件文を定義部分253の4つの定義文の下に記述する。生成された事前条件文が事前条件文254である。事前条件文の形式は予め決められている。
第n事前条件文は、第1関数xと第2関数yとのn回目の呼び出しにおいて第1関数xと第2関数yとの入力値同士が等しいという事前条件を定義する文である。nは1以上検査ステップ数以下の整数である。
ステップS116において、生成部110は、検査関数judge_x_yの中に初期化文255(図10参照)を記述する。
具体的には、生成部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を呼び出す文である。
ステップS117において、生成部110は、検査関数judge_x_yの中にループ文256(図10参照)を記述する。
具体的には、生成部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の出力値を設定するための文である。
ステップS118において、生成部110は、検査関数judge_x_yの中に事後条件文257(図10参照)を記述する。
具体的には、生成部110は、検査ステップ数と同じ数の事後条件文を事後条件文の形式に従って生成し、生成された事後条件文をループ文256の下に記述する。検査ステップ数と同じ数の事後条件文が事後条件文257である。
第n事後条件文は、第1関数xと第2関数yとのn回目の呼び出しにおいて第1関数xと第2関数yとの出力値同士が等しいという事後条件を定義する文である。nは1以上検査ステップ数以下の整数である。
図8に戻り、ステップS120を説明する。
ステップS120において、加工部120は、等価性検査のために第1プログラム210と第2プログラム220とを加工する。
図12に基づいて、加工後の第1プログラム210を説明する。
加工後の第1プログラム210は、インクルード文211を含んでいる。
インクルード文211は、検査ヘッダ240をインクルードする文である。
図13に基づいて、加工後の第2プログラム220を説明する。
加工後の第2プログラム220は、インクルード文221を含んでいる。
インクルード文221は、検査ヘッダ240をインクルードする文である。
図14に基づいて、加工処理(S120)の手順を説明する。
ステップ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の先頭に記述する。
ステップS122において、加工部120は、第1プログラム210の初期化関数名が第2プログラム220の初期化関数名と同じであるか判定する。初期化関数名は、初期化関数の名前である。
第1プログラム210の初期化関数名が第2プログラム220の初期化関数名と同じである場合、処理はステップS123に進む。
第1プログラム210の初期化関数名が第2プログラム220の初期化関数名と異なる場合、処理はステップS124に進む。
ステップS123において、加工部120は、第1プログラム210の初期化関数名と第2プログラム220の初期化関数名との少なくとも一方を変更する。
例えば、図15に示すように、第1プログラム210の初期化関数名と第2プログラム220の初期化関数名とが共にfuncである場合、加工部120は、それぞれの初期化関数名に識別子を付加する。具体的には、加工部120は、第1プログラム210の初期化関数名をfuncからfunc_aに変更し、第2プログラム220の初期化関数名をfuncからfunc_bに変更する。「_a」および「_b」が付加された識別子である。
ステップS124において、加工部120は、第1プログラム210の対象関数名が第2プログラム220の対象関数名と同じであるか判定する。対象関数名は、等価性検査の対象となる関数の名前である。
第1プログラム210の対象関数名が第2プログラム220の対象関数名と同じである場合、処理はステップS125に進む。
第1プログラム210の対象関数名が第2プログラム220の対象関数名と異なる場合、加工処理(S120)は終了する。
ステップS125において、加工部120は、第1プログラム210の対象関数名と第2プログラム220の対象関数名との少なくとも一方を変更する。
例えば、図15に示すように、第1プログラム210の対象関数名と第2プログラム220の対象関数名とが共にfuncである場合、加工部120は、それぞれの対象関数名に識別子を付加する。具体的には、加工部120は、第1プログラム210の対象関数名をfuncからfunc_aに変更し、第2プログラム220の対象関数名をfuncからfunc_bに変更する。「_a」および「_b」が付加された識別子である。
図8に戻り、ステップS130を説明する。
ステップS130において、検査部130は、第1関数xと第2関数yとの等価性を検査する。
図16に基づいて、検査処理(S130)の手順を説明する。
検査処理(S130)において、第1プログラム210は加工後の第1プログラム210を意味し、第2プログラム220は加工後の第2プログラム220を意味する。
ステップS131において、検査部130は、検査ラッパー250を用いて、モデル検査ツールを実行する。
これにより、第1関数xと第2関数yとが呼び出された回数毎に、第1関数xと第2関数yとの等価性が判定される。
モデル検査ツールは、等価性検査を行うための従来のツールであり、記憶部191に予め記憶される。
変換機能を有するモデル検査ツールと変換機能を有さないモデル検査ツールが存在する。
変換機能は、対象プログラムと検査ラッパーとを検査コードに変換する機能である。
検査コードは、等価性検査用のプログラムコードである。
具体的には、モデル検査ツールは以下のように実行される。
モデル検査ツールが変換機能を有する場合、検査部130は、第1プログラム210と第2プログラム220と検査ラッパー250とを入力として、モデル検査ツールを実行する。
モデル検査ツールが実行されると、第1プログラム210と第2プログラム220と検査ラッパー250とが検査コードに変換され、検査コードが実行される。検査コードが実行されると、実行結果260が出力される。
モデル検査ツールが変換機能を有さない場合、検査部130は、第1プログラム210と第2プログラム220と検査ラッパー250とを検査コードに変換する。変換方法は、変換機能を有するモデル検査ツールによる方法と同じである。
そして、検査部130は、検査コードを入力として、モデル検査ツールを実行する。
モデル検査ツールが実行されると、実行結果260が出力される。
図17に基づいて、実行結果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以上検査ステップ数以下の整数である。
図16に戻り、ステップS132から説明を続ける。
ステップS132において、検査部130は、ステップS131で得られた結果に基づいて、第1関数xと第2関数yとが検査ステップ数まで等価であったか判定する。
第1関数xと第2関数yとが検査ステップ数まで等価であった場合、処理はステップS134に進む。
第1関数xと第2関数yとが等価でない検査ステップがあった場合、処理はステップS133に進む。
ステップS133において、検査部130は、ステップS131で得られた結果に基づいて、不等価ステップ数を特定する。
不等価ステップ数は、第1関数xと第2関数yとが不等価となるときのステップ数、すなわち、第1関数xと第2関数yとが不等価となるときの呼び出し回数である。具体的には、不等価ステップ数は、第1関数xと第2関数yとが不等価となる最初のステップ数である。
例えば、ステップS131で得られた結果が図18の実行結果261である場合、第1ステップおよび第2ステップの判定結果がSUCCESSであり、第3ステップの判定結果がFAILUREであるため、不等価ステップ数は3である。FAILUREは事後条件を満たさなかったことを意味する。つまり、FAILUREは不等価を意味する。
ステップS134において、検査部130は、検査結果を記憶部191に記憶する。
検査結果は、第1関数xと第2関数yとが検査ステップ数まで等価であるか否かを示す。
第1関数xと第2関数yとが検査ステップ数まで等価でない場合、検査結果は、さらに、不等価ステップ数を示す。
***実施の形態1の効果***
前のステップから次のステップへ値を保持する状態値を保有する関数同士の等価性検査を実現することができる。具体的には、設定されたステップ数において等価または不等価という判定結果を得ることができる。
***他の構成***
対象プログラム、対象関数、検査ラッパーおよび検査ヘッダはc言語以外のプログラミング言語を用いて記述されても構わない。検査ヘッダが無くても検査ラッパーから対象関数を呼び出すことが可能であれば、検査ヘッダは不要である。
実施の形態2.
検査ステップ数を決定する形態について、主に実施の形態1と異なる点を図19から図30に基づいて説明する。
***構成の説明***
図19に基づいて、等価性検証装置100の構成を説明する。
等価性検証装置100は、さらに、解析部140をソフトウェア要素として備える。
等価性検証プログラムは、さらに、解析部140としてコンピュータを機能させる。
図20に基づいて、対象情報231を説明する。
対象情報231は、対象情報の一例であり、記憶部191に予め記憶されている。
対象情報231は、入力変数と出力変数と初期化関数との他に、状態変数を示している。
図21に基づいて、第1プログラム210と検査ヘッダ240と第1解析ラッパー270との関係を説明する。
検査ヘッダ240は、第1プログラム210と第1解析ラッパー270とにインクルードされる。
第1解析ラッパー270は、第1巡回数を求めるための等価性検査で使用される検査ラッパーである。
第1巡回数は、第1状態変数の値が初期値に戻るときの第1関数の呼び出し回数である。
第1解析ラッパー270の詳細については後述する。
図21に基づいて、第2プログラム220と検査ヘッダ240と第2解析ラッパー280との関係を説明する。
検査ヘッダ240は、第2プログラム220と第2解析ラッパー280とにインクルードされる。
第2解析ラッパー280は、第2巡回数を求めるための等価性検査で使用される検査ラッパーである。
第2巡回数は、第2状態変数の値が初期値に戻るときの第2関数の呼び出し回数である。
第2解析ラッパー280の詳細については後述する。
***動作の説明***
図22に基づいて、等価性検証方法を説明する。
ステップS210において、解析部140は、検査ラッパー250に定義する検査ステップ数を決定する。検査ステップ数を決定する方法については後述する。
ステップS220からステップS240は、実施の形態1(図8参照)におけるステップS110からステップS130と同じである。
但し、ステップS220において、生成部110は、ステップS210で決定された検査ステップ数を定義する文を定義文252として検査ラッパー250に記述する。
また、ステップS240において、第1関数と第2関数とが等価であると判定された場合、第1関数と第2関数とは完全に等価である。完全に等価とは、ステップ数に関わらず関数同士が等価であることを意味する。
図23に基づいて、解析処理(S210)の手順を説明する。
ステップS211において、生成部110は、第1解析ラッパー270および第2解析ラッパー280を生成する。
図24に基づいて、第1解析ラッパー270を説明する。
第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事後条件を定義する文である。
図25に基づいて、第2解析ラッパー280を説明する。
第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事後条件を定義する文である。
図26に基づいて、生成処理(S211)の手順を説明する。
ステップS2111において、生成部110は、検査ヘッダ240(図9参照)を生成する。
ステップS2112からステップS2118によって、生成部110は、第1解析ラッパー270(図24参照)および第2解析ラッパー280(図25参照)を生成する。
ステップS2112において、生成部110は、インクルード文271を第1解析ラッパー270の先頭に記述し、インクルード文281を第2解析ラッパー280の先頭に記述する。
ステップS2113において、生成部110は、定義文272をインクルード文271の下に記述し、定義文282をインクルード文281の下に記述する。
ステップS2114において、生成部110は、検査関数step_judge_xの定義部分273を第1解析ラッパー270に記述する。
具体的には、生成部110は、定義部分273を以下のように生成し、生成された定義部分273を定義文272の下に記述する。
まず、生成部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は、検査関数step_judge_yの定義部分283を第2解析ラッパー280に記述する。
ステップS2115において、生成部110は、検査関数step_judge_xの中に事前条件文274を記述する。
具体的には、生成部110は、解析ステップ数より1つ少ない数の事前条件文を事前条件文の形式に従って生成し、生成された事前条件文を定義部分273の4つの定義文の下に記述する。生成された事前条件文が事前条件文274である。事前条件文の形式は予め決められている。
第m事前条件文は、第1関数xの1回目の入力値が第1関数xのm+1回目の入力値と等しいという事前条件を定義する文である。mは1以上(解析ステップ数−1)以下の整数である。
同様に、生成部110は、検査関数step_judge_yの中に事前条件文284を記述する。
ステップS2116において、生成部110は、検査関数step_judge_xの中に初期化文275を記述し、検査関数step_judge_yの中に初期化文285を記述する。
具体的には、生成部110は、第1初期化関数state_x_initの関数名を用いて初期化文275を生成し、初期化文275を事前条件文274の下に記述する。さらに、生成部110は、第2初期化関数state_y_initの関数名を用いて初期化文285を生成し、初期化文285を事前条件文284の下に記述する。
ステップS2117において、生成部110は、検査関数step_judge_xの中にループ文276を記述する。
具体的には、生成部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は、検査関数step_judge_yの中にループ文286を記述する。
ステップS2118において、生成部110は、検査関数step_judge_xの中に事後条件文277を記述する。
具体的には、生成部110は、解析ステップ数より1つ少ない数の事後条件文を事後条件文の形式に従って生成し、生成された事後条件文をループ文276の下に記述する。生成された事後条件文が事後条件文277である。
第m事後条件文は、第1関数xの1回目の出力値が第1関数xのm+1回目の出力値と等しいという事後条件を定義する文である。mは1以上(解析ステップ数−1)以下の整数である。
同様に、生成部110は、検査関数step_judge_yの中に事後条件文287を記述する。
図23に戻り、ステップS212を説明する。
ステップS212において、加工部120は、等価性検査のために第1プログラム210と第2プログラム220とを加工する。
図27に基づいて、加工処理(S212)の手順を説明する。
ステップS2121は、実施の形態1(図14参照)におけるステップS121と同じである。
ステップS2122は、実施の形態1(図14参照)におけるステップS122と同じである。
ステップS2123は、実施の形態1(図14参照)におけるステップS123と同じである。
ステップS2124は、実施の形態1(図14参照)におけるステップS124と同じである。
ステップS2125は、実施の形態1(図14参照)におけるステップS125と同じである。
図23に戻り、ステップS213を説明する。
ステップS213において、解析部140は、第1等価性検査と第2等価性検査とを行う。
第1等価性検査は、第1関数xに対する等価性検査である。第1関数xに対する等価性検査は、第1関数xが呼び出された回数毎に第1事後条件を満たすか判定するための検査である。
第2等価性検査は、第2関数yに対する等価性検査である。第2関数yに対する等価性検査は、第2関数yが呼び出された回数毎に第2事後条件を満たすか判定するための検査である。
具体的には、解析部140は、第1解析ラッパー270を用いて、モデル検査ツールを実行する。これにより、第1関数xが呼び出された回数毎に第1事後条件を満たすか判定される。
さらに、解析部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は、加工後の第1プログラム210と第1解析ラッパー270とを検査コードに変換する。変換方法は、変換機能を有するモデル検査ツールによる方法と同じである。そして、解析部140は、検査コードを入力として、モデル検査ツールを実行する。これにより、第1関数xに対する等価性検査の実行結果が出力される。
さらに、解析部140は、加工後の第2プログラム220と第2解析ラッパー280とを検査コードに変換する。変換方法は、変換機能を有するモデル検査ツールによる方法と同じである。そして、解析部140は、検査コードを入力として、モデル検査ツールを実行する。これにより、第2関数yに対する等価性検査の実行結果が出力される。
図28に基づいて、実行結果262を説明する。
実行結果262は、ステップS213で得られる実行結果の一例である。
(ステップ1)出力値は、対象関数の1回目の出力値を意味する。
(ステップm)出力値は、対象関数のm回目の出力値を意味する。
(ステップ1)状態値は、対象関数の1回目の状態値を意味する。
(ステップm)状態値は、対象関数のm回目の状態値を意味する。
FAILUREは、事後条件を満たさなかったことを意味する。
SUCCESSは、事後条件を満たしたことを意味する。
図23に戻り、ステップS214を説明する。
ステップS214において、解析部140は、第1等価性検査の結果に基づいて第1巡回数を求め、第2等価性検査の結果に基づいて第2巡回数を求める。
図29に基づいて、巡回数決定処理(ステップS214)の手順を説明する。
ステップS2140において、解析部140は、第1等価性検査の結果を参照することによって、解析ステップ数まで成功したか判定する。成功は、第1事後条件が満たされたことを意味する。
解析ステップ数まで成功した場合、処理はステップS2141に進む。
成功しなかった解析ステップがあった場合、処理はステップS2142に進む。
ステップS2141において、解析部140は、第1巡回数を2にする。
ステップS2141の後、処理はステップS2145に進む。
ステップS2142において、解析部140は、第1等価性検査の結果を参照することによって、第1成功ステップが有ったか判定する。第1成功ステップは、第1事後条件が満たされた解析ステップである。
第1成功ステップが有った場合、処理はステップS2143に進む。
第1成功ステップが無かった場合、処理はステップS2144に進む。
ステップS2143において、解析部140は、第1巡回数を第1成功ステップ数にする。第1成功ステップ数は、第1成功ステップ時のステップ数である。
ステップS2143の後、処理はステップS2145に進む。
ステップS2144において、解析部140は、第1巡回数を0にする。
ステップS2145において、解析部140は、第2等価性検査の結果を参照することによって、解析ステップ数まで成功したか判定する。
解析ステップ数まで成功した場合、処理はステップS2146に進む。
成功しなかった解析ステップがあった場合、処理はステップS2147に進む。
ステップS2146において、解析部140は、第2巡回数を2にする。
ステップS2146の後、巡回数決定処理(S214)は終了する。
ステップS2147において、解析部140は、第2等価性検査の結果を参照することによって、第2成功ステップが有ったか判定する。第2成功ステップは、第2事後条件が満たされた解析ステップである。
第2成功ステップが有った場合、処理はステップS2148に進む。
第2成功ステップが無かった場合、処理はステップS2149に進む。
ステップS2148において、解析部140は、第2巡回数を第2成功ステップ数にする。第2成功ステップ数は、第2成功ステップ時のステップ数である。
ステップS2148の後、巡回数決定処理(S214)は終了する。
ステップS2149において、解析部140は、第2巡回数を0に決定する。
図23に戻り、ステップS215を説明する。
ステップS215において、解析部140は、第1巡回数と第2巡回数とに基づいて検査ステップ数を決定する。
図30に基づいて、検査ステップ数決定処理(S215)の手順を説明する。
ステップS2151において、解析部140は、第1巡回数と第2巡回数との両方が0でないか判定する。
第1巡回数と第2巡回数との両方が0でない場合、処理はステップS2152に進む。
第1巡回数と第2巡回数との少なくともいずれかが0である場合、処理はステップS2153に進む。
ステップS2152において、解析部140は、第1巡回数と第2巡回数との最小公倍数を算出する。
そして、解析部140は、検査ステップ数を第1巡回数と第2巡回数との最小公倍数にする。
ステップS2153において、解析部140は、検査ステップ数を規定数にする。規定数は予め決められた数である。
***実施の形態2の効果***
巡回数に対応する検査ステップ数を決定することができる。そして、巡回数に対応する検査ステップ数において等価性検査を行うことにより、関数同士が完全に等価であるか否かを判定することができる。
***実施の形態の補足***
図31に基づいて、等価性検証装置100のハードウェア構成を説明する。
等価性検証装置100は処理回路990を備える。
処理回路990は、生成部110と加工部120と検査部130と解析部140とを実現するハードウェアである。
処理回路990は、専用のハードウェアであってもよいし、メモリ902に格納されるプログラムを実行するプロセッサ901であってもよい。
処理回路990が専用のハードウェアである場合、処理回路990は、例えば、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックIC、GA、ASIC、FPGAまたはこれらの組み合わせである。
GAはGate Arrayの略称であり、ASICはApplication Specific Integrated Circuitの略称であり、FPGAはField Programmable Gate Arrayの略称である。
等価性検証装置100は、処理回路990を代替する複数の処理回路を備えてもよい。複数の処理回路は、処理回路990の役割を分担する。
等価性検証装置100の機能について、一部が専用のハードウェアで実現されて、残りがソフトウェアまたはファームウェアで実現されてもよい。
このように、処理回路990はハードウェア、ソフトウェア、ファームウェアまたはこれらの組み合わせで実現することができる。
実施の形態は、好ましい形態の例示であり、本発明の技術的範囲を制限することを意図するものではない。実施の形態は、部分的に実施してもよいし、他の形態と組み合わせて実施してもよい。フローチャート等を用いて説明した手順は、適宜に変更してもよい。
100 等価性検証装置、110 生成部、120 加工部、130 検査部、140 解析部、191 記憶部、210 第1プログラム、211 インクルード文、220 第2プログラム、221 インクルード文、230 対象情報、231 対象情報、240 検査ヘッダ、241 宣言文、242 宣言文、250 検査ラッパー、251 インクルード文、252 定義文、253 定義部分、254 事前条件文、255 初期化文、256 ループ文、257 事後条件文、260 実行結果、261 実行結果、262 実行結果、270 第1解析ラッパー、271 インクルード文、272 定義文、273 定義部分、274 事前条件文、275 初期化文、276 ループ文、277 事後条件文、280 第2解析ラッパー、281 インクルード文、282 定義文、283 定義部分、284 事前条件文、285 初期化文、286 ループ文、287 事後条件文、901 プロセッサ、902 メモリ、903 補助記憶装置、990 処理回路。

Claims (13)

  1. 第1関数と第2関数とを繰り返し呼び出すためのループ文を含んだプログラムコードである検査ラッパーを用いて等価性検査を行うことによって、前記第1関数と前記第2関数との等価性を検査する検査部
    を備える等価性検証装置。
  2. 前記検査部は、前記第1関数と前記第2関数とが呼び出された回数毎に前記第1関数と前記第2関数との等価性を判定する
    請求項1に記載の等価性検証装置。
  3. 前記検査部は、前記第1関数と前記第2関数とが呼び出された回数毎の判定結果に基づいて、前記第1関数と前記第2関数とが不等価となるときの呼び出し回数を特定する
    請求項2に記載の等価性検証装置。
  4. 前記第1関数は、第1プログラムに含まれ、前記第1プログラムにおいて複数回実行され、前記第1関数の実行の度に値が変わる第1状態変数を使用し、前記第1状態変数の値に対応する値を出力し、
    前記第2関数は、第2プログラムに含まれ、前記第2プログラムにおいて複数回実行され、前記第2関数の実行の度に値が変わる第2状態変数を使用し、前記第2状態変数の値に対応する値を出力する
    請求項1から請求項3のいずれか1項に記載の等価性検証装置。
  5. 前記ループ文を記述することによって前記検査ラッパーを生成する生成部を備える
    請求項4に記載の等価性検証装置。
  6. 前記生成部は、さらに、前記第1状態変数と前記第2状態変数とを初期化するための初期化文を前記ループ文より前に実行される文として前記検査ラッパーに記述する
    請求項5に記載の等価性検証装置。
  7. 前記初期化文は、前記第1状態変数を初期化する第1初期化関数と前記第2状態変数を初期化する第2初期化関数とを呼び出す文である
    請求項6に記載の等価性検証装置。
  8. 前記生成部は、さらに、前記第1初期化関数と前記第2初期化関数とを参照するための宣言文を含んだ検査ヘッダをインクルードするためのインクルード文を前記検査ラッパーに記述する
    請求項7に記載の等価性検証装置。
  9. 前記生成部は、さらに、前記第1関数と前記第2関数との入力値同士が等しいという事前条件を定義する事前条件文と、前記第1関数と前記第2関数との出力値同士が等しいという事後条件を定義する事後条件文とを前記検査ラッパーに記述する
    請求項5から請求項8のいずれか1項に記載の等価性検証装置。
  10. 前記生成部は、さらに、前記第1関数と前記第2関数とを呼び出す回数を定義する定義文を前記検査ラッパーに記述する
    請求項5から請求項9のいずれか1項に記載の等価性検証装置。
  11. 前記等価性検証装置は、
    前記第1状態変数の値が初期値に戻るときの前記第1関数の呼び出し回数である第1巡回数と、前記第2状態変数の値が初期値に戻るときの前記第2関数の呼び出し回数である第2巡回数とを求め、前記第1関数と前記第2関数とを前記検査ラッパーによって呼び出す回数を前記第1巡回数と前記第2巡回数とに基づいて決定する解析部を備え、
    前記生成部は、決定された回数を定義する文を前記定義文として前記検査ラッパーに記述する
    請求項10に記載の等価性検証装置。
  12. 前記解析部は、前記第1関数を繰り返し呼び出すための第1ループ文を含んだプログラムコードである第1解析ラッパーを用いて等価性検査を行うことによって前記第1巡回数を求め、前記第2関数を繰り返し呼び出すための第2ループ文を含んだプログラムコードである第2解析ラッパーを用いて等価性検査を行うことによって前記第2巡回数を求める
    請求項11に記載の等価性検証装置。
  13. 第1関数と第2関数とを繰り返し呼び出すためのループ文を含んだプログラムコードである検査ラッパーを用いて等価性検査を行うことによって、前記第1関数と前記第2関数との等価性を検査する検査処理
    をコンピュータに実行させるための等価性検証プログラム。
JP2019513138A 2017-04-19 2017-04-19 等価性検証装置 Active JP6556410B2 (ja)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013171350A (ja) * 2012-02-17 2013-09-02 Fuji Electric Co Ltd 図式プログラムのテスト網羅性測定装置およびその方法、並びにプログラム

Family Cites Families (6)

* Cited by examiner, † Cited by third party
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 电子科技大学 用于对任意变量的两个布尔函数进行仿射等价的判定方法

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013171350A (ja) * 2012-02-17 2013-09-02 Fuji Electric Co Ltd 図式プログラムのテスト網羅性測定装置およびその方法、並びにプログラム

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
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