JP2017041085A - プログラム仕様推定装置、推定方法、および推定プログラム - Google Patents

プログラム仕様推定装置、推定方法、および推定プログラム Download PDF

Info

Publication number
JP2017041085A
JP2017041085A JP2015162203A JP2015162203A JP2017041085A JP 2017041085 A JP2017041085 A JP 2017041085A JP 2015162203 A JP2015162203 A JP 2015162203A JP 2015162203 A JP2015162203 A JP 2015162203A JP 2017041085 A JP2017041085 A JP 2017041085A
Authority
JP
Japan
Prior art keywords
program
precondition
information
conversion
condition
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.)
Abandoned
Application number
JP2015162203A
Other languages
English (en)
Inventor
健男 今井
Takeo Imai
健男 今井
政裕 酒井
Masahiro Sakai
政裕 酒井
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.)
Toshiba Corp
Original Assignee
Toshiba 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 Toshiba Corp filed Critical Toshiba Corp
Priority to JP2015162203A priority Critical patent/JP2017041085A/ja
Publication of JP2017041085A publication Critical patent/JP2017041085A/ja
Abandoned legal-status Critical Current

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

【課題】本発明の実施形態は、検査対象のプログラムを2つのプログラムに変換し、変換した2つのプログラムに基づき、検査対象のプログラムの事前条件を推定する。
【解決手段】本発明の実施形態としてのプログラム仕様推定装置は、第1変換プログラムと、第2変換プログラムとを生成するプログラム変換部と、プログラムの事後条件および第1変換プログラムに基づき、第1変換プログラムの事前条件に関する情報である第1事前条件情報を生成し、事後条件および第2変換プログラムに基づき、第2変換プログラムの事前条件に関する情報である第2事前条件情報を生成する事前条件情報生成部と、第1事前条件情報と第2事前条件情報との差分の有無について第1判定を行う差分判定部と、前記第1判定の結果が差分なしの場合は、前記第1事前条件情報または前記第2事前条件情報に基づき、前記プログラムの事前条件を推定する事前条件推定部を備える。
【選択図】図1

Description

