JP7309099B2 - 等価性検査システムおよび等価性検査プログラム - Google Patents

等価性検査システムおよび等価性検査プログラム Download PDF

Info

Publication number
JP7309099B2
JP7309099B2 JP2023519108A JP2023519108A JP7309099B2 JP 7309099 B2 JP7309099 B2 JP 7309099B2 JP 2023519108 A JP2023519108 A JP 2023519108A JP 2023519108 A JP2023519108 A JP 2023519108A JP 7309099 B2 JP7309099 B2 JP 7309099B2
Authority
JP
Japan
Prior art keywords
source code
code
change source
target function
post
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.)
Active
Application number
JP2023519108A
Other languages
English (en)
Other versions
JPWO2022239148A1 (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
Publication of JPWO2022239148A1 publication Critical patent/JPWO2022239148A1/ja
Application granted granted Critical
Publication of JP7309099B2 publication Critical patent/JP7309099B2/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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Stored Programmes (AREA)

Description

本開示は、ソフトウェア動作の差分解析に関するものである。
制御装置に搭載される制御ソフトウェアでは、多機能化と付加価値向上とに応えるために制御機能が電子化される。これにより、制御ソフトウェアの大規模化および複雑化が急速に進んでいる。
また、機種の派生または仕向け地の違いによる制御ソフトウェアのバリエーションが今後急増していくことが見込まれる。
このような状況下で収益力の維持および強化を図るためには、制御ソフトウェアの開発において生産性の向上に取り組む必要がある。
具体的な施策としては、ソフトウェアの実行環境の導入による差分開発および派生開発が考えられる。ソフトウェアの実行環境は、通信処理、タイマ処理、スケジューラ、オペレーティングシステム(OS)およびミドルウェアなどである。
また、品質の確保および開発の効率化を実現するための手法およびツールをソフトウェアの開発に適用する、という施策が考えられる。
このような施策を実施する際には、新たな実行環境への移行前に又は新たな実行環境への移行後に日々開発されるバージョン違いの2つのソフトウェアに対して、変更の影響範囲を特定する必要がある。
そのためには、変更前後の2つのソースコードに対してテキストの見た目ではなく処理の内容について修正を判断することが重要である。
これに対して、処理内容が修正された箇所を形式手法を活用して判別する等価性検査という技術がある。
等価性検査とは、変更前後の2つのソースコードを対象に、プログラミング言語の関数単位で処理内容を修正したかどうかを正確に判別する技術である。
具体的には、変更前後で対応が付く2つの関数に同じ入力値を与えたときに常に同じ出力値が得られる場合、処理内容が論理的に同一(すなわち等価)であると判定する。そうでない場合、処理内容が論理的に異なる(すなわち不等価)であると判定する。
また、関数は複数の状態変数を持つことがあり、状態変数が取る値(状態値)が前のステップから次のステップへ引き継がれて変化していく。ここで、ステップは関数が呼び出されたときに実行される1回分の処理である。関数が状態変数を持つ場合、各ステップで関数が入力値を受け取るたびにそのときの状態値に依存して関数内部の実行部分が切り替わり、処理内容によって出力値と次のステップの状態値が決まる。
特許文献1は、このような状態変数を持つ2つの関数を対象に、処理内容が等価かどうか判定する技術を開示している。
国際公開第2018/193548号
複数の状態変数を持つ関数を対象にした等価性検査では、各状態変数が初期状態から始まって再び初期状態に戻るまで、すべてのステップについて処理内容が解析される。
また、状態変数が取る値の数すなわち状態数に依存して、解析に必要な計算機リソースの量が決まる。状態数が非常に多い状態変数が1つでもある場合、1回で解析されるステップの数が非常に多くなることがあり、必要な計算機リソースの量が非常に多くなることがある。そのため、状態数が少ない状態変数と状態数が非常に多い状態変数がソースコードに混在する場合、すべての状態変数が初期状態に戻るまでのステップ数について処理内容を解析することは困難である。
本開示は、計算機リソースの量を抑えて等価性検査を行えるようにすることを目的とする。
本開示の等価性検査システムは、
変更前ソースコードと変更後ソースコードとのそれぞれから、繰り返し呼び出される対象関数の出力値に影響を与える状態変数である影響状態変数を抽出する影響状態変数抽出部と、
前記変更前ソースコードにおいて前記対象関数が繰り返し呼び出され前記影響状態変数の値が初期値に戻り、且つ、前記変更後ソースコードにおいて前記対象関数が繰り返し呼び出され前記影響状態変数の値が初期値に戻る、という条件を満たす前記対象関数の呼び出し回数を判定ステップ数として算出する判定ステップ数算出部と、
前記変更前ソースコードの前記対象関数と前記変更後ソースコードの前記対象関数とのそれぞれを前記判定ステップ数と同じ回数繰り返し呼び出して、前記変更前ソースコードの前記対象関数と前記変更後ソースコードの前記対象関数が等価であるか判定する等価判定部と、を備える。
本開示によれば、影響状態変数に絞って等価性検査を行うことができる。そのため、計算機リソースの量を抑えて等価性検査を行うことが可能となる。
実施の形態1における等価性検査システム100の構成図。 実施の形態1における等価性検査システム100の機能構成図。 実施の形態1における関数についての用語を示す図。 実施の形態1における変更前ソースコード201の例を示す図。 実施の形態1における変更後ソースコード202の例を示す図。 実施の形態1における等価性検査方法のフローチャート。 実施の形態1における影響状態変数抽出処理(S110)のフローチャート。 実施の形態1における影響部分203を示す図。 実施の形態1における影響部分204を示す図。 実施の形態1における判定ステップ数算出処理(S120)のフローチャート。 実施の形態1における戻りステップ数を算出するためのフローチャート。 実施の形態1における算出コード221を示す図。 実施の形態1における算出コード222を示す図。 実施の形態1における解析結果223を示す図。 実施の形態1における解析結果224を示す図。 実施の形態1における算出コード225を示す図。 実施の形態1における解析結果226を示す図。 実施の形態1における影響状態変数の値が初期値に戻るまでの様子を示す図。 実施の形態1における判定コード生成処理(S130)のフローチャート。 実施の形態1における変更前ソースコード231の例を示す図。 実施の形態1における変更後ソースコード232の例を示す図。 実施の形態1における判定ヘッダ233の例を示す図。 実施の形態1における判定ラッパー234の例を示す図。 実施の形態1における等価判定処理(S140)のフローチャート。 実施の形態1における解析結果241の例を示す図。 実施の形態1における解析結果242の例を示す図。 実施の形態1における等価性検査システム100のハードウェア構成図。
実施の形態および図面において、同じ要素または対応する要素には同じ符号を付している。説明した要素と同じ符号が付された要素の説明は適宜に省略または簡略化する。図中の矢印はデータの流れ又は処理の流れを主に示している。
実施の形態1.
等価性検査システム100について、図1から図27に基づいて説明する。
等価性検査システム100は、変更前後のソフトウェア動作についての差分解析システムとして利用される。
***構成の説明***
図1に基づいて、等価性検査システム100の構成を説明する。
等価性検査システム100は、プロセッサ101とメモリ102と補助記憶装置103と通信装置104と入出力インタフェース105といったハードウェアを備えるコンピュータである。これらのハードウェアは、信号線を介して互いに接続されている。
プロセッサ101は、演算処理を行うICであり、他のハードウェアを制御する。例えば、プロセッサ101はCPUである。
ICは、Integrated Circuitの略称である。
CPUは、Central Processing Unitの略称である。
メモリ102は揮発性または不揮発性の記憶装置である。メモリ102は、主記憶装置またはメインメモリとも呼ばれる。例えば、メモリ102はRAMである。メモリ102に記憶されたデータは必要に応じて補助記憶装置103に保存される。
RAMは、Random Access Memoryの略称である。
補助記憶装置103は不揮発性の記憶装置である。例えば、補助記憶装置103は、ROM、HDDまたはフラッシュメモリである。補助記憶装置103に記憶されたデータは必要に応じてメモリ102にロードされる。
ROMは、Read Only Memoryの略称である。
HDDは、Hard Disk Driveの略称である。
通信装置104はレシーバ及びトランスミッタである。例えば、通信装置104は通信チップまたはNICである。等価性検査システム100の通信は通信装置104を用いて行われる。
NICは、Network Interface Cardの略称である。
入出力インタフェース105は、入力装置および出力装置が接続されるポートである。例えば、入出力インタフェース105はUSB端子であり、入力装置はキーボードおよびマウスであり、出力装置はディスプレイである。等価性検査システム100の入出力は入出力インタフェース105を用いて行われる。
USBは、Universal Serial Busの略称である。
等価性検査システム100は、影響状態変数抽出部110と判定ステップ数算出部120と判定コード生成部130と等価判定部140といった要素を備える。これらの要素はソフトウェアで実現される。
補助記憶装置103には、影響状態変数抽出部110と判定ステップ数算出部120と判定コード生成部130と等価判定部140としてコンピュータを機能させるための等価性検査プログラムが記憶されている。等価性検査プログラムは、メモリ102にロードされて、プロセッサ101によって実行される。
補助記憶装置103には、さらに、OSが記憶されている。OSの少なくとも一部は、メモリ102にロードされて、プロセッサ101によって実行される。
プロセッサ101は、OSを実行しながら、等価性検査プログラムを実行する。
OSは、Operating Systemの略称である。
等価性検査プログラムの入出力データは記憶部190に記憶される。
メモリ102は記憶部190として機能する。但し、補助記憶装置103、プロセッサ101内のレジスタおよびプロセッサ101内のキャッシュメモリなどの記憶装置が、メモリ102の代わりに、又は、メモリ102と共に、記憶部190として機能してもよい。
等価性検査システム100は、プロセッサ101を代替する複数のプロセッサを備えてもよい。
等価性検査プログラムは、光ディスクまたはフラッシュメモリ等の不揮発性の記録媒体にコンピュータ読み取り可能に記録(格納)することができる。
図2に、等価性検査システム100の機能構成を示す。
図2において、矢印は主なデータの流れを示している。
各データの内容については後述する。
***動作の説明***
等価性検査システム100の動作の手順は等価性検査方法に相当する。また、等価性検査システム100の動作の手順は等価性検査プログラムによる処理の手順に相当する。
以下に、等価性検査方法について説明する。
図3に基づいて、関数についての用語を説明する。
関数が呼び出されたときに実行される1回分の処理を「ステップ」と称する。
関数が呼び出される回数を「ステップ数」と称する。つまり、ステップ数は関数が実行される回数に相当する。図3において、ステップ数はNである。
関数の入力となる変数を「入力変数」と称する。具体的には、入力変数は、関数の処理に必要な引数または大域変数である。
入力変数の値を「入力値」と称する。in_1からin_Nのそれぞれは、各ステップにおける入力変数inの値を表す。
関数の出力となる変数を「出力変数」と称する。具体的には、出力変数は、関数の処理の結果を表す戻り値または大域変数である。
出力変数の値を「出力値」と称する。out_1からout_Nのそれぞれは、各ステップにおける出力変数outの値を表す。
ソフトウェアの状態を表す変数を「状態変数」と称する。
状態変数の値を「状態値」と称する。st_1からst_Nのそれぞれは、各ステップの終了時における状態変数stateの値を表す。
状態値は、前のステップから次のステップに引き継がれる。例えば、第1ステップの終了時の状態値st_1が第2ステップで使用され、第2ステップの終了時の状態値st_2が第3ステップで使用される。
一方、入力値および出力値は、前のステップから次のステップに引き継がれない。
図4に、変更前ソースコード201の例を示す。変更前ソースコード201は元のソースコードである。図3において、変更前ソースコード201はC言語で記述されている。
図5に、変更後ソースコード202の例を示す。変更後ソースコード202は変更済みのソースコードである。図4において、変更後ソースコード202はC言語で記述されている。
変更前ソースコード201と変更後ソースコード202の間で異なる部分、つまり変更された部分に下線を付している。
変更前ソースコード201と変更後ソースコード202とのそれぞれは、main関数とfunc1関数とfunc2関数とを含んでいる。
func1関数とfunc2関数は、等価性検査の対象となる関数である。等価性検査の対象となる関数を「対象関数」と称する。
対象関数は、変更前ソースコード201と変更後ソースコード202に含まれ、状態変数を持ち、繰り返し呼び出され実行される。
func1関数とfunc2関数は、main関数の中で特定の条件が満たされる間、繰り返し実行される。
図4の変更前ソースコード201について説明する。
対象関数は、各ステップで入力値を受け取るたびに、関数内部で実行される部分を状態値に応じて切り替える。そして、次のステップの状態値が対象関数の実行結果によって決まる。
func1関数は、2つの状態変数(state、counter)を持つ。そして、これらの状態値は、func1関数が実行されるたびに変わる。
初期状態では、状態変数stateと状態変数counterとのそれぞれの値が0である。
状態変数stateの値が0である場合にfunc1関数が実行されると、状態変数stateと状態変数counterとのそれぞれの値が1に変わる。
状態変数stateの値が1である場合にfunc1関数が実行されると、状態変数stateと状態変数counterとのそれぞれの値が2に変わる。
状態変数stateの値が2である場合にfunc1関数が実行されると、状態変数stateの値が0に変わり、状態変数counterの値が3に変わる。
状態変数counterは、func1関数の呼び出し回数という統計情報を記録するための変数である。func1関数が呼び出されるたびに、状態変数counterの値に1が加算される。
func2関数は、状態変数numを持つ。そして、この状態値は、func2関数が実行されるたびに変わる。
初期状態では、状態変数numの値が1である。
func2関数が実行されるたびに、状態変数numの値に1が加算される。但し、状態変数numの値が1000000000である場合にfunc1関数が実行されると、状態変数numの値が1に戻る。
対象関数は、状態値に対応する処理の内容によって出力値を決める。
func1関数は、状態変数stateの値に対応する処理の内容によって出力値を決める。
状態変数stateの値が0である場合、func1関数の入力値inに対して出力値はin+1で表される。
状態変数stateの値が1である場合、func1関数の入力値inに対して出力値はin+2で表される。
状態変数stateの値が2である場合、func1関数の入力値inに対して出力値はin+3で表される。
func2関数は、状態変数numの値に対応する処理の内容によって出力値を決める。
状態変数numの値が1000000000である場合、func2関数の入力値inに対して出力値はin+1で表される。
状態変数numの値が1000000000でない場合、func2関数の入力値inに対して出力値はin+numで表される。
図5の変更後ソースコード202について説明する。
変更後ソースコード202では、変更前ソースコード201に対して、func1関数とfunc2関数とのそれぞれの出力値が変更されている。
func1関数において、状態変数stateの値が2である場合、func1関数の入力値inに対して出力値はin+5で表される。
func2関数において、状態変数numの値が1000000000である場合、func2関数の入力値inに対して出力値はin+2で表される。
図6に基づいて、等価性検査方法を説明する。
ステップS110からステップS140は、対象関数ごとに実行される。
ステップS110において、影響状態変数抽出部110は、変更前ソースコード201と変更後ソースコード202とのそれぞれから、対象関数に対する影響状態変数を抽出する。
変更前ソースコード201から抽出される影響状態変数を変更前影響状態変数211と称する。
変更後ソースコード202から抽出される影響状態変数を変更後影響状態変数212と称する。
影響状態変数は、対象関数の出力値に影響を与える状態変数である。
図7に基づいて、影響状態変数抽出処理(S110)の手順を説明する。
ステップS111からステップS114は、変更前ソースコード201を解析して実行される。
ステップS115からステップS118は、変更後ソースコード202を解析して実行される。
ステップS111において、影響状態変数抽出部110は、変更前ソースコード201の対象関数から入力変数を抽出する。
具体的には、対象関数が変数から値を読み込む場合、影響状態変数抽出部110は、その変数を入力変数として抽出する。
例えば、影響状態変数抽出部110は、対象関数の引数を入力変数として抽出する。また、影響状態変数抽出部110は、代入演算子「=」の右側にある大域変数を入力変数として抽出する。
さらに、影響状態変数抽出部110は、変更前ソースコード201の対象関数から出力変数を抽出する。
具体的には、対象関数が変数に値を書き込む場合、影響状態変数抽出部110は、その変数を出力変数として抽出する。
例えば、影響状態変数抽出部110は、対象関数の戻り値を出力変数として抽出する。また、影響状態変数抽出部110は、代入演算子「=」の左側にある大域変数を出力変数として抽出する。
ステップS112において、影響状態変数抽出部110は、変更前ソースコード201から、対象関数の出力変数に対する影響部分を抽出する。
影響部分は、対象関数の出力変数の値に影響を与える部分である。
例えば、影響状態変数抽出部110は、プログラムスライシングを用いて、変更前ソースコード201から影響部分を抽出する。
ステップS113において、影響状態変数抽出部110は、変更前ソースコード201の影響部分から、関数外スコープ変数を抽出する。
関数外スコープ変数は、対象関数の関数外スコープを有する変数であり、対象関数の外から参照することが可能である。例えば、大域変数は関数外スコープ変数である。
ステップS114において、影響状態変数抽出部110は、変更前ソースコード201の関数外スコープ変数から、対象関数の入力変数と対象関数の出力変数とを除外する。
残りの関数外スコープ変数が変更前影響状態変数211となる。
ステップS115において、影響状態変数抽出部110は、変更後ソースコード202の対象関数から、入力変数と出力変数とを抽出する。
抽出方法は、ステップS111における方法と同じである。
ステップS116において、影響状態変数抽出部110は、変更後ソースコード202から、対象関数の出力変数に対する影響部分を抽出する。
抽出方法は、ステップS112における方法と同じである。
ステップS117において、影響状態変数抽出部110は、変更後ソースコード202の影響部分から、関数外スコープ変数を抽出する。
抽出方法は、ステップS113における方法と同じである。
ステップS118において、影響状態変数抽出部110は、変更後ソースコード202の関数外スコープ変数から、対象関数の入力変数と対象関数の出力変数とを除外する。
残りの関数外スコープ変数が変更後影響状態変数212となる。
図4の変更前ソースコード201と図5の変更後ソースコード202を例にして、影響状態変数抽出処理(S110)を説明する。
まず、影響状態変数抽出部110は、変更前ソースコード201と変更後ソースコード202とのそれぞれのfunc1関数から、引数inを入力変数として抽出し、return文で指定された戻り値を出力変数として抽出する。
また、影響状態変数抽出部110は、変更前ソースコード201と変更後ソースコード202とのそれぞれのfunc2関数から、引数inを入力変数として抽出し、return文で指定された戻り値を出力変数として抽出する。
次に、影響状態変数抽出部110は、変更前ソースコード201と変更後ソースコード202とのそれぞれから、func1関数およびfunc2関数の出力変数の値に影響を与える部分(影響部分)を抽出する。
図8に、影響部分203を示す。影響部分203は、図4の変更前ソースコード201から抽出された影響部分である。
図9に、影響部分204を示す。影響部分204は、図5の変更後ソースコード202から抽出された影響部分である。
そして、影響状態変数抽出部110は、変更前ソースコード201と変更後ソースコード202とのそれぞれの影響部分から、func1関数に対する影響状態変数stateと、func2関数に対する影響状態変数numと、を抽出する。
影響状態変数抽出処理(S110)により、状態数(状態変数が取る値の数)が非常に多い状態変数が出力値の計算に影響を与えない場合に、後述する判定ステップ数220を必要最小限に抑えることができる。
図6に戻り、ステップS120から説明を続ける。
ステップS120において、判定ステップ数算出部120は、変更前ソースコード201と変更後ソースコード202とのそれぞれの対象関数に対する影響状態変数に基づいて、判定ステップ数220を算出する。
判定ステップ数220は、変更前ソースコード201の対象関数と変更後ソースコード202の対象関数が等価であるか判定するために、変更前ソースコード201の対象関数と変更後ソースコード202の対象関数とが呼び出され実行される回数である。
具体的には、条件(1)と条件(2)との両方が満たされるときの対象関数の呼び出し回数(実行回数)が判定ステップ数220となる。
条件(1)は、変更前ソースコード201において、対象関数が繰り返し呼び出され影響状態変数の値が初期値に戻る、という条件である。
条件(2)は、変更後ソースコード202において、対象関数が繰り返し呼び出され影響状態変数の値が初期値に戻る、という条件である。
図10に基づいて、判定ステップ数算出処理(S120)の手順を説明する。
ステップS121において、判定ステップ数算出部120は、変更前ソースコード201を解析することによって、変更前ソースコード201の対象関数の戻りステップ数を算出する。
戻りステップ数は、対象関数が繰り返し呼び出され影響状態変数の値が初期値に戻るときの対象関数の呼び出し回数(実行回数)である。
戻りステップ数を算出する方法について後述する。
ステップS122において、判定ステップ数算出部120は、変更後ソースコード202を解析することによって、変更後ソースコード202の対象関数の戻りステップ数を算出する。
ステップS123において、判定ステップ数算出部120は、変更前ソースコード201の対象関数の戻りステップ数と変更後ソースコード202の対象関数の戻りステップ数の最小公倍数を算出する。
算出される最小公倍数が判定ステップ数220となる。
判定ステップ数算出処理(S120)により、判定ステップ数220を算出することができる。判定ステップ数220を用いることにより、状態数が非常に多い状態変数がある場合でも、変更前後の対象関数が両方とも初期状態に戻るまで等価性を判定することが可能となる。
図11に基づいて、戻りステップ数を算出するための手順を説明する。
ステップs121において、判定ステップ数算出部120は、後述する算出コードの解析に使用できる計算機リソースの量に基づいて、上限ステップ数を決定する。
上限ステップ数は、計算機リソースを解放せずに対象関数を実行する回数の上限である。
ステップs122において、判定ステップ数算出部120は、算出コードを生成する。
算出コードは、戻りステップ数を算出するためのソースコードであり、算出ラッパーともいう。
具体的には、1回目の算出コードと2回目以降の算出コードが生成される。
図12に、算出コード221を示す。算出コード221は、func1関数のための1回目の算出コードの例である。
図13に、算出コード222の例を示す。算出コード222は、func2関数のための1回目の算出コードの例である。
算出コード221と算出コード222とのそれぞれには、コード(0)からコード(3)が記述されている。上限ステップ数Xは1000である。
コード(0)は、影響状態変数の初期値を保存するためのコードである。影響状態変数の初期値は、対象関数が初めて呼び出されるときの影響状態変数の値である。
コード(1)は、上限ステップ数と同じ回数、対象関数を呼び出すためのコードである。この場合、対象関数を読み出す処理が1000ステップ分、記述される。
コード(2)は、上限ステップ数と同じ回数分、事後条件が満たされるか判定するためのコードである。影響状態変数の値が初期値と等しい、という条件が事後条件となる。この場合、事後条件の判定処理が1000ステップ分、記述される。
コード(3)は、上限ステップ数の終了時における影響状態変数の値を記録するためのコードである。上限ステップ数のステップの終了時における影響状態変数の値を、最終ステップの状態値と称する。
図11に戻り、ステップs123から説明を続ける。
ステップs123において、判定ステップ数算出部120は、1回目の算出コードの解析のために計算機リソースを確保する。
ステップs124において、判定ステップ数算出部120は、算出コードを解析して算出コードの処理を実行する。
例えば、判定ステップ数算出部120は、有界モデル検査を用いて、算出コードを解析する。
1回目のステップs124では、1回目の算出コードが使用される。
2回目以降のステップs124では、2回目以降の算出コードが使用される。
ステップs125において、判定ステップ数算出部120は、算出コードの解析結果に基づいて、上限ステップ数までのいずれかのステップで影響状態変数の値が初期値に戻ったか判定する。
上限ステップ数までのいずれかのステップで影響状態変数の値が初期値に戻った場合、処理はステップs128に進む。
上限ステップ数までのいずれかのステップで影響状態変数の値が初期値に戻らなかった場合、処理はステップs126に進む。
図14に、解析結果223を示す。解析結果223は、func1関数用の1回目の算出コード221の解析結果である。
FAILUREは、影響状態変数の値が初期値と異なることを意味する。
SUCCESSは、影響状態変数の値が初期値と等しいことを意味する。
解析結果223は、func1関数の影響状態変数の値が第3ステップで初期値に戻ることを示している。
この場合、ステップs125の後、処理はステップs129に進む。
図15に、解析結果224を示す。解析結果224は、func2関数用の1回目の算出コード222の解析結果である。
解析結果224は、func2関数の影響状態変数の値が第1000ステップまでに初期値に戻らないことを示している。
この場合、ステップs125の後、処理はステップs126に進む。
図11に戻り、ステップs126から説明を続ける。
ステップs126において、判定ステップ数算出部120は、1回目の算出コード(または2回目以降の算出コード)の解析のために確保された計算機リソースを一旦解放する。
なお、最終ステップの状態値は、解放される計算機リソース以外の記憶領域に記録されている。
ステップs127において、判定ステップ数算出部120は、2回目以降の算出コードの解析のために計算機リソースを再び確保する。
ステップs127の後、処理はステップs124に進む。
2回目以降のステップs124では、2回目以降の算出コードが使用される。
2回目以降の算出コードには、最終ステップの状態値を引き継ぎためのコードが加えられる。
図16に、算出コード225を示す。算出コード225は、func2関数のための2回目以降の算出コードの例である。
図13の算出コード222に対して、コード(0)が変更されており、コード(4)が追加されている。
コード(0)では、影響状態変数「num」を用いずに影響状態変数の初期値「1」が保存される。
コード(4)は、最終ステップの状態値を引き継ぐためのコードである。最終ステップの状態値が影響状態変数numに設定される。state_last_stepは、最終ステップの状態値を表す。
図11に戻り、ステップs128を説明する。
ステップs128において、判定ステップ数算出部120は、影響状態変数の値が初めて初期値に戻ったときのステップ数を戻りステップ数と判定する。これにより、戻りステップ数が求まる。
図14の解析結果223が得られた場合、判定ステップ数算出部120は、func1関数の戻りステップ数を3と判定する。
図17に、解析結果226を示す。解析結果226は、func2関数のための算出コードが1000000回解析されたときの解析結果である。
図17の解析結果226が得られた場合、判定ステップ数算出部120は、func2関数の戻りステップ数を1000000000(=X×1000000)と判定する。上限ステップ数Xは1000である。
図18に、算出コードが10回解析されて影響状態変数の値が初期値に戻る様子を示す。
上限ステップ数Xは、算出コードの1回の解析に使用できる計算機リソースの量に基づいて決定される。
算出コードが1回解析されるごとに、対象関数はX回呼び出される。
算出コードが1回解析されるごとに、計算機リソースは、一旦解放され、再び確保される。
算出コードが1回解析されるごとに、最終ステップの状態値が引き継がれる。
図6に戻り、ステップS130から説明を続ける。
ステップS130において、判定コード生成部130は、判定ステップ数220に基づいて、判定コード230を生成する。
判定コード230は、変更前ソースコード201の対象関数と変更後ソースコード202の対象関数とのそれぞれを判定ステップ数220と同じ回数繰り返し呼び出して、変更前ソースコード201の対象関数と変更後ソースコード202の対象関数が等価であるか判定するためのソースコードである。
図19に基づいて、判定コード生成処理(S130)の手順を説明する。
ステップS131において、判定コード生成部130は、変更前ソースコード201と変更後ソースコード202との間で名前の衝突をなくすために、変更前ソースコード201と変更後ソースコード202とを編集する。
これにより、変更前ソースコード231と変更後ソースコード232が生成される。
変更前ソースコード231は、編集済みの変更前ソースコード201である。
変更後ソースコード232は、編集済みの変更後ソースコード202である。
具体的には、判定コード生成部130は、変更前ソースコード201と変更後ソースコード202との間で異なる接頭辞または接尾辞を、関数名と大域変数名とのそれぞれに付ける。
図20に、変更前ソースコード231の例を示す。
図21に、変更後ソースコード232の例を示す。
変更前ソースコード231では、関数名「main」「func1」「func2」と大域変数名「state」「counter」とのそれぞれに接尾辞「_1」が付いている。
変更後ソースコード232では、関数名「main」「func1」「func2」と大域変数名「state」「counter」とのそれぞれに接尾辞「_2」が付いている。
これにより、変更前ソースコード231と変更後ソースコード232との間で、関数名および大域変数名が区別され、名前の衝突がなくなる。
図19に戻り、ステップS132から説明を続ける。
ステップS132において、判定コード生成部130は、判定ヘッダ233を生成する。
判定ヘッダ233は、変更前ソースコード231の対象関数と変更後ソースコード232の対象関数が等価であるか判定するために必要な宣言が記述されたヘッダである。
具体的には、判定コード生成部130は、変更前ソースコード231の対象関数のプロトタイプ宣言と、変更後ソースコード232の対象関数のプロトタイプ宣言と、を判定ヘッダ233に記述する。また、判定コード生成部130は、必要に応じて、変更前ソースコード231の大域変数のextern宣言と変更後ソースコード232の大域変数のextern宣言など、を判定ヘッダ233に記述する。
図22に、判定ヘッダ233の例を示す。
判定ヘッダ233には、変更前ソースコード231の対象関数「func1_1」「func2_1」の宣言と、変更後ソースコード232の対象関数「func1_2」「func2_2」の宣言と、が記述されている。
図19に戻り、ステップS133を説明する。
ステップS133において、判定コード生成部130は、判定ラッパー234を生成する。
判定ラッパー234は、変更前ソースコード231の対象関数と変更後ソースコード232の対象関数が等価であるか判定するために必要な処理が記述されたラッパーである。
具体的には、判定コード生成部130は、コード(A)からコード(C)を判定ラッパー234に記述する。
コード(A)は、前提条件を指定するためのコードである。判定ステップ数220分の全てのステップで変更前ソースコード231の対象関数の入力値と変更後ソースコード232の対象関数の入力値が等しい、という条件が前提条件となる。
コード(B)は、変更前ソースコード231の対象関数と変更後ソースコード232の対象関数とのそれぞれを、判定ステップ数220と同じ回数繰り返し呼び出すためのコードである。
コード(C)は、事後条件が満たされるか判定するためのコードである。判定ステップ数220分の全てのステップで変更前ソースコード231の対象関数の出力値と変更後ソースコード232の対象関数の出力値が等しい、という条件が事後条件となる。
図23に、func1関数のための判定ラッパー234の例を示す。
判定ステップ数STEPは3である。
コード(A)では、3ステップ分の前提条件が指定されている。
コード(B)では、func1関数(func1_1、func1_2)が3回呼び出される。
コード(C)では、3ステップ分の事後条件が判定される。
変更前ソースコード231と変更後ソースコード232と判定ヘッダ233と判定ラッパー234との組が判定コード230となる。
判定コード生成処理(S130)により、判定コード230を生成することができる。判定コード230を用いることにより、状態数が非常に多い状態変数がある場合でも、変更前後の対象関数の処理内容が等価かどうか正しく判定することが可能となる。
図6に戻り、ステップS140を説明する。
ステップS140において、等価判定部140は、判定コード230を使って、変更前ソースコード201の対象関数と変更後ソースコード202の対象関数が等価であるか判定する。
図24に基づいて、等価判定処理(S140)の手順を説明する。
ステップS141において、等価判定部140は、判定コード230を解析して判定ラッパー234の処理を実行する。
例えば、等価判定部140は、有界モデル検査を用いて、判定コード230を解析する。
ステップS142において、等価判定部140は、判定コード230の解析結果に基づいて、変更前ソースコード201の対象関数と変更後ソースコード202の対象関数が等価であるか判定する。
判定コード230の解析結果は、判定ラッパー234の処理結果に相当する。
ステップS143において、等価判定部140は、判定結果240を出力する。
判定結果240は、変更前ソースコード201の対象関数と変更後ソースコード202の対象関数が等価であるかを示す。また、判定結果240は、変更前ソースコード201の対象関数と変更後ソースコード202の対象関数が不等価になるステップ(不等価ステップ)を示す。
図25に、解析結果241の例を示す。解析結果241は、func1関数のための判定コード230の解析結果である。
判定ステップ数220は3である。SUCCESSは、変更前後で出力値が等しいことを意味する。FAILUREは、変更前後で出力値が異なることを意味する。
第1ステップと第2ステップでは変更前後でfunc1関数の出力値が等しいが、第3ステップでは変更前後でfunc1関数の出力値が異なる。
そのため、変更前後のfunc1関数は不等価であり、不等価ステップは第3ステップである。
図26に、解析結果242の例を示す。解析結果242は、func2関数のための判定コード230の解析結果である。
判定ステップ数220は1000000000である。
第1000000000ステップにおいて、変更前後でfunc2関数の出力値が異なる。
そのため、変更前後のfunc2関数は不等価であり、不等価ステップは第1000000000ステップである。
等価判定処理(S140)により、状態数が非常に多い状態変数がある場合でも、変更前後の対象関数の処理内容が等価であるか正しく判定することができる。
また、利用者は、判定結果240を参照することにより、変更後の対象関数に対して修正の要否および修正の内容を判断することができる。
***実施の形態1の効果***
実施の形態1により、対象関数の出力値の計算に影響を与えない状態変数を除外して影響を与える状態変数のみに絞って処理内容を解析することができる。また、等価性検査のための解析を複数回に分割し、分割された解析の間で計算機リソースの解放および再確保を繰り返すことで、状態数が非常に多い状態変数を持つ変更前後の対象関数の処理内容が等価かどうか判定することができる。
***実施の形態1の補足***
図27に基づいて、等価性検査システム100のハードウェア構成を説明する。
等価性検査システム100は処理回路109を備える。
処理回路109は、影響状態変数抽出部110と判定ステップ数算出部120と判定コード生成部130と等価判定部140とを実現するハードウェアである。
処理回路109は、専用のハードウェアであってもよいし、メモリ102に格納されるプログラムを実行するプロセッサ101であってもよい。
処理回路109が専用のハードウェアである場合、処理回路109は、例えば、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ASIC、FPGAまたはこれらの組み合わせである。
ASICは、Application Specific Integrated Circuitの略称である。
FPGAは、Field Programmable Gate Arrayの略称である。
等価性検査システム100は、処理回路109を代替する複数の処理回路を備えてもよい。
処理回路109において、一部の機能が専用のハードウェアで実現されて、残りの機能がソフトウェアまたはファームウェアで実現されてもよい。
このように、等価性検査システム100の機能はハードウェア、ソフトウェア、ファームウェアまたはこれらの組み合わせで実現することができる。
実施の形態1は、好ましい形態の例示であり、本開示の技術的範囲を制限することを意図するものではない。実施の形態1は、部分的に実施してもよいし、他の形態と組み合わせて実施してもよい。フローチャート等を用いて説明した手順は、適宜に変更してもよい。
等価性検査システム100は、2台以上の装置で実現されてもよい。
等価性検査システム100の要素である「部」は、「処理」、「工程」、「回路」または「サーキットリ」と読み替えてもよい。
100 等価性検査システム、101 プロセッサ、102 メモリ、103 補助記憶装置、104 通信装置、105 入出力インタフェース、109 処理回路、110 影響状態変数抽出部、120 判定ステップ数算出部、130 判定コード生成部、140 等価判定部、190 記憶部、201 変更前ソースコード、202 変更後ソースコード、203 影響部分、204 影響部分、211 変更前影響状態変数、212 変更後影響状態変数、220 判定ステップ数、221 算出コード、222 算出コード、223 解析結果、224 解析結果、225 算出コード、226 解析結果、230 判定コード、231 変更前ソースコード、232 変更後ソースコード、233 判定ヘッダ、234 判定ラッパー、240 判定結果、241 解析結果、242 解析結果。

Claims (10)

  1. 変更前ソースコードと変更後ソースコードとのそれぞれから、繰り返し呼び出される対象関数の出力値に影響を与える状態変数である影響状態変数を抽出する影響状態変数抽出部と、
    前記変更前ソースコードにおいて前記対象関数が繰り返し呼び出され前記影響状態変数の値が初期値に戻り、且つ、前記変更後ソースコードにおいて前記対象関数が繰り返し呼び出され前記影響状態変数の値が初期値に戻る、という条件を満たす前記対象関数の呼び出し回数を判定ステップ数として算出する判定ステップ数算出部と、
    前記変更前ソースコードの前記対象関数と前記変更後ソースコードの前記対象関数とのそれぞれを前記判定ステップ数と同じ回数繰り返し呼び出して、前記変更前ソースコードの前記対象関数と前記変更後ソースコードの前記対象関数が等価であるか判定する等価判定部と、
    を備える等価性検査システム。
  2. 前記影響状態変数抽出部は、
    前記変更前ソースコードと前記変更後ソースコードとのそれぞれの前記対象関数から、入力変数と出力変数とを抽出し、
    前記変更前ソースコードと前記変更後ソースコードとのそれぞれから、前記対象関数の前記出力変数の値に影響を与える影響部分を抽出し、
    前記変更前ソースコードと前記変更後ソースコードとのそれぞれの前記影響部分から、前記対象関数の関数外スコープを有する変数を関数外スコープ変数として抽出し、
    前記変更前ソースコードと前記変更後ソースコードとのそれぞれの前記関数外スコープ変数から前記対象関数の前記入力変数と前記対象関数の前記出力変数を除外し、
    前記変更前ソースコードと前記変更後ソースコードとのそれぞれの残りの前記関数外スコープが、前記影響状態変数となる
    請求項1に記載の等価性検査システム。
  3. 前記判定ステップ数算出部は、
    前記変更前ソースコードと前記変更後ソースコードとのそれぞれに対して、前記対象関数が繰り返し呼び出され前記影響状態変数の値が前記初期値に戻るときの前記対象関数の呼び出し回数を戻りステップ数として算出し、
    前記変更前ソースコードの前記対象関数の前記戻りステップ数と前記変更後ソースコードの前記対象関数の前記戻りステップ数の最小公倍数を前記判定ステップ数として算出する
    請求項1または請求項2に記載の等価性検査システム。
  4. 前記判定ステップ数算出部は、前記戻りステップ数を算出するための算出コードを生成し、前記算出コードを解析して前記算出コードの処理を実行し、前記算出コードの解析結果に基づいて前記戻りステップ数を判定する
    請求項3に記載の等価性検査システム。
  5. 前記算出コードは、上限ステップ数と同じ回数、前記対象関数を呼び出すための第1コードと、前記上限ステップ数と同じ回数分、前記影響状態変数の値が前記初期値と等しいという事後条件を判定するための第2コードと、を含む
    請求項4に記載の等価性検査システム。
  6. 前記判定ステップ数算出部は、前記算出コードとして、1回目の算出コードと2回目以降の算出コードを生成し、
    前記1回目の前記算出コードは、前記第1コードと、前記第2コードと、前記上限ステップ数の終了時における前記影響状態変数の値を最終ステップの状態値として記録するための第3コードと、を含み、
    前記2回目以降の前記算出コードは、前記影響状態変数に前記最終ステップの前記状態値を設定するための第4コードと、前記第1コードと、前記第2コードと、前記第3コードと、を含み、
    前記判定ステップ数算出部は、前記1回目の前記算出コードを解析して前記戻りステップ数が求まらなかった場合、前記1回目の前記算出コードの解析のために確保された計算機リソースを解放し、前記2回目の前記算出コードの解析のために前記計算機リソースを確保し、前記2回目以降の前記算出コードを解析して前記戻りステップ数を求める
    請求項5に記載の等価性検査システム。
  7. 前記等価性検査システムは、
    前記変更前ソースコードの前記対象関数と前記変更後ソースコードの前記対象関数とのそれぞれを前記判定ステップ数と同じ回数繰り返し呼び出すための判定コードを生成する判定コード生成部を備え、
    前記等価判定部は、前記判定コードを解析して前記判定コードの処理を実行し、前記変更前ソースコードの前記対象関数と前記変更後ソースコードの前記対象関数が等価であるか前記判定コードの解析結果に基づいて判定する
    請求項1から請求項6のいずれか1項に記載の等価性検査システム。
  8. 前記判定コード生成部は、名前の衝突をなくした編集済みの前記変更前ソースコードと編集済みの前記変更後ソースコードと、編集済みの前記変更前ソースコードの前記対象関数と編集済みの前記変更後ソースコードの前記対象関数とのそれぞれの宣言が記述された判定ヘッダと、編集済みの前記変更前ソースコードの前記対象関数と編集済みの前記変更後ソースコードの前記対象関数とのそれぞれを前記判定ステップ数と同じ回数繰り返し呼び出すための判定ラッパーと、を前記判定コードとして生成する
    請求項7に記載の等価性検査システム。
  9. 前記判定ラッパーは、前記判定ステップ数と同じ回数分の全てのステップで編集済みの前記変更前ソースコードの前記対象関数の入力値と編集済みの前記変更後ソースコードの前記対象関数の入力値が等しいという前提条件を指定するためのコードAと、編集済みの前記変更前ソースコードの前記対象関数と編集済みの前記変更後ソースコードの前記対象関数とのそれぞれを前記判定ステップ数と同じ回数繰り返し呼び出すためのコードBと、前記判定ステップ数と同じ回数分の全てのステップで編集済みの前記変更前ソースコードの前記対象関数の出力値と編集済みの前記変更後ソースコードの前記対象関数の出力値が等しいという事後条件を判定するためのコードCと、を含む
    請求項8に記載の等価性検査システム。
  10. 変更前ソースコードと変更後ソースコードとのそれぞれから、繰り返し呼び出される対象関数の出力値に影響を与える状態変数である影響状態変数を抽出する影響状態変数抽出処理と、
    前記変更前ソースコードにおいて前記対象関数が繰り返し呼び出され前記影響状態変数の値が初期値に戻り、且つ、前記変更後ソースコードにおいて前記対象関数が繰り返し呼び出され前記影響状態変数の値が初期値に戻る、という条件を満たす前記対象関数の呼び出し回数を判定ステップ数として算出する判定ステップ数算出処理と、
    前記変更前ソースコードの前記対象関数と前記変更後ソースコードの前記対象関数とのそれぞれを前記判定ステップ数と同じ回数繰り返し呼び出して、前記変更前ソースコードの前記対象関数と前記変更後ソースコードの前記対象関数が等価であるか判定する等価判定処理と、
    をコンピュータに実行させるための等価性検査プログラム。
JP2023519108A 2021-05-12 2021-05-12 等価性検査システムおよび等価性検査プログラム Active JP7309099B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2021/018051 WO2022239148A1 (ja) 2021-05-12 2021-05-12 等価性検査システムおよび等価性検査プログラム

Publications (2)

Publication Number Publication Date
JPWO2022239148A1 JPWO2022239148A1 (ja) 2022-11-17
JP7309099B2 true JP7309099B2 (ja) 2023-07-14

Family

ID=84028025

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2023519108A Active JP7309099B2 (ja) 2021-05-12 2021-05-12 等価性検査システムおよび等価性検査プログラム

Country Status (2)

Country Link
JP (1) JP7309099B2 (ja)
WO (1) WO2022239148A1 (ja)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009134360A (ja) 2007-11-28 2009-06-18 Nec Corp モデル検査システム、モデル検査方法およびモデル検査用プログラム
WO2018193548A1 (ja) 2017-04-19 2018-10-25 三菱電機株式会社 等価性検証装置および等価性検証プログラム

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009134360A (ja) 2007-11-28 2009-06-18 Nec Corp モデル検査システム、モデル検査方法およびモデル検査用プログラム
WO2018193548A1 (ja) 2017-04-19 2018-10-25 三菱電機株式会社 等価性検証装置および等価性検証プログラム

Also Published As

Publication number Publication date
WO2022239148A1 (ja) 2022-11-17
JPWO2022239148A1 (ja) 2022-11-17

Similar Documents

Publication Publication Date Title
JP7270764B2 (ja) 人工知能チップ検証
US9367658B2 (en) Method and apparatus for designing and generating a stream processor
US8601436B2 (en) Simulation-based interface testing automation system and method for robot software components
KR20090017598A (ko) 소프트웨어를 분석하기 위한 방법 및 시스템
CN111104335B (zh) 一种基于多层次分析的c语言缺陷检测方法及装置
JP2022505340A (ja) データ引数を動的に識別し、ソースコードを計装するためのシステムと方法
US8387001B2 (en) Method for finding an impact on a computer generated code
JP6342129B2 (ja) 混合モードプログラムのソースコードエラー位置検出装置及び方法
CN113497809B (zh) 基于控制流和数据流分析的mips架构漏洞挖掘方法
US10133871B1 (en) Method and system for identifying functional attributes that change the intended operation of a compiled binary extracted from a target system
US7721250B2 (en) System and method for interactive and integrated software development process and phases
US11030074B2 (en) Code update based on detection of change in runtime code during debugging
US10402309B2 (en) Code coverage tracking for a microcontroller program
CN112948828A (zh) 一种二进制程序恶意代码检测方法、终端设备及存储介质
US11294653B2 (en) Methods and systems of disassembling executable code
CN115935631A (zh) 用于车机设备的测试系统和方法、存储介质
US20080127118A1 (en) Method and system for dynamic patching of software
JPH0748182B2 (ja) プログラム・エラー検出方法
CN113836023B (zh) 一种基于体系结构交叉检查的编译器安全性测试方法
CN113377586B (zh) 一种服务器自动化检测方法、装置及存储介质
JP7215501B2 (ja) 依存関係検出装置および依存関係検出方法
JP7309099B2 (ja) 等価性検査システムおよび等価性検査プログラム
CN116228515A (zh) 硬件加速系统、方法及相关装置
CN112380541A (zh) 智能合约的漏洞的检测方法、装置及计算机设备
KR20210147354A (ko) 소스 코드 자동 머지 방법 및 그 장치

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20230324

A871 Explanation of circumstances concerning accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A871

Effective date: 20230324

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: 20230606

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20230704

R150 Certificate of patent or registration of utility model

Ref document number: 7309099

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150