本発明の実施形態は、プログラム仕様推定装置、推定方法、および推定プログラムに関する。
手続き型プログラミング言語で記述されたプログラムの仕様または性質を表す基本的な方法として、事前条件と事後条件を表す方法がある。事前条件とは、プログラムの実行前に成り立つべき条件であり、プログラムが正常動作するための前提条件のことである。事後条件とは、プログラムの実行後に成り立つべき条件であり、プログラムが正常動作した際に保証される条件のことである。事前条件と事後条件を表すことで、プログラムの動作の正しさを認識することができる。特に、事前条件を正確に記述することは、組み合わせテストやレビューなど、プログラムの検査を行う際に有効である。
事前条件を人為的に求めずに、プログラムと事後条件に基づき推定する手法が知られている。推定手法を用いることで、煩雑な作業を避け、人為的間違いを防ぐことができる。推定手法には、例えば、極小矛盾核(MUC:Minimal unsatisfiable core)を求める手法などがある。
推定手法には、探索範囲を限定し、限定された探索範囲に事後条件を満たさない反例がないかどうかを調べる手法がある。このような推定手法では、プログラム中にwhile文などのループがある場合、当該ループを所定の回数だけif文に展開する。ループを所定の回数以内に制限することにより、探索範囲が限定される。しかし、可変回実行され得るループは、有限長とは限らない。したがって、ループを含む元のプログラムと、ループ展開後のプログラムとは、厳密には挙動が異なり、推定される事前条件が近似的な解となり、正確ではない可能性がある。
特開2014−160435号公報 特開2013−65258号公報
Sakai, Maruchi, and Imai, Model−Checking C Programs against JML−like Specification Language. Proceedings of 19th Asia−Pacific Software Engineering Conference (APSEC 2012), Pages 174−183 「Minimal Unsatisfiable Core列挙によるプログラムの準最弱な事前条件推定」(東芝)、ソフトウェア工学の基礎XVIII、レクチャーノート/ソフトウェア工学、株式会社近代科学社、Vol.37、2011、pp.187−196 "Algorithms for Computing Minimal Unsatisfiable Subsets of Constraints", Journal of Automated Reasoning, Springer−Verlag New York, Inc. Vol.40, 2008, pp.1−33 『高速なMCS列挙を利用した準最弱事前条件推定の改良』、 ソフトウェア工学の基礎XXI、 レクチャーノート/ソフトウェア工学、 近代科学社、 Vol.40、 2014 King, Symbolic execution and program testing, Communications of the ACM, Volume19 Issue 7, July 1976, Pages 385−394)
本発明の実施形態は、検査対象のプログラムを2つのプログラムに変換し、変換した2つのプログラムに基づき、検査対象のプログラムの事前条件を推定する。
本発明の実施形態としてのプログラム仕様推定装置は、第1変換プログラムと、第2変換プログラムとを生成するプログラム変換部と、プログラムの事後条件および第1変換プログラムに基づき、第1変換プログラムの事前条件に関する情報である第1事前条件情報を生成し、事後条件および第2変換プログラムに基づき、第2変換プログラムの事前条件に関する情報である第2事前条件情報を生成する事前条件情報生成部と、第1事前条件情報と第2事前条件情報との差分の有無について第1判定を行う差分判定部と、前記第1判定の結果が差分なしの場合は、前記第1事前条件情報または前記第2事前条件情報に基づき、前記プログラムの事前条件を推定する事前条件推定部を備える。
第1の実施形態に係る推定装置の概略構成の一例を示すブロック図。 事前条件情報生成部の内部構成の一例を示すブロック図。 事前条件推定部の内部構成の一例を示すブロック図。 事後条件の一例を示す図。 ループ処理を含んだプログラムの一例を示す図。 一重化処理の一例を示す図。 展開処理を説明するための図。 悲観的プログラムと楽観的プログラムの一例を示す図。 生成された述語の一例を示す図。 悲観的訂正集合群および後述する楽観的訂正集合群の一例を示す図。 矛盾核群と事前条件の一例を示す図。 推定装置の概略処理のフローチャート。 悲観的プログラム変換部の変換処理のフローチャートを示す図。 楽観的プログラム変換部の変換処理のフローチャートを示す図。 事前条件情報生成部の生成処理のフローチャートを示す図。 事前条件推定部の生成処理のフローチャートを示す図。 楽観的差分プログラムの一例を示す図。 合成を説明するための図。 悲観的差分プログラムの一例を示す図 悲観的差分訂正集合群による合成を説明するための図 再帰関数を含むプログラムに対するプログラム変換を説明する図。 再帰関数を含むプログラムに基づく悲観的プログラムと楽観的プログラムの一例を示す図。 本発明の一実施形態に係るハードウェア構成の一例を示すブロック図。
以下に、本明細書で用いる論理学上の記号を示す。
∧:連言(論理積、AND)
∨:選言(論理和、OR)
¬:否定(NOT)
⇒:含意(「ならば」)
⊥:矛盾
∀:全称量化子(「任意の」「すべての」)
更に、本明細書で用いる集合論の記号を以下に示す。
∈:元として含まれる
⊆:部分集合
\:差集合
また、本明細書で使用する用語の定義を示す。
[矛盾核](unsatisfiable core、あるいはunsatisfiable subset)
論理式の集合に対し、その要素全ての連言(論理積)が充足不能である(集合が不整合である)とき、その部分集合で、連言がやはり充足不能なものを意味する。言い換えると、論理式の集合Pに対し∧P=⊥であるとき、P’⊆Pでやはり∧P’=⊥となるものを意味する。
[極小矛盾核](minimal unsatisfiable core、あるいはminimal unsatisfiable subset)
矛盾核のうち極小なものを意味する。すなわち、すべての真部分集合が充足可能な矛盾核を意味する。言い換えると、論理式の集合P対する矛盾核P’で、∀p∈P’.∧(P’\p)≠⊥であるもの。本明細書においては、特に言及がない限り、「矛盾核」は「極小矛盾核」を指すものとする。
[訂正集合](correction subset)
論理式の集合に対し、その要素全ての連言が充足不能であるとき、その部分集合で、元の集合から、訂正集合を取り除くと、連言が充足可能になるものを意味する。言い換えると、論理式の集合Pに対し∧P=⊥であるとき、P’⊆Pで∧(P\P’)≠⊥となるものを意味する。
[極小訂正集合](minimal correction subset)
訂正集合のうち極小なものを意味する。すなわち、いかなる真部分集合を元の訂正集合から取り除いても充足可能にならないものを意味する。言い換えると、論理式の不整合な集合Pの訂正集合P’のうち、∀p∈P’.∧(P\(P’\p))=⊥であるものを意味する。本明細書においては、特に言及がない限り、「訂正集合」は「極小訂正集合」を指す。
[事前条件・事後条件]
プログラムの仕様の1形態を表す。事前条件は、プログラムが正常動作するための前提条件である。事後条件は、プログラムが正常動作した際に保証される条件を示す。論理学的には、あるプログラムの事前条件をP、事後条件をQ、そのプログラムが動作したことを表す記号をSとすると、これらの関係は、P∧S⇒Qで表される。
以下、図面を参照しながら、本発明の一実施形態について説明する。
(第1の実施形態)
図1は、第1の実施形態に係る推定装置の概略構成の一例を示すブロック図である。第1の実施形態に係る推定装置は、入力部1、変換条件設定部2、プログラム変換部3、事前条件導出部4、差分判定部5、変換条件記憶部6、出力部7を備える。プログラム変換部3は、悲観的プログラム変換部31と、悲観的プログラム記憶部32と、楽観的プログラム変換部33と、楽観的プログラム記憶部34を有する。事前条件導出部4は、事前条件情報生成部41と、事前条件推定部42を備える。
本発明の一実施形態に係る推定装置は、検査対象のプログラムのソースコードおよび事後条件に基づき、当該プログラムの事前条件を推定する。プログラムと事後条件に基づき、事前条件を推定することを、事前条件推定と称する。事前条件推定は、プログラムを直接実行せずに(静的に)、検査対象のプログラムが検査性質を満たすかを検査するソフトウェアモデル検査等で用いられる。
図2は、事前条件情報生成部41の内部構成の一例を示すブロック図である。事前条件情報生成部41は、述語生成部411と、述語記憶部412と、悲観的論理式変換部413と、悲観的訂正集合列挙部414と、悲観的訂正集合記憶部415と、楽観的論理式変換部416と、楽観的訂正集合列挙部417と、楽観的訂正集合記憶部418とを備える。
図3は、事前条件推定部42の内部構成の一例を示すブロック図である。事前条件推定部42は、悲観的矛盾核導出部421と、悲観的矛盾核記憶部422と、楽観的矛盾核導出部423と、楽観的矛盾核記憶部424と、推定部425とを備える。
以下、各部について説明する。
入力部1は、検査対象のプログラムと、当該プログラムの事後条件と、終了条件とを取得する。入力部1は、これらの情報を、ユーザから取得してもよいし、図示しない他のシステムから取得してもよい。
検査対象のプログラムは、悲観的プログラム変換部31および楽観的プログラム変換部33に送られ、後述するプログラム変換処理に基づき、変換される。取得するプログラムは、プログラムのソースコードを想定しているが、プログラム自体でもよい。その場合は、逆コンパイル等を行うことにより、プログラムからソースコードを読み取ればよい。取得するプログラムの記述言語は、C言語、Python、Perlなど、任意の言語でよい。ここでは、C言語の用語を用いて説明するが、特に言語を制限するものではない。
事後条件は、事前条件導出部4に送られ、事前条件の算出に用いられる。図4は、事後条件の一例を示す図である。図4のテキストは、非特許文献1にて示される仕様記述言語CFSLで記述されており、C言語向けソフトウェアモデル検査器CForgeなどにより解釈可能である。図3の例では、1行目が関数名であるgcdと、引数名であるmとnを表す。2行目は戻り値(\result)がmの約数であることを、3行目は戻り値がnの約数であることを表し、両者を合わせれば戻り値がmとnの公約数であることを表す。4行目が戻り値が0ではないことを表し、5行目が、戻り値が公約数の中では最大のものであることを表す。
終了条件は、変換条件設定部2に送られ、悲観的プログラム変換部31および楽観的プログラム変換部33にて行われるプログラム変換処理の終了を判断する条件の1つとなる。ここでは、終了条件を、プログラム変換部3にて行われる後述のプログラム展開処理におけるループの展開数の上限値とする。プログラム展開処理の詳細は後述する。
なお、入力部1と出力部7は、1つにまとめてもよい。
変換条件設定部2は、変換条件を設定し、終了条件とともに、変換条件記憶部6に格納する。変換条件とは、悲観的プログラム変換部31および楽観的プログラム変換部33が、後述するプログラム変換処理を行う際の条件を表す。悲観的プログラム変換部31および楽観的プログラム変換部33は、この変換条件に基づき、プログラム変換処理を実行するかを判断することができる。
変換条件は、予め定められていてもよいし、入力部1から取得してもよい。または、変換条件設定部2が、入力されたプログラムの種類や処理内容に基づき、複数の既定の変換条件の中から、変換条件を決定してもよい。また、変換条件の内容は任意でよく、用いられる変換条件は、1つでも複数でもよい。
本実施形態においては、変換条件をループの展開数とする。この場合、変換条件設定部2は、ループの展開数をカウントするカウンタとして機能する。
変換条件記憶部6は、変換条件設定部2から取得した変換条件および終了条件を格納する。なお、変換条件記憶部6は、変換条件設定部2に含まれていてもよい。
プログラム変換部3は、検査対象のプログラムから、検査対象のプログラムよりも厳しい条件で動作する悲観的プログラムを生成する。また、検査対象のプログラムから、検査対象のプログラムよりも緩い条件で動作する楽観的プログラムを生成する。悲観的プログラムおよび楽観的プログラムの詳細は後述する。
ここでは、プログラムを個別に変換することを想定し、悲観的プログラムに変換する悲観的プログラム変換部31と、楽観的プログラムに変換する楽観的プログラム変換部33を備えることとする。なお、悲観的プログラム変換部31と楽観的プログラム変換部33は1つにまとめてもよい。
悲観的プログラム変換部31は、入力部1から取得したプログラムを、予め定められた形式に変換する。変換処理の1つは、プログラムに含まれるループ処理を、ループなしの処理にするものである。ここでは、ループ処理をループなしの処理にすることを展開と称する。
ソフトウェアモデル検査において、モデル検査の探索範囲を限定し、限定された探索範囲において、正常でないプログラムの挙動を示す解(反例)があるかを調べるモデル検査法は有界モデル検査と称される。本実施形態も、ループを指定回数だけ展開し、限定された範囲において、事前条件を探索する。
プログラムのループは、for文、goto文、関数の再帰呼び出しなど、様々な方法により記述されるが、記述方法を変換することにより、全てwhile文で表すことが可能である。よって、ここでは、入力されるプログラムのループは、while文で記述されているものと想定するが、非特許文献2などに記載された公知の手法により、for文などのループをwhile文に変換する処理を予め行うとしてもよい。
while文は、ループ条件bと、本文Sから構成される。図5は、ループ処理を含んだプログラムの一例を示す図である。このプログラムは、引数mとnの最大公約数をユークリッドの互助法に基づき求めるために、C言語で記述されたプログラムである。当該プログラムの8行目から12行目がwhile文に相当する。8行目の「d!=0」がループ条件bに相当し、9から11行目が、本文Sに相当する。このwhile文では、dが0となるまで、本文Sの処理が繰り返されることを示している。なお、便宜上、行番号を付記しているが、本来は不要である。
悲観的プログラム変換部31は、与えられたプログラムにおけるwhile文の有無を判別する。while文が変換対象のプログラムに有る場合は、当該ループが多重ループ(ネスト構造)か否かを判別する。多重ループの場合は、当該ループの一重化処理を行う。
図6は、一重化処理の一例を示す図である。図6(A)は2重ループを含んだプログラムの一例を示す。この例では、条件b1を満たす限り、本文S1と、条件b2を満たす限り本文S2を繰り返し実行するループ処理とが、繰り返し実行される2重のループとなっている。図6(B)は、変数vpcと1つのwhile文を用いて、図6(A)を一重化する一例を示す。変数vpcは、複数あるループを番号付けし、実行中のループの番号を判別するために用いられる。ここでは、本文S1を実行するループをvpc=1、本文S2を実行するループをvpc=2としている。例えば、vpcの初期値を1とすると、switch処理にてcase1が実行され、条件b1が真ならば、本文S1の処理とvpc=2の代入が行われる。vpcが2となったため、次のswitch処理ではcase2が行われ、条件b2が偽となるまで、本文S2の処理が実行されることとなる。条件b2が偽となれば、vpcが1となり、case1に戻る。このように、多重ループの処理を1つのwhile文にて表すことができる。
また、悲観的プログラム変換部31は、一重化したループを展開する展開処理を行う。展開処理は、while文の本文Sを、1つ以上のif文の中に記載することにより、if文による複数回の処理に分けることをいう。
図7は、展開処理を説明するための図である。図7(A)は、図5に示したプログラムであり、悲観的プログラム変換部31に入力されたプログラムを示す。図7(B)は、悲観的プログラム変換部31により、ループが1回展開された場合のプログラムの一例を示す。この例では、while文の前にif文を作成し、if文の中に本文とwhile文を記載する。
悲観的プログラム変換部31は、変換条件記憶部6に格納された変換条件に基づき、ループを展開する。本実施形態では、変換条件はループの展開数のため、変換条件に示された展開数になるまで展開処理が行われる。
変換条件に示された展開数までループが展開されたとき、悲観的プログラム変換部31は、while文をassert文(assert関数により記述される文)に置換する。置換の際に、assert関数に与える引数は、「ループ処理の条件の否定」とする。assert関数は、引数が条件を満たさない場合に、エラーを発生させプログラムを停止させる関数である。ゆえに、置換されたプログラムは、「ループ処理の条件の否定」を満たさない場合、つまり、ループ処理の条件を満たす場合は、エラーとなる。これは、変換前のプログラムにおいてループ処理が指定された展開数以上続く場合、変換後のプログラムは必ずエラーとなることを意味する。したがって、展開前のプログラムよりも展開後のプログラムのほうが、正常稼働する条件が厳しいことを意味する。言い換えれば、展開前のプログラムに対して展開後のプログラムは正常でないプログラムの挙動に関する過大近似(overapproximation)となっている。このassert文は、ソフトウェアモデル検査においてunwinding assertionと称される。また、このようなプログラムを悲観的プログラムと称する。
図7(C)は、展開後の悲観的プログラムの一例を示す。図7(C)では、while文を1回展開し、if文が1つ生成されている。そして、図7(B)で示されたwhile文の代わりに、assert文が挿入されている。したがって、この悲観的プログラムは、ループと同一の条件(d!=0)を満たす限り、展開数だけループ処理と同一の処理が実行される。そして、最後のassert文による処理により、ループ処理の条件(d!=0)を満たす場合は、このプログラムはエラー(異常)となることを意味する。
悲観的プログラム変換部31は、上記のようにして、取得したプログラムを悲観的プログラムに変換する。つまり、悲観的プログラム変換部31で生成されるプログラムは、ソフトウェアモデル検査にかければ、ループが所定の回数以上実行される場合はすべて検査性質に違反する反例とみなす、という意味を持つ。このことを、ここでは「悲観的」(pessimistic)と称する。
なお、図7であげたソースコードは一例であり、想定する処理が行われば、記述内容は異なっていてもよい。例えば、assert文の記述位置は、図7(C)if文の本文中に記載されているが、if文の本文の後、「return n;」の前に記述されていても構わない。
悲観的プログラム記憶部32は、悲観的プログラム変換部31が算出した悲観的プログラムを格納する。悲観的プログラムは、事前条件導出部4により、参照される。また、悲観的プログラム変換部31が取得した検査対象のプログラムも格納してもよい。
楽観的プログラム変換部33は、入力部1から取得したプログラムを、予め定められた形式に変換する。ただし、楽観的プログラム変換部33は、悲観的プログラム変換部31とは異なる発想で、悲観的プログラムとは異なる形式にプログラムを変換する。
楽観的プログラム変換部33が行う処理は、ループ展開の最後の処理が、悲観的プログラム変換部31と異なる。悲観的プログラム変換部31は、while文をassert文に置換したが、楽観的プログラム変換部33は、assert文の代わりに、assume文を記述する。ここでは、このassume文を、unwinding assumptionと称する。
図8は、悲観的プログラムと楽観的プログラムの一例を示す図である。図8(A)は元のプログラム、図8(B)は悲観的プログラム、図8(C)は楽観的プログラムである。ループの展開数は、両プログラムとも2回で同数であり、assert文とassume文の記述だけが異なる。
assume関数は、与えられた引数を正しいとみなす。図8(C)では、assume関数の引数は、「!(d!=0)」であるので、ループ条件(d!=0)の否定が正しいとみなされる、つまり、assume文以降、ループ条件が満たされないとみなされる。これは、変換前のプログラムにおいてループ処理が指定された展開数以上続く場合でも、変換後のプログラムは必ず指定された展開数までしかループ処理が続かないことを意味する。したがって、この楽観的プログラムは、ループ展開数を超えても、ループ条件を満たしてしまう場合は動作しなかったものとして処理する。ゆえに、展開前よりも展開後のほうが、正常稼働する条件が緩いことを意味する。言い換えれば、展開前のプログラムに対して展開後のプログラムは正常でないプログラムの挙動に関する過小近似(underapproximation)となっている。このようなプログラムを楽観的プログラムと称する。
楽観的プログラム変換部33は、上記のようにして、取得したプログラムを楽観的プログラムに変換する。つまり、楽観的プログラム変換部33で生成されるプログラムは、ソフトウェアモデル検査において、常にループが所定の回数以下しか実行されない、という意味を持つ。このことを、ここでは「楽観的」(optimistic)と称する。
なお、図8であげたソースコードは一例であり、想定する処理が行われば、記述内容は異なっていてもよい。例えば、assume文の記述位置も、assert文の記述位置同様に、if文の本文の後、「return n;」の前に記述されていても構わない。
なお、このassume関数の挿入は、プログラムを後述する論理式に変換するために行われるものである。そのため、楽観的プログラムは実際に動作しなくともよい。
なお、悲観的プログラム変換部31または楽観的プログラム変換部33は、先に生成された悲観的プログラムまたは楽観的プログラムに基づき、assert文またはassume文を、assume文またはassert文に置換することで、もう一方のプログラムを生成するとしてもよい。
楽観的プログラム記憶部34は、楽観的プログラム変換部33から取得した楽観的プログラムを格納する。楽観的プログラムは、事前条件導出部4により、参照される。また、楽観的プログラム変換部34が取得した検査対象のプログラムも格納してもよい。
事前条件導出部4の事前条件情報生成部41は、悲観的プログラムと、楽観的プログラムと、事後条件に基づき、検査対象のプログラムの事前条件情報を導出する。具体的には、悲観的プログラムの事前条件に関する情報(悲観的事前条件情報)と、楽観的プログラムの事前条件に関する情報(楽観的事前条件情報)を導出し、差分判定部5に送る。悲観的事前条件情報と楽観的事前条件情報に差分がない場合は、差分判定部5から差分がないとの判定結果を受け取る。事前条件導出部4の事前条件推定部42は、悲観的事前条件情報、楽観的事前条件情報、またはその両方から、求めるべき事前条件を算出し、出力部7に出力する。算出方法などの詳細は後述する。
差分判定部5は、悲観的事前条件情報と楽観的事前条件情報との差分を判定する。差分が存在しないと判定した場合は、差分がないとの判定結果を事前条件導出部4に送る。差分が存在すると判定した場合は、変換条件記憶部6を参照し、変換条件(現在のループ展開数)が終了条件(ループ展開数の上限)以下であるかを判定する。変換条件が、終了条件以下の場合は、変換条件設定部2に対し、ループ展開数を1増やすように変換条件の変更を指示する。これにより、変換条件設定部2が変換条件を変更し、再度、悲観的プログラム変換部31および楽観的プログラム変換部33により、ループ展開数が前回よりも1つ多い悲観的プログラムおよび楽観的プログラムが生成される。そして、再度事前条件導出部4により、新たな悲観的事前条件情報および楽観的事前条件情報が生成される。この生成処理は、悲観的事前条件情報と楽観的事前条件情報との差分がなくなるまで、または変換条件が終了条件を超えるまで繰り返される。ゆえに、変換条件が終了条件を超えるまで、悲観的プログラムおよび楽観的プログラムのループ展開数が増加していくことになる。
なお、悲観的プログラム変換部31および楽観的プログラム変換部33が再び展開処理を開始する際の指示は、差分判定部5が行ってもよいし、変換条件設定部2が行ってもよい。または、悲観的プログラム変換部31および楽観的プログラム変換部33が、所定時間経過後に、変換条件記憶部6のデータにアクセスし、処理を行うかを判断してもよい。
事前条件導出部4の事前条件推定部42は、差分判定部5の判定結果に従い、事前条件を算出する。差分がないとする判定結果の場合は、悲観的事前条件情報と楽観的事前条件情報のいずれかから事前条件を算出すればよい。差分があるとする判定結果、つまり差分が収束することなく終了条件を満たした場合は、悲観的事前条件情報と楽観的事前条件情報のそれぞれ両方から、事前条件を算出する。2つの事前条件を、出力部7を介して、ユーザに出力することで、ユーザの利便性を向上させる。算出方法などの詳細は、後述する。
出力部7は、事前条件導出部4が導出した結果を出力する。出力方法は、画面に表示してもよいし、ファイルなどに保存してもよい。
以下、事前条件情報生成部41の内部構成について説明する。
本発明の実施形態では、プログラムの事前条件を算出する方法として、プログラム・事後条件・事前条件の構成要素となる述語を論理式で表現し、SAT問題(充足可能性問題、satisfiability problem)に準ずる問題として、SATソルバあるいはSMT(SAT Modulo Theories)ソルバなどの論理制約ソルバにて解く手法を用いる。SAT問題とは、命題論理式の充足可能性を判定するものであり、命題変数を含む論理式を真にするような命題変数への値の割り当てが存在するかを判定する。
述語生成部411は、悲観的プログラムまたは楽観的プログラムに基づき、各事前条件情報の基となる述語群を生成し、述語記憶部412に格納する。図2では、述語生成部411は悲観的プログラムを取得しているが、楽観的プログラムを取得してもよい。
述語は、プログラムの引数やグローバル変数に対する制約を意味し、予め定められたパターンに基づき生成される。本実施例においては、「異なる引数同士の大小比較」と、「引数と0との大小比較」の2つのパターンが定めてあるとする。また、ここでの大小比較とは、「一方がもう一方より大きい」、「一方がもう一方より小さい」、「一方がもう一方と一致しない」の3つの比較を指すこととする。
例えば、図7で示した悲観的プログラムを例とする。当該悲観的プログラムは、mとnの2つの引数を有するため、述語生成部411は、上記2つのパターンに従い、述語を生成する。図9は、生成された述語の一例を示す図である。生成された述語は、図9に示す通り、(m≧n)、(m≦n)、(m!=n)、(m≧0)、(m≦0)、(m!=0)、(n≧0)、(n≦0)、(n!=0)の9つとなる。
なお、事前条件導出部4の処理は、前述のように、悲観的事前条件情報と楽観的事前条件情報の差分がなくなるまで、または変換条件が終了条件を超えるまで繰り返される。しかし、述語生成部411の処理は、変換条件に左右されないため、再度述語生成処理を行う場合には、述語記憶部412に格納した述語群を用いることとし、述語生成処理を省略してもよい。
悲観的論理式変換部413は、悲観的プログラムを論理式に変換する。ここでは、得られた論理式を悲観的論理式と称する。プログラムを論理式に変換する方法は、非特許文献5などに記載された公知技術である記号実行(symbolic execution)などがある。
記号実行とは、プログラムの入力として記号値を用い、擬似的に実行する手法であり、プログラムの入力および実行前の状態と、プログラムの出力および実行後の状態の関係を表す論理式を算出する。なお、記号実行に基づき、C言語プログラムを論理式に変換する方法は、非特許文献1などに記載されている。
なお、記号実行は、無限ループが存在すると、論理式が無限となり、変換することができない。ゆえに、悲観的プログラム変換部31および楽観的プログラム変換部33にて、事前にプログラムからループを展開する必要がある。
悲観的訂正集合列挙部414は、悲観的論理式変換部413から取得した悲観的論理式と、入力部1から取得した事後条件の否定と、述語記憶部412に記憶された述語群との連言(論理積)からなる論理式を生成する。そして、当該論理式から、述語群および事後条件の否定に関する訂正集合群(minimal correction subsets)を列挙する。ここでは、悲観的訂正集合列挙部414に列挙された訂正集合群を悲観的訂正集合群と称する。
本実施例において訂正集合は、全ての述語、プログラムの実行、および事後条件の否定の論理積から成る論理式において、当該論理式から取り除くと、当該論理式が充足可能となるような条件の集合を意味する。図10は、悲観的訂正集合群および後述する楽観的訂正集合群の一例を示す図である。図10(A)が悲観的訂正集合群を表す。図10(B)が楽観的訂正集合群を表す。1行ごとに[]で囲まれた番号の集合が1つの訂正集合である。番号の1〜9は、図9で示した、述語生成部411により生成された述語の番号に対応する。0は事後条件の否定を表す。例えば、図10(A)の記載された訂正集合[2,5,7]は、条件式2である(m≦n)と、条件式5である(m≦0)、条件式7である(n≧0)を外すと、論理式が充足可能になることを意味する。この場合、事後条件の否定0が取り除かれなくても充足可能である。すなわち、2,5および7を取り除くと事後条件を満たさない、異常となるプログラム実行結果があり得ることとなる。
一方、図10(A)に記載された訂正集合[2,5,8,0]では、条件式2、5、8および0を除くと、論理式が成り立つことを意味する。0を除くことは、事後条件が成り立つことを意味するため、条件式2、5、8を除いても、事後条件を満たさない異常な実行結果は存在しない。
なお、悲観的プログラムは、検査対象のプログラムよりも厳しい条件で動作するものであるため、悲観的プログラムにおける0を含む訂正集合の数は、検査対象のプログラムにおける0を含む訂正集合の数以下となる。一方、楽観的プログラムは、検査対象のプログラムよりも緩い条件で動作するため、楽観的プログラムにおける0を含む訂正集合の数は、検査対象のプログラムにおける0を含む訂正集合の数以上となる。また、悲観的訂正集合群と楽観的訂正集合群の数は一致する。
論理式から訂正集合群を求めるには、非特許文献2に記載の通り、SATソルバやSMT(SAT Module Theories)ソルバなど、広く公知の論理制約ソルバを用いることができる。例えばKodKod(http://alloy.mit.edu/kodkod/)などを利用してもよい。算出された悲観的訂正集合群は、悲観的訂正集合記憶部415に格納される。なお、ここでは訂正集合群を、事前条件の中間解として用いる。これにより、事前条件を算出せずとも、差分判定を行うことができ、処理速度を早めることができる。
楽観的論理式変換部416は、楽観的プログラムを論理式に変換する。ここでは、得られた論理式を楽観的論理式と称する。楽観的プログラムを論理式に変換する方法は、悲観的論理式変換部413と同様である。そのため、楽観的論理式変換部416は、悲観的論理式変換部413と共通化してもよい。
楽観的訂正集合列挙部417は、悲観的訂正集合列挙部414同様に、前記楽観的論理式と、事後条件の否定と、述語群との連言からなる論理を生成し、述語群および事後条件の否定に関する訂正集合群を列挙する。ここでは、楽観的訂正集合列挙部417に列挙された訂正集合群を楽観的訂正集合群と称する。楽観的訂正集合群は、楽観的訂正集合記憶部418に格納される。
悲観的訂正集合群と楽観的訂正集合群は、悲観的事前条件情報と楽観的事前条件情報として、差分判定部5に送られる。図10の例では、図10(A)の悲観的訂正集合群のうちの1つが[1、5、8]であり、図10(B)の楽観的訂正集合群のうちの1つが[1、5、8、0]と異なっているため、差分判定部5は差分があるとの判定を行う。
以上が、事前条件情報生成部41の内部構成である。次に、事前条件情報生成部42の内部構成について説明する。
悲観的矛盾核導出部421および楽観的矛盾核導出部423は、それぞれ悲観的訂正集合群または楽観的訂正集合群訂正集合群から、矛盾核群(unsatisfiable coreまたはunsatisfiable subset)を導出する。ここでは、悲観的矛盾核導出部421が導出した矛盾核群を悲観的矛盾核群と、楽観的矛盾核導出部423が導出した矛盾核群を楽観的矛盾核群と称する。なお、悲観的事前条件と楽観的事前条件に差分がない場合、悲観的矛盾核群と楽観的矛盾核群にも差分はない。ゆえに、差分判定部5から、事前条件情報に差分がないとの結果を取得した場合には、悲観的矛盾核導出部421または楽観的矛盾核導出部423いずれか一方のみが、導出処理を行えばよい。また、ここでは、個別に矛盾核を導出することを想定し、悲観的矛盾核導出部421と、楽観的矛盾核導出部423を備えることとしたが、1つにまとめてもよい。
訂正集合群から矛盾核群を求める手法はhypergraph dualizationと呼ばれ、様々な公知手法が存在する。ここでは、たとえば非特許文献3におけるAllMUSesアルゴリズムなどの公知手法を用いることができる。
算出された悲観的矛盾核群と楽観的矛盾核群はそれぞれ、悲観的矛盾核記憶部422と楽観的矛盾核記憶部424に格納される。なお、悲観的矛盾核記憶部422と楽観的矛盾核記憶部424は、1つにまとめてもよいし、矛盾核群を推定部425に即座に送る場合などは、なくともよい。
推定部425は、悲観的矛盾核群、楽観的矛盾核群、または両方から事前条件を導出する。具体的には、矛盾核群から、事後条件の否定に相当する0を含まないものを削除すればよい。図11は、矛盾核群と事前条件の一例を示す図である。図11(A)が矛盾核群、図11(B)が事前条件を表す。矛盾核群において、事後条件の否定に相当する0を含まない場合、事前条件が論理的に成り立たない場合である。例えば、図11(A)の1番目に示した[2、3、4、8]は、(m<=n)∧(m!=n)∧(m>=0)∧(n<=0)を表すが、この論理式は成立しない。したがって、実用上意味のある事前条件とはならない。
このように、事後条件の否定である0が含まれていないものは、連言の論理式が成立しないものである。一方0を含むものは、非特許文献2に示されるとおり、0を除いたものの連言が事前条件として成立することを意味する。したがって、事後条件の否定を含むものから、事後条件の否定を削除したものが、事前条件となる。結果として、図11(A)の13番目から21番目に示した0を含む各矛盾核から、図11(B)のような9つの事前条件が得られる。
以上が、事前条件推定部42の内部構成である。
なお、上記では、差分判定部5は、悲観的訂正集合群と楽観的訂正集合群を事前条件情報として、判定を行うとしたが、悲観的矛盾核群と楽観的矛盾核群を事前条件情報として、差分判定を行ってもよい。その場合、悲観的矛盾核導出部421、悲観的矛盾核記憶部422、楽観的矛盾核導出部423、および楽観的矛盾核記憶部424は、事前条件情報生成部に含まれる。
次に、第1の実施形態により行われる処理の流れについて説明する。図12は、推定装置の概略処理のフローチャートである。当該処理は、入力部1から、検査対象のプログラム、当該プログラムの事後条件、終了条件、またはそれらの全てが送られてきたタイミングで開始されるものとする。なお、処理に用いられる変数などに格納された前回の処理に関する値は、処理を開始する前に、予め消去(初期化)しておくものとする。
変換条件設定部2は、変換条件を設定する(S101)。ここでは、変換条件は、悲観的プログラム変換部31および楽観的プログラム変換部33が変換処理を行った回数とする。ここでは、変換条件の初期値を0とし、変換条件設定部2は、変換条件の値に1を加えることとする。
悲観的プログラム変換部31および楽観的変換プログラム32は、それぞれ変換処理を行う(S102、S103)。変換処理にて行われるループ展開は、変換条件の値まで展開されるものとする。ここでは、S102の処理の後、S103の処理を行うとしているが、並列に行われてもよいし、順番の前後を逆にしてもよい。
事前条件情報生成部41は、S102とS103で得られた悲観的事前条件と楽観的事前条件とに基づき、悲観的事前条件情報と楽観的事前条件情報の生成処理を行う(S104)。差分判定部5は、事前条件情報生成部41の生成処理にて生成された楽観的事前条件情報と悲観的事前条件情報に基づき、判定処理を行う(S105)。
差分判定部5が差分なしと判定した場合には(S106のNO)、差分判定部5が事前条件推定部42に判定結果を渡し、事前条件推定部42は、事前条件の推定処理を行う(S108A)。この場合、事前条件推定部42は1つの事前条件を算出する。出力部7は、事前条件推定部42から渡された1つの事前条件を出力する(S109)。
差分判定部5が差分有りと判定した場合には(S106のYES)、変換条件設定部2は、変換条件が終了条件を満たすかを確認する(S107)。ここでは、終了条件は変換処理の回数の上限値とする。終了条件を満たさない場合には(S107のNO)、変換条件を設定する処理に戻る(S101)。変換条件が終了条件を満たす場合には(S107のYES)、差分判定部5が事前条件推定部42に判定結果を渡し、事前条件推定部42は、事前条件の推定処理を行う(S108B)。この場合、事前条件推定部42は2つの事前条件を算出する。出力部7は、事前条件推定部から渡された悲観的事前条件と楽観的事前条件の両方を近似解として出力する(S110)。
以上が、概略処理のフローとなる。次に各部の処理の詳細を説明する。
図13は、悲観的プログラム変換部31の変換処理のフローチャートを示す図である。当該フローは、概略処理のフローのS102に該当する。
悲観的プログラム変換部31は、検査対象のプログラムにループがあるかを判別する(S201)。ループがない場合(S201のNO)は、変換する必要がないため、S208の処理に移る。ループがある場合(S201のYES)は、多重ループであるかを判定する。多重ループである場合(S202のYES)は、ループの1重化処理を行う(S203)。多重ループでない場合(S202のNO)は、ループの1重化処理を行わずに、S204の処理に移る。
悲観的プログラム変換部31は、ループ展開のための変数を有し、変数の値を設定する(S204)。ここでは、変数をiとし、iの初期値は0、変数の値の設定は、変数iの値に1を加えることとする。次に、変数iが変換条件を超えたかを判別する(S205)。変数iの値が変換条件の値以内の場合(S205のYES)は、ループを1つ展開する(S206)。そして、再度変数の設定を行う(S204)。変数iの値が変換条件を超えるまで、このS204からS206の処理が繰り返される。変数iの値が変換条件を超えた場合(S206のNO)は、悲観的プログラム変換部31は、while文をassert文に置換する(S207)。
悲観的プログラム変換部31は、生成した悲観的プログラムを、悲観的プログラム記憶部32に格納する(S208)。以上で、悲観的プログラム変換部31の変換処理のフローが終了する。なお、悲観的プログラム記憶部32には、検査対象のプログラムも格納してもよい。また、差分判定により、再度、悲観的プログラム変換部31の変換処理が行われる場合には、悲観的プログラム変換部31は、悲観的プログラム記憶部32に格納した検査対象のプログラムを用いて変換処理を行ってもよいし、前回生成した悲観的プログラムも用いて変換処理を行ってもよい。前回生成した悲観的プログラムを用いる場合には、前回生成した悲観的プログラムのassert文を、図7(B)で示したwhile文に戻してから、ループをさらに1回展開すればよい。
図14は、楽観的プログラム変換部33の変換処理のフローチャートを示す図である。当該フローは、概略処理のフローのS103に該当する。当該フローは、悲観的プログラム変換部31の変換処理のフローとは、S307にて記述する文がassume文であることだけが異なり、他は悲観的プログラム変換部31の変換処理と同一のため、説明は省略する。
図15は、事前条件情報生成部41の生成処理のフローチャートを示す図である。当該フローは、概略処理のフローのS104に該当する。
1回目の処理の場合(S401のYES)、述語生成部411は、悲観的プログラムまたは楽観的プログラムに基づき、述語を生成する(S402)。1回目の処理でない場合は(S401のNO)、既に述語が生成されているため、S402の処理は省力される。
悲観的論理式変換部413は、悲観的プログラムを論理式に変換する(S403)。悲観的訂正集合列挙部414は、論理式から悲観的訂正集合群を算出する(S404)。同様に、楽観的論理式変換部416は、楽観的プログラムを論理式に変換し(S405)、楽観的訂正集合列挙部417は、論理式から楽観的訂正集合群を算出する(S406)。悲観的訂正集合群と楽観的訂正集合群は、事前条件情報として判定部に送られる。なお、本フローチャートは悲観的訂正集合の処理を行ってから(S403およびS404)、楽観的訂正集合の処理(S405およびS406)を行うようにしているが、並列に行われてもよいし、順番の前後を逆にしてもよい。
図16は、事前条件推定部42の生成処理のフローチャートを示す図である。当該フローは、概略処理のフローのS108AとS108Bに該当する。
悲観的矛盾核導出部421は、差分判定部5の判定結果を取得後、悲観的矛盾核群を導出する(S501)。算出された悲観的矛盾核群は、悲観的矛盾核記録部に格納される(S502)。差分判定部5の判定結果が差分なしの場合(S503のNO)は、推定部425が悲観的訂正集合群から、事前条件を1つ推定する(S504)。
差分判定部5の判定結果が差分ありの場合(S503のYES)は、楽観的矛盾核導出部423が、楽観的矛盾核群を導出する(S505)。算出された楽観的矛盾核群は、楽観的矛盾核記録部424に格納される(S506)。推定部425は、悲観的訂正集合群および楽観的訂正集合群それぞれから、事前条件を2つ推定する(S507)。
なお、本フローチャートは、差分判定部5の判定結果が差分なしの場合、悲観的矛盾核群から事前条件を導出することを想定したものである。差分判定部5の判定結果が差分なしの場合、楽観的矛盾核群から事前条件を導出するとしてもよく、その場合は、悲観的矛盾核導出の処理(S501とS502)と、楽観的矛盾核導出の処理(S505とS506)とを入れ替えればよい。
以上のように、第1の実施形態によれば、悲観的プログラムと楽観的プログラムを用いることで、推定された事前条件の正確性を保証できる。また、差分が収束せずに正確な事前条件が算出できない場合でも、2種類の近似条件をユーザに提示することで、条件の範囲を限定することができ、ユーザの利便性を向上させることができる。
(第2の実施形態)
次に、第2の実施形態について説明する。
第1の実施形態では、差分判定部5が悲観的および楽観的事前条件情報の差分を判定し、差分がなくなるまでまたは終了条件を満たすまで、ループ処理の展開数を増加させ、展開数が増加したプログラムに基づき、訂正集合群を算出した。しかし、展開数が増えるに従い、論理式も大きくなり、訂正集合群を算出する処理の負担が増加するという問題がある。
そこで、第2の実施形態では、差分があった場合に、今までに算出した訂正集合群を活用し、論理式が大きくならないようなプログラム変換を行う。これにより、第2の実施形態では、訂正集合群を第1の実施形態よりも効率よく求めることができる。
まず、本実施形態で用いる反例的訂正集合について説明する。先の図10で示した通り、悲観的訂正集合群および楽観的訂正集合群は、いずれにおいても、0(事後条件の否定)を含む訂正集合と、0を含まない訂正集合とを有する。訂正集合とは、「取り除くと解が現れるような制約の組合せ」であるため、0が含まれないということは、「事後条件の否定が満たされる解が存在する」ということである。すなわち、0を含まない訂正集合は、正常ではないプログラムの挙動を示す解(反例)となる。このような反例を示すがため、以降、0を含まない訂正集合を、「反例的訂正集合」と称する。
展開数がn(nは1以上の整数)の楽観的プログラムは、検査対象のプログラムのループ処理が指定された回数n以上実行される場合は、正常と扱うものである。ゆえに、展開数がnの楽観的プログラムの反例的訂正集合群は、「ループ処理の回数が1回からn回までのときに、事後条件が否定される場合」を示すものである。また、展開数がn+1の楽観的プログラムの反例的訂正集合群は、「ループ処理の回数が1回からn+1回までのときに、事後条件が否定される場合」を示すものである。そうすると、2つの反例的訂正集合の差は、「ループ処理の回数がn+1回のときに、事後条件が否定される場合」だけである。
したがって、展開数がnの楽観的プログラムの反例的訂正集合群が既に算出されているときは、「ループ処理の回数がn+1回のときに、事後条件が否定される場合」の反例的訂正集合を求めるためのプログラムを生成する。そして、このプログラムの反例的訂正集合群と、展開数がnの楽観的プログラムの反例的訂正集合群とを合成すれば、展開数がn+1の楽観的プログラムの反例的訂正集合群を求めることができる。
ここでは、「ループ処理の回数がn+1回のときに、事後条件が否定される場合」の反例的訂正集合を求めるためのプログラムを楽観的差分プログラム、楽観的差分プログラムにおける訂正集合を楽観的差分訂正集合と称する。
図17は、楽観的差分プログラムの一例を示す図である。図17に示す楽観的差分プログラムは、展開数が2の楽観的プログラムのif文の条件式を、assume文に置換したものである。楽観的プログラムでは、if文の条件式を満たさない場合、処理が途中で終了することがあり得る。しかし、この楽観的差分プログラムでは、if文の本文の処理が必ず2回行われ、2回処理された後でも、条件式(d!=0)を満たす場合は無視される。したがって、n=1として「ループ処理の回数がn+1回のときに、事後条件が否定される場合」のみの反例的訂正集合を求めるためのプログラムとなる。
図18は、合成を説明するための図である。図18(A)に展開数がnの楽観的訂正集合(合成前の楽観的訂正集合)、図18(B)に楽観的差分訂正集合、図18(C)に展開数がn+1の楽観的訂正集合(合成後の楽観的訂正集合)の一例を示す。合成前の楽観的訂正集合の反例的訂正集合群には含まれていない[1,5,8]が、楽観的差分訂正集合の反例的訂正集合群に含まれている。そのため、合成後の楽観的訂正集合の反例的訂正集合群には[1,5,8]が追加される。
また、[1,5,8]が、合成後の楽観的訂正集合の反例的訂正集合群にあるとすると、合成前の楽観的訂正集合群に含まれている[1,5,8,0]は、合成後の楽観的訂正集合群には含まれないはずである。ゆえに、[1,5,8,0]を削除すると、合成後の楽観的訂正集合群と同一になる。このように、反例的訂正集合群だけでなく訂正集合群同士を比較し、訂正集合の全要素を包含する訂正集合がある場合には、包含する訂正集合を削除するという方法であれば、訂正集合群同士で合成が可能である。
また、展開数がn+1の悲観的プログラムは、検査対象のプログラムのループ処理が指定された回数n+1以上実行される場合は、異常(エラー)と扱うものである。ゆえに、展開数がn+1の悲観的プログラムの反例的訂正集合群は、「ループ処理の回数が1回からn+1回までのときに、事後条件が否定される場合」と「ループがn+2回以上実行されてしまう場合」を示すものとなる。そうすると、展開数がn+1の悲観的プログラムの反例的訂正集合群と、展開数がnの楽観的プログラムの反例的訂正集合群との差は、「ループ処理の回数がn+1回のときに、事後条件が否定される場合」と「ループがn+2回以上実行されてしまう場合」である。
したがって、展開数がnの楽観的プログラムの反例的訂正集合群が既に算出されている場合は、「ループ処理の回数がn+1回のときに、事後条件が否定される場合」と「ループがn+2回以上実行されてしまう場合」の反例的訂正集合を求めるためのプログラムを生成する。そして、このプログラムの反例的訂正集合群を、展開数がnの楽観的プログラムの反例的訂正集合群と合成すれば、展開数がn+1の楽観的プログラムの反例的訂正集合群を求めることができる。
ここでは、「ループ処理の回数がn+1回のときに、事後条件が否定される場合」と「ループがn+2回以上実行されてしまう場合」の反例的訂正集合を求めるためのプログラムをを悲観的差分プログラム、悲観的差分プログラムにおける訂正集合を悲観的差分訂正集合と称する。
図19は、悲観的差分プログラムの一例を示す図である。図19に示す悲観的差分プログラムは、展開数が2の悲観的プログラムのif文の条件式を、assume文に置換したものである。悲観的プログラムでは、if文の条件式を満たさない場合、処理が途中で終了することがあり得る。しかし、この悲観的差分プログラムでは、if文の本文の処理が必ず2回行われ、2回処理された後でも、条件式(d!=0)を満たす場合は、異常とみなされる。したがって、「ループ処理の回数が2回のときに、事後条件が否定される場合」と「ループが3回以上実行されてしまう場合」の反例的訂正集合を求めるためのプログラムとなる。
図20は、悲観的差分訂正集合群による合成を説明するための図である。図20(A)に展開数がnの悲観的訂正集合(合成前の悲観的訂正集合)、図20(B)に悲観的差分訂正集合、図20(C)に展開数がn+1の悲観的訂正集合(合成後の悲観的訂正集合)の一例を示す。合成前の悲観的訂正集合群と悲観的差分訂正集合群を比較し、図18で説明したとおり、訂正集合の全要素を包含する訂正集合を削除することにより、合成後の悲観的訂正集合群が得られる。図20の例では、悲観的差分訂正集合群にある[2,6,7,0]と[3,4,7,0]を削除すればよい。ここでは、結果的に、合成前と合成後の悲観的訂正集合群は同一となっている。
以上のことから、1度、悲観的プログラムおよび楽観的プログラムを算出した後は、展開数を増加させた悲観的プログラムおよび楽観的プログラムを生成するのではなく、悲観的差分訂正集合および楽観的差分訂正集合を求めることができる変換プログラムを生成すればよいことが分かる。そして、悲観的差分訂正集合および楽観的差分訂正集合を算出し、過去の訂正集合群と合成すれば、各訂正集合群を効率的に求められる。
次に、第2の実施形態における各部の処理について、第1の実施形態と異なる点を説明する。
第2の実施形態における悲観的プログラム変換部31と楽観的プログラム変換部33は、1回目のプログラム変換処理については、第1の実施形態と同様に行い、2回目以降の変換処理については、悲観的差分プログラムおよび楽観的差分プログラムを生成する。
第2の実施形態における事前条件情報生成部41は、2回目以降の処理については、プログラム変換部3から送られる悲観的差分プログラムおよび悲観的差分プログラムに基づき、処理を行う。事前条件情報生成部41の悲観的訂正集合列挙部414および楽観的訂正集合列挙部417は、悲観的差分訂正集合群および楽観的差分訂正集合群を生成する。生成された悲観的差分訂正集合群と楽観的差分訂正集合群はそれぞれ、悲観的プログラム記憶部32と楽観的プログラム記憶部34に格納される。
差分判定部5は、合成後の悲観的訂正集合群および楽観的訂正集合群との差分を比較してもよいが、ここでは、悲観的差分訂正集合群と楽観的差分訂正集合群との差分を比較することとする。合成前の悲観的訂正集合群および楽観的訂正集合群が異なる場合において、悲観的差分訂正集合群と楽観的差分訂正集合群が異なるときは、必ず合成後の悲観的訂正集合群および楽観的訂正集合群も異なるからである。また、悲観的訂正集合の合成を、変換条件が終了条件を超えるまで、行う必要がなくなるからである。
差分がなしの場合、事前条件情報生成部41は楽観的訂正集合群のみを合成し、事前条件推定部42は、楽観的訂正集合群に基づき、事前条件を1つ推定する。また、差分がありかつ変換条件が終了条件を超えていない場合、事前条件情報生成部41は、楽観的訂正集合のみを合成する。悲観的訂正集合は、合成処理に用いられないからである。差分がありかつ変換条件が終了条件を超えた場合は、事前条件情報生成部41は、楽観的訂正集合群および悲観的訂正集合群を合成し、事前条件推定部42は、楽観的訂正集合群および悲観的訂正集合群それぞれに基づき、事前条件を2つ推定する。
なお、楽観的プログラム記憶部34には、楽観的差分訂正集合群と、楽観的訂正集合群の両方が格納されることとなるが、差分判定部5が楽観的差分訂正集合群を参照するために必要なフラグ値などを付与すればよい。または、楽観的訂正集合群を、楽観的訂正集合記憶部418とは異なる図示しない記憶部に格納してもよい。
その他の処理は、第1の実施形態と同様である。
以上のように、第2の実施形態によれば、差分が一致するまで徐々に増加させるループ展開において、訂正集合群を第1の実施形態よりも効率よく求めることができ、処理の負担を軽減することができる。
(第3の実施形態)
次に、第3の実施形態について説明する。
プログラムのループは、上述の実施形態に示したwhile文、またはwhile文に変換可能な形式で記述される場合もあれば、プログラム内で自己の関数を呼び出す再帰呼び出し形式で記述される場合もあり得る。そこで、第3の実施形態では、再帰呼び出しを含むプログラムを対象とする。
図21は、再帰関数を含むプログラムに対するプログラム変換を説明する図である。図21(A)に記載されたプログラムは、8行目に自己の関数gcd()を呼び出しているため、再帰関数を含むプログラムである。ゆえに、この8行目のgcd()を展開する。図21(B)は、再帰関数を1回展開した一例である。3行目に、新たなローカル変数d0の宣言文が挿入されている。そして、変換前のプログラムにてgcd()を呼び出した箇所(図21(A)の8行目)に、ローカル変数の宣言文(図21(A)の2行目)以外の元のプログラムを展開する(図21(B)の9から13行目)。但し、呼び出し関数の引数は、nとdであるたため、変数mの代わりに変数nに、変数nの代わりに変数dに置き換えて展開する。変換前のプログラムにて、変数dが記載されていた箇所には、変数dの代わりに、変数d0に置き換える。そして、展開数が1の場合は、13行目に記載されたgcd()を悲観的プログラムならばassert文に、楽観的プログラムならばassume文に置き換えれば、変換後のプログラムが生成される。
図21(C)は、上記のように生成された悲観的プログラムを示す。なお、ここではassert文の条件式は、便宜的に、(!1)と記載する。C言語では、TRUEは1、Falseは0で表示される。
図22は、再帰関数を含むプログラムに基づく悲観的プログラムと楽観的プログラムの一例を示す図である。ローカル変数は、d0とd1を用いている。このように、展開数に合わせて、使用するローカル変数と、記載される再帰関数の本文が増加する。
第3の実施形態では、上記のように変換された悲観的プログラムおよび楽観的プログラムを用いて、事前条件を算出する。悲観的プログラムおよび楽観的プログラムの変換は、悲観的プログラム変換部31および楽観的プログラム変換部33に、予め再帰関数の処理方法を登録しておけばよい。なお、ここでは、再帰関数だけを含み、ループ処理を含まないプログラムを例示したが両方を含んでいてもよく、悲観的プログラム変換部31と楽観的プログラム変換部33が、ループと再帰関数を検知して、それらに応じた展開処理を行うようにすればよい。
悲観的プログラムおよび楽観的プログラムを算出する方法以外は、今までの実施形態と同様のため、省略する。
以上のように、第3の実施形態によれば、再帰関数を含んだプログラムにも対応することが可能である。
上記に説明した実施形態における各処理は、ソフトウェア(プログラム)によって実現することが可能である。よって、上記に説明した実施形態における推定装置は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用い、コンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することが可能である。
図23は、本発明の一実施形態に係るハードウェア構成の一例を示すブロック図である。推定装置は、プロセッサ801、主記憶装置802、補助記憶装置803、デバイスインタフェース804を備え、これらがバス805を介して接続された、コンピュータ装置8として実現できる。
プロセッサ801が、補助記憶装置803からプログラムを読み出して、主記憶装置802に展開して、実行することで、変換条件設定部2、プログラム変換部3、事前条件導出部4、差分判定部5の機能を実現することができる。
本実施形態の推定装置は、当該推定装置で実行されるプログラムをコンピュータ装置に予めインストールすることで実現してもよいし、プログラムをCD−ROMなどの記憶媒体に記憶して、あるいはネットワークを介して配布して、コンピュータ装置に適宜インストールすることで実現してもよい。
主記憶装置802は、プロセッサ801が実行する命令、および各種データ等を一時的に記憶するメモリ装置であり、DRAM等の揮発性メモリでも、MRAM等の不揮発性メモリでもよい。補助記憶装置803は、プログラムやデータ等を永続的に記憶する記憶装置であり、例えば、HDDまたはSSD等がある。変換条件記憶部6などの記憶部などが保持するデータは、主記憶装置802、補助記憶装置803または外部記憶媒体に保存される。
デバイスインタフェース804は、外部記憶媒体9などの機器に接続するインタフェースである。外部記憶媒体9は、HDD、CD−R、CD−RW、DVD−RAM、DVD−R、SAN(Storage area network)等の任意の記録媒体でよい。変換条件記憶部6などの記憶部は、外部記憶媒体9としてデバイスインタフェース804に接続されてもよい。
上記に、本発明の一実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
1 入力部
2 変換条件設定部
3 プログラム変換部
31 悲観的プログラム変換部
32 悲観的プログラム記憶部
33 楽観的プログラム変換部
34 楽観的プログラム記憶部
4 事前条件導出部
41 事前条件情報生成部
411 述語生成部
412 述語記憶部
413 悲観的論理式変換部
414 悲観的訂正集合列挙部
415 悲観的訂正集合記憶部
416 楽観的論理式変換部
417 楽観的訂正集合列挙部
418 楽観的訂正集合記憶部
42 事前条件推定部
421 悲観的矛盾核導出部
422 悲観的矛盾核記憶部
423 楽観的矛盾核導出部
424 楽観的矛盾核記憶部
425 推定部
5 差分判定部
6 変換条件記憶部
7 出力部
8 コンピュータ装置
801 プロセッサ
802 主記憶装置
803 補助記憶装置
804 デバイスインタフェース
805 バス
9 外部記憶媒体

Claims (9)

  1. 与えられたプログラムに含まれるループ処理または再帰処理と同一の処理を、前記ループ処理または前記再帰処理の実行条件を満たす限り、与えられた指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後も前記実行条件を満たすときは、エラーを発生させる第1変換プログラムと、
    前記ループ処理または前記再帰処理と同一の処理を、前記実行条件を満たす限り、前記指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された場合は、前記実行条件が満たされないとみなす前記第2変換プログラムと
    を生成するプログラム変換部と、
    前記プログラムの事後条件および前記第1変換プログラムに基づき、前記第1変換プログラムの事前条件に関する情報である第1事前条件情報を生成し、
    前記事後条件および前記第2変換プログラムに基づき、前記第2変換プログラムの事前条件に関する情報である第2事前条件情報を生成する
    事前条件情報生成部と、
    前記第1事前条件情報と前記第2事前条件情報との差分の有無について第1判定を行う
    差分判定部と、
    前記第1判定の結果が差分なしの場合は、前記第1事前条件情報または前記第2事前条件情報に基づき、前記プログラムの事前条件を推定する
    事前条件推定部と、
    を備えるプログラム仕様推定装置。
  2. 前記第1判定結果が差分ありの場合において、予め与えられた終了条件を満たさないときは、前記指定数を1つ増加させる変換条件設定部
    をさらに備え、
    前記プログラム変換部は、増加された前記指定数に応じた新たな第1および第2変換プログラムを生成し、
    前記事前条件情報生成部、前記差分判定部および前記事前条件推定部は、再度処理を行う
    請求項1に記載のプログラム仕様推定装置。
  3. 前記プログラム仕様推定装置は、前記第1判定結果が差分ありの場合において、前記終了条件を満たすときは、前記第1事前条件情報および前記第2事前条件情報それぞれに基づき、前記プログラムの事前条件を2つ推定する
    請求項2に記載のプログラム仕様推定装置。
  4. 前記事前条件情報生成部は、
    前記第1変換プログラムまたは前記第2変換プログラムに基づき、前記プログラムの引数またはグローバル変数の制約式である述語群を生成し、
    前記述語群と、前記第1変換プログラムの実行と、前記事後条件の否定の論理積から成る第1論理式に基づき、前記第1論理式の極小訂正集合から成る第1訂正集合群と、前記述語群と、前記第2変換プログラムの実行と、前記事後条件の否定の論理積から成る第2論理式に基づき、前記第2論理式の極小訂正集合から成る第2訂正集合群と、を生成し、
    前記第1訂正集合群を前記第1事前条件情報と、前記第2訂正集合群を前記第2事前条件情報とする
    請求項1ないし3のいずれか一項に記載のプログラム仕様推定装置。
  5. 前記事前条件情報生成部は、
    前記第1変換プログラムまたは前記第2変換プログラムに基づき、前記プログラムの引数またはグローバル変数の制約式である述語群を生成し、
    前記述語群と、前記第1変換プログラムの実行と、前記事後条件の否定の論理積から成る第1論理式に基づき、前記第1論理式の極小訂正集合から成る第1訂正集合群と、前記述語群と、前記第2変換プログラムの実行と、前記事後条件の否定の論理積から成る第2論理式に基づき、前記第2論理式の極小訂正集合から成る第2訂正集合群と、を生成し、前記第1訂正集合群および前記第2訂正集合群それぞれに基づき、前記第1論理式の極小矛盾核である第1矛盾核群および前記第2論理式の極小矛盾核である第2矛盾核群を生成し、
    前記第1矛盾核群を前記第1事前条件情報と、前記第2矛盾核群を前記第2事前条件情報とする
    請求項1ないし3のいずれか一項に記載のプログラム仕様推定装置。
  6. 前記プログラム変換部は、
    前記新たな第1および第2変換プログラムを生成する代わりに、
    前記ループ処理または前記再帰処理と同一の処理を、前記実行条件を満たすとみなして、前記増加された前記指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後も前記実行条件を満たすときは、エラーを発生させる第3変換プログラムと、
    前記実行条件を満たすとみなして、前記増加された前記指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後に、前記実行条件が満たされないとみなす第4変換プログラムとを生成し、
    前記事前条件情報生成部は、
    前記プログラムの事後条件および前記第3変換プログラムに基づき、前記第3変換プログラムの事前条件に関する情報である第3事前条件情報を生成し、
    前記事後条件および前記第4変換プログラムに基づき、前記第4変換プログラムの事前条件に関する情報である第4事前条件情報を生成し、
    前記差分判定部は、
    前記第1判定を既に一度行った後は、前記第1判定の代わりに、前記第3事前条件情報と前記第4事前条件情報との差分の有無について第2判定を行い、
    さらに前記事前条件情報生成部は、前記第2判定の結果が差分なしの場合および前記第2判定の結果が差分ありであって前記終了条件を満たさない場合は、前記第2事前条件情報と前記第3事前条件情報に基づく新たな前記第1事前条件情報、または前記第2事前条件情報と前記第4事前条件情報に基づく新たな前記第2事前条件情報を、生成し、
    前記第2判定の結果が差分ありであって前記終了条件を満たす場合は、前記新たな第1事前条件情報および前記新たな第2事前条件情報を生成する
    請求項2または3に記載のプログラム仕様推定装置。
  7. 前記事前条件情報生成部は、
    前記第1変換プログラムまたは前記第2変換プログラムに基づき、前記プログラムの引数またはグローバル変数の制約式である述語群を生成し、
    前記述語群と、前記第1変換プログラムの実行と、前記事後条件の否定の論理積から成る第1論理式に基づき、前記第1論理式の極小訂正集合から成る第1訂正集合群と、前記述語群と、前記第2変換プログラムの実行と、前記事後条件の否定の論理積から成る第2論理式に基づき、前記第2論理式の極小訂正集合から成る第2訂正集合群と、を生成し、前記述語群と、前記第3変換プログラムの実行と、前記事後条件の否定の論理積から成る第3論理式に基づき、前記第3論理式の極小訂正集合から成る第3訂正集合群と、前記述語群と、前記第4変換プログラムの実行と、前記事後条件の否定の論理積から成る第4論理式に基づき、前記第4論理式の極小訂正集合から成る第4訂正集合群と、を生成し、
    前記第1訂正集合群を前記第1事前条件情報と、前記第2訂正集合群を前記第2事前条件情報と、前記第3訂正集合群を前記第3事前条件情報と、前記第4訂正集合群を前記第4事前条件情報とする
    請求項6に記載のプログラム仕様推定装置。
  8. 与えられたプログラムに含まれるループ処理または再帰処理と同一の処理を、前記ループ処理または前記再帰処理の実行条件を満たす限り、与えられた指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後も前記実行条件を満たすときは、エラーを発生させる第1変換プログラムと、
    前記ループ処理または前記再帰処理と同一の処理を、前記実行条件を満たす限り、前記指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後に、前記実行条件が満たされないとみなす第2変換プログラムと
    を生成するプログラム変換ステップと、
    前記プログラムの事後条件および前記第1変換プログラムに基づき、前記第1変換プログラムの事前条件に関する情報である第1事前条件情報を生成し、
    前記事後条件および前記第2変換プログラムに基づき、前記第2変換プログラムの事前条件に関する情報である第2事前条件情報を生成する
    事前条件情報生成ステップと、
    前記第1事前条件情報と前記第2事前条件情報との差分の有無について第1判定を行う
    第1判定ステップと、
    前記第1判定の結果が差分なしの場合は、前記第1事前条件情報または前記第2事前条件情報に基づき、前記プログラムの事前条件を推定する
    事前条件推定ステップと、
    をコンピュータが実行する推定方法。
  9. 与えられたプログラムに含まれるループ処理または再帰処理と同一の処理を、前記ループ処理または前記再帰処理の実行条件を満たす限り、与えられた指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後も前記実行条件を満たすときは、エラーを発生させる第1変換プログラムと、
    前記ループ処理または前記再帰処理と同一の処理を、前記実行条件を満たす限り、前記指定数まで繰り返し実行し、前記同一の処理が前記指定数まで繰り返し実行された後に、前記実行条件が満たされないとみなす第2変換プログラムと
    を生成するプログラム変換ステップと、
    前記プログラムの事後条件および前記第1変換プログラムに基づき、前記第1変換プログラムの事前条件に関する情報である第1事前条件情報を生成し、
    前記事後条件および前記第2変換プログラムに基づき、前記第2変換プログラムの事前条件に関する情報である第2事前条件情報を生成する
    事前条件情報生成ステップと、
    前記第1事前条件情報と前記第2事前条件情報との差分の有無について第1判定を行う
    第1判定ステップと、
    前記第1判定の結果が差分なしの場合は、前記第1事前条件情報または前記第2事前条件情報に基づき、前記プログラムの事前条件を推定する
    事前条件推定ステップと、
    をコンピュータに実行させるためのプログラム。
JP2015162203A 2015-08-19 2015-08-19 プログラム仕様推定装置、推定方法、および推定プログラム Abandoned JP2017041085A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2015162203A JP2017041085A (ja) 2015-08-19 2015-08-19 プログラム仕様推定装置、推定方法、および推定プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2015162203A JP2017041085A (ja) 2015-08-19 2015-08-19 プログラム仕様推定装置、推定方法、および推定プログラム

Publications (1)

Publication Number Publication Date
JP2017041085A true JP2017041085A (ja) 2017-02-23

Family

ID=58203529

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015162203A Abandoned JP2017041085A (ja) 2015-08-19 2015-08-19 プログラム仕様推定装置、推定方法、および推定プログラム

Country Status (1)

Country Link
JP (1) JP2017041085A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPWO2021161532A1 (ja) * 2020-02-14 2021-08-19
CN114936109A (zh) * 2022-05-25 2022-08-23 南通大学 一种基于模型检测的反例故障定位方法

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPWO2021161532A1 (ja) * 2020-02-14 2021-08-19
WO2021161532A1 (ja) * 2020-02-14 2021-08-19 日本電気株式会社 ループアンローリング処理装置、方法およびプログラム
JP7302728B2 (ja) 2020-02-14 2023-07-04 日本電気株式会社 ループアンローリング処理装置、方法およびプログラム
CN114936109A (zh) * 2022-05-25 2022-08-23 南通大学 一种基于模型检测的反例故障定位方法

Similar Documents

Publication Publication Date Title
EP1706833B1 (en) System and method for modeling, abstraction, and analysis of software
Kulkarni et al. Automating the addition of fault-tolerance
US9164977B2 (en) Error correction in tables using discovered functional dependencies
JP2017062780A (ja) 誤検出の効率的な排除に基づく静的解析
US7853906B2 (en) Accelerating high-level bounded model checking
US20130145347A1 (en) Automatic modularization of source code
US8578311B1 (en) Method and system for optimal diameter bounding of designs with complex feed-forward components
US20110145799A1 (en) Path-sensitive dataflow analysis including path refinement
US8996339B2 (en) Incremental formal verification
US8589837B1 (en) Constructing inductive counterexamples in a multi-algorithm verification framework
v. Gleissenthall et al. Solver-aided constant-time hardware verification
JP2017041085A (ja) プログラム仕様推定装置、推定方法、および推定プログラム
US20180150379A1 (en) Method and system of verifying software
Zhang et al. A resolution calculus for the branching-time temporal logic CTL
van Kesteren et al. Inferring static non-monotone size-aware types through testing
US8352234B2 (en) Model generation based on a constraint and an initial model
JP6173571B2 (ja) 回路設計装置および回路設計プログラム
US10546083B1 (en) System, method, and computer program product for improving coverage accuracy in formal verification
US20090235223A1 (en) Program generation apparatus and program generation method
Gori et al. Hidden States in Reaction Systems.
Jansen et al. The COMICS tool-Computing minimal counterexamples for discrete-time Markov chains
M'zah et al. Deterministic microcode machine generation
JP5009243B2 (ja) 動作合成装置、動作合成方法、プログラム、記録媒体、および半導体集積回路の製造方法
Schäffeler et al. Formally Verified Approximate Policy Iteration
JP6497271B2 (ja) テストデータ生成装置、方法、及びプログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180201

A762 Written abandonment of application

Free format text: JAPANESE INTERMEDIATE CODE: A762

Effective date: 20180523