JP2011215998A - プログラム検証装置 - Google Patents
プログラム検証装置 Download PDFInfo
- Publication number
- JP2011215998A JP2011215998A JP2010085057A JP2010085057A JP2011215998A JP 2011215998 A JP2011215998 A JP 2011215998A JP 2010085057 A JP2010085057 A JP 2010085057A JP 2010085057 A JP2010085057 A JP 2010085057A JP 2011215998 A JP2011215998 A JP 2011215998A
- Authority
- JP
- Japan
- Prior art keywords
- abstract syntax
- program
- syntax tree
- verification
- output
- 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.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
【課題】ユーザの判定作業を排除し、プログラムの検証を効率化することのできるプログラム検証装置を得る。
【解決手段】プログラムフロントエンド5によって、プログラム1を抽象構文木に変換し、プログラム抽象構文木8とする。仕様フロントエンド6によって、内部仕様2を抽象構文木に変換し、仕様抽象構文木9とする。抽象構文木検証部7は、プログラム抽象構文木8と仕様抽象構文木9とを比較し、検証対象プログラムが内部仕様2を満足するかを検証する。検証対象プログラムが内部仕様2を満足することができなかった場合は、検証結果をプログラムの誤り位置として示す検証結果報告書3を出力する。
【選択図】図1
【解決手段】プログラムフロントエンド5によって、プログラム1を抽象構文木に変換し、プログラム抽象構文木8とする。仕様フロントエンド6によって、内部仕様2を抽象構文木に変換し、仕様抽象構文木9とする。抽象構文木検証部7は、プログラム抽象構文木8と仕様抽象構文木9とを比較し、検証対象プログラムが内部仕様2を満足するかを検証する。検証対象プログラムが内部仕様2を満足することができなかった場合は、検証結果をプログラムの誤り位置として示す検証結果報告書3を出力する。
【選択図】図1
Description
本発明は、ユーザがプログラムの入出力及び入出力間の関係を記述した内部仕様に基づいて作成したプログラムが、内部仕様に一致することを検証するプログラム検証装置に関するものである。
従来のプログラム検証装置では、プログラムの検証は実機あるいはシミュレータ上で検証対象のプログラムを動作させ、想定される入力を設定し、その際の出力を確認することでプログラムが仕様に一致しているかを検証していた。しかし、このような動的な試験では、一般に対象プログラムをブラックボックスとして試験するため、プログラムに間違いが存在している場合でも、間違いを検出するための適切な入力が設定されなければ、検出漏れが発生する。また、クロスコンパイル環境では、実機あるいはシミュレータがなければ試験が実施できないという問題がある。
一方、静的な解析を行う方法としては、例えば特許文献1に記載されたようなプログラム検証装置があった。このようなプログラム検証装置は、プログラムを入力としてロジックの解析を行い、設定したプログラムの入出力間の関係を示す入出力対応表を作成するものである。仕様との一致は、入出力対応表を基に人が目視で確認する。
このようなプログラム検証装置では、ロジック解析の際、対象とする出力データが2度以上更新されている場合は、最後のデータ更新処理のみを採用するため、結果が正しいにもかかわらずエラーとして認識してしまう可能性があった。例えば、result=(x+4)*3という内部仕様について考える。この例では、対象とする出力データはresultである。この内部仕様に基づいて、ユーザがresult=x+4、result=result*3というプログラムを作成した場合、プログラムは正しく動作するが、入出力対応表には、最後のデータ更新処理であるresult=result*3のみが出力されるため、ユーザはプログラムを間違いと判断する。
このようなプログラム検証装置では、ロジック解析の際、対象とする出力データが2度以上更新されている場合は、最後のデータ更新処理のみを採用するため、結果が正しいにもかかわらずエラーとして認識してしまう可能性があった。例えば、result=(x+4)*3という内部仕様について考える。この例では、対象とする出力データはresultである。この内部仕様に基づいて、ユーザがresult=x+4、result=result*3というプログラムを作成した場合、プログラムは正しく動作するが、入出力対応表には、最後のデータ更新処理であるresult=result*3のみが出力されるため、ユーザはプログラムを間違いと判断する。
上述した静的なロジック解析を行う検証装置は、入出力関連表に基づいて仕様との一致を人が目視によって確認しなければならなかった。プログラムの作成においては、論理的に等価な様々な記述方法が存在するが、従来の検証装置では、入出力関連表を出力する際には、複数の表現方法の中から、唯一の表現方法を選択することになる。従って、その記述が仕様の記述と異なる場合、その記述が一致するかの判断はユーザに委ねられることとなる。また、上述したように同じデータが2度以上更新されている場合には、最後のデータ更新処理のみを入出力表に出力するため、全ての更新処理を総合したプログラムが正しい場合でも、最後のデータ更新処理が仕様と異なる場合にはユーザは間違いと判断してしまうという問題があった。
本発明は、上記のような課題を解決するためになされたもので、ユーザの判定作業を排除し、プログラムの検証を効率化することのできるプログラム検証装置を得ることを目的とする。
この発明に係るプログラム検証装置は、検証対象プログラムが内部仕様を満足するかを検証するプログラム検証装置において、検証対象プログラムを抽象構文木に変換するプログラム変換手段と、内部仕様を抽象構文木に変換する内部仕様変換手段と、変換したそれぞれの抽象構文木を比較することで仕様に一致するか否かを検証する抽象構文木検証部とを備えたものである。
この発明のプログラム検証装置は、検証対象プログラムから生成した抽象構文木と内部仕様から生成した抽象構文木とを比較して仕様に一致するか否かを検証するようにしたので、ユーザの判定作業を不要とし、プログラムの検証を効率化することができる。
実施の形態1.
図1は、この発明の実施の形態1によるプログラム検証装置とその処理プロセスを示す説明図である。
図1に示すプログラム検証装置4は、プログラム1及び内部仕様2を入力とし、静的解析を行い、出力ファイルとしてプログラムの検証結果を検証結果報告書3として出力する。尚、本発明は静的なプログラム検証であるため、実機あるいはシミュレータは不要である。
図1は、この発明の実施の形態1によるプログラム検証装置とその処理プロセスを示す説明図である。
図1に示すプログラム検証装置4は、プログラム1及び内部仕様2を入力とし、静的解析を行い、出力ファイルとしてプログラムの検証結果を検証結果報告書3として出力する。尚、本発明は静的なプログラム検証であるため、実機あるいはシミュレータは不要である。
プログラム検証装置4は、プログラム1の静的解析を実施するために、プログラムフロントエンド5、仕様フロントエンド6、抽象構文木検証部7の処理手段を備える。以下、各々の処理プロセスの機能について説明する。
プログラムフロントエンド5は、プログラム1を入力として抽象構文木への変換を行うプログラム変換手段を構成する。変換の際、エラー発生時に識別を容易にする情報として、高級言語では行番号、シーケンスプログラムでは回路のステップ番号などを持たせる。ステップは、シーケンスプログラムにおいてプログラムのサイズを表す値であり、プログラム全体で一意に付加されるため回路の識別に使用可能である。また、抽象構文木比較の効率化のために、抽象構文木毎に変換の際に抽象構文木内のノード数、及びノード名を記憶する。抽象構文木の詳細な解析を行う前に、これらの情報を比較し、一致しなければ不一致として解析を終了することで、解析時間を短縮することが可能である。プログラム抽象構文木8は、プログラムフロントエンド5の出力を示している。
仕様フロントエンド6は、入出力変数とその変数間の関連を記述した内部仕様2を入力として抽象構文木への変換を行う内部仕様変換手段を構成する。変換の際、入出力仕様の行番号などエラー発生時に識別可能な番号を持たせる。また、検証の効率化のために、抽象構文木毎に変換の際に抽象構文木内のノード数、及びノード名を記憶する。仕様抽象構文木9は仕様フロントエンド6の出力を示している。
抽象構文木検証部7は、図2に示すように、プログラム抽象構文木8が仕様抽象構文木9の何れかに一致するかを順に比較する。一致する仕様抽象構文木9が存在しない場合には、プログラム抽象構文木8に対して等価な抽象構文木への変換や最適化を実施し、再度比較を実施する。尚、この比較処理では、プログラムフロントエンド5及び仕様フロントエンド6による抽象構文木への変換の際に付加したノード数、ノード名の情報を用いた単純な比較処理を最初に実施し、詳細な解析は上記条件を満足した抽象構文木に対して実施することで、検証効率を向上することが可能である。
図3は、抽象構文木検証部7の内部を示す構成図である。
抽象構文木検証部7は、抽象構文木を最適化するための最適化機能を有する最適化部10と、等価な抽象構文木に変換するための等価抽象構文木変換機能を有する等価回路変換部11と、等価回路変換部11における等価変換のパターンを記憶したテンプレート16と、これら最適化部10及び等価回路変換部11を適宜用いて、プログラム抽象構文木8と仕様抽象構文木9との一致比較を行う抽象構文木比較部12と、抽象構文木比較部12における比較の結果、一致しなかったプログラム抽象構文木8を記憶するためのプログラム抽象構文木検証結果記憶部13と、一致した仕様抽象構文木9を記憶するための内部仕様抽象構文木検証結果記憶部14と、これらプログラム抽象構文木検証結果記憶部13と内部仕様抽象構文木検証結果記憶部14との結果に基づいて検証結果をユーザに報告するための検証結果報告部15からなる。
抽象構文木検証部7は、抽象構文木を最適化するための最適化機能を有する最適化部10と、等価な抽象構文木に変換するための等価抽象構文木変換機能を有する等価回路変換部11と、等価回路変換部11における等価変換のパターンを記憶したテンプレート16と、これら最適化部10及び等価回路変換部11を適宜用いて、プログラム抽象構文木8と仕様抽象構文木9との一致比較を行う抽象構文木比較部12と、抽象構文木比較部12における比較の結果、一致しなかったプログラム抽象構文木8を記憶するためのプログラム抽象構文木検証結果記憶部13と、一致した仕様抽象構文木9を記憶するための内部仕様抽象構文木検証結果記憶部14と、これらプログラム抽象構文木検証結果記憶部13と内部仕様抽象構文木検証結果記憶部14との結果に基づいて検証結果をユーザに報告するための検証結果報告部15からなる。
最適化部10における最適化機能とは、ユーザの冗長な記述を最適化する中間変数の削除、論理条件の最適化といった、プログラムとして等価な抽象構文木への変換機能を提供するものである。等価回路変換部11における等価抽象構文木変換機能とは、左右のノードの入れ替え、及びドモルガンの定理の変換といった、抽象構文木として等価である異なる抽象構文木への変換機能を提供するものである。
抽象構文木比較手順を図4に示す。抽象構文木比較部12は、ステップST10で、解析対象の抽象構文木をプログラム抽象構文木8の先頭に設定した後、プログラム抽象構文木8の全てを検証するまで(ステップST11〜ステップST22)、繰り返し全ての仕様抽象構文木9との抽象構文木比較(ステップST13〜ステップST16)を行う。ステップST14において二つの抽象構文木が一致すれば、一致した仕様抽象構文木9の識別子(変換の際に記憶した行番号など)を内部仕様抽象構文木検証結果記憶部14に登録し(ステップST15)、そのプログラム抽象構文木8の検証を終了する。
一方、ステップST14において一致しない場合には、等価回路変換部11により、プログラム抽象構文木8を等価な抽象構文木に変換し(ステップST17、ST18)、仕様抽象構文木9との比較を再度行う。等価回路変換部11は、等価な抽象構文木のテンプレートをテンプレート16として保持し、対象の抽象構文木の一部をテンプレート16に基づいて置換する。例えば、対象の抽象構文木の左右のノードの入れ替えを行う。テンプレート16に基づく等価な抽象構文木への変換を全て行っても一致する仕様抽象構文木9が見つからない場合には、プログラム抽象構文木8に対して最適化部10により最適化を行い(ステップST19、ST21)、再度抽象構文木を比較する。等価な抽象構文木への変換、及び抽象構文木の最適化を行っても、一致する仕様抽象構文木9が見つからなければ、対象のプログラム抽象構文木8の識別番号(抽象構文木生成の際に記憶した行番号、あるいはステップ番号)をプログラム抽象構文木検証結果記憶部13に記憶する(ステップST20)。
次に、図4で示したステップST14における抽象構文木の一致判定手順について説明する。二つの抽象構文木に対してノード数が一致し、抽象構文木内に含まれるノード名が一致し、抽象構文木を根から順に辿った左右のノード配置(以下、抽象構文木の構造と称す)が一致し、且つ各ノードの名前が一致していれば二つのノードは一致していると判断する。一方、ノード数が異なる、抽象構文木に含まれるノード名が異なる、抽象構文木を根から順に辿った左右のノード配置が異なる、あるいは何れかのノードの名前が異なる場合は非一致と判断する。
上記の抽象構文木の一致判定手順をフローチャートで示したものが図5及び図6であり、以下、これらフローチャートを用いてその手順を説明する。
一致判定では、初めに、処理時間が短く簡易な抽象構文木のノード数比較(ステップST30)、ノード名比較(ステップST31)により、詳細比較を行う対象を限定する。これらステップST30,ST31において、ノード数、ノード名が一致したものに対しては、ステップST32以下に示す詳細な抽象構文木の一致判定を行う。この一致判定では、比較を行う二つの抽象構文木の根を解析対象のノードとしてそれぞれ記憶し(ステップST32)、ノード比較処理(ステップST33〜ST35)を呼び出す。フローチャートでは、プログラム抽象構文木の解析対象ノードをp、仕様抽象構文木の解析対象ノードをsで表す。
一致判定では、初めに、処理時間が短く簡易な抽象構文木のノード数比較(ステップST30)、ノード名比較(ステップST31)により、詳細比較を行う対象を限定する。これらステップST30,ST31において、ノード数、ノード名が一致したものに対しては、ステップST32以下に示す詳細な抽象構文木の一致判定を行う。この一致判定では、比較を行う二つの抽象構文木の根を解析対象のノードとしてそれぞれ記憶し(ステップST32)、ノード比較処理(ステップST33〜ST35)を呼び出す。フローチャートでは、プログラム抽象構文木の解析対象ノードをp、仕様抽象構文木の解析対象ノードをsで表す。
ノード比較処理では、図6に示すように、両ノードの名前が一致していれば(ステップST40)、ステップST41以降で子ノードの解析を行う。子ノードの解析は左子ノード→右子ノードの順に行う。両ノードの左子ノードが存在していれば(ステップST41,ST42)、解析対象ノードを左子ノードに設定して、ノード比較処理を呼び出す(ステップST43)。ステップST42がNOの場合には、一方のノードのみが左子ノードを持ち、抽象構文木は一致しないため、偽を返す。また、左子ノードのノード比較処理結果が偽の場合には、抽象構文木は一致しないため、偽を返す(ステップST44)。ステップST41において両ノードの左子ノードが存在せず、また、ステップST44において、それまでの比較結果が真である場合は、右子ノードの解析(ステップST45)に移る。両ノードの右子ノードが存在していれば(ステップST45,ST46)、解析対象ノードを右子ノードに設定して、ノード比較処理を呼び出す(ステップST47)。ステップST46がNOの場合には、一方のノードのみが右子ノードを持ち、抽象構文木は一致しないため、偽を返す。また、右子ノードのノード比較結果が偽の場合には、抽象構文木は一致しないため、比較結果として偽を返す(ステップST48)。両ノードの右子ノードが存在せず、比較結果が真のままの場合は、真を返す。
この比較手順を実際の抽象構文木に対して適用した例を図7に示す。図7において(a)はプログラム抽象構文木、(b)は仕様抽象構文木を示している。
図7では、抽象構文木から括弧内の番号順にノードの比較を行っている。例では、(1)、(2)までの抽象構文木の構成が一致しているが、(3)の比較においてノード名が異なっているため、その時点で解析を終了し、結果は偽となる。結果が偽として確定しているため、図の(4)の評価は行わない。
図7では、抽象構文木から括弧内の番号順にノードの比較を行っている。例では、(1)、(2)までの抽象構文木の構成が一致しているが、(3)の比較においてノード名が異なっているため、その時点で解析を終了し、結果は偽となる。結果が偽として確定しているため、図の(4)の評価は行わない。
次に、プログラム検証装置4の動作の流れを説明する。ここでは、実例として論理式の場合を説明する。
図8はプログラム例であり、図9は入出力を定義した入出力仕様である。図9に示すような入出力仕様は、図8に示すようなプログラムにおいて共通のアルゴリズムで処理する入出力のみを定義する。入出力仕様には、入出力間の関連は含まない。入出力間の関連は、動作仕様に記述する。図10に動作仕様の例を示す。図10の動作仕様は、Yout1=Xin1 OR Xin2であり、Xin1あるいはXin2が真である場合に、Yout1が真となることを意味する。この動作仕様の各要素Yout1、Xin1、Xin2は、入出力仕様のラベルを示す。仕様フロントエンドは、図11に示すように動作仕様の各要素と同名の入出力仕様のラベルを持つ表から、データを1行ずつ読み込んで、対象の要素と置き換えを行う。
図8はプログラム例であり、図9は入出力を定義した入出力仕様である。図9に示すような入出力仕様は、図8に示すようなプログラムにおいて共通のアルゴリズムで処理する入出力のみを定義する。入出力仕様には、入出力間の関連は含まない。入出力間の関連は、動作仕様に記述する。図10に動作仕様の例を示す。図10の動作仕様は、Yout1=Xin1 OR Xin2であり、Xin1あるいはXin2が真である場合に、Yout1が真となることを意味する。この動作仕様の各要素Yout1、Xin1、Xin2は、入出力仕様のラベルを示す。仕様フロントエンドは、図11に示すように動作仕様の各要素と同名の入出力仕様のラベルを持つ表から、データを1行ずつ読み込んで、対象の要素と置き換えを行う。
結果として、仕様フロントエンド6は、入出力仕様から3行分の入力データを読み込んで、以下の3つの抽象構文木を生成する。
Y1=X1 OR X2・・・入出力仕様第1行より生成
Y2=X3 OR X4・・・入出力仕様第2行より生成
Y3=X5 OR X6・・・入出力仕様第3行より生成
Y1=X1 OR X2・・・入出力仕様第1行より生成
Y2=X3 OR X4・・・入出力仕様第2行より生成
Y3=X5 OR X6・・・入出力仕様第3行より生成
図12は、内部仕様2としての図9及び図10に示す入出力仕様及び動作仕様に基づいてユーザが作成したプログラムである。入力仕様要素1に対応するのがステップ0の回路(以下、回路0)であり、要素2に対応するのがステップ3の回路(以下、回路3)であり、要素3に対応するのがステップ6の回路(以下、回路6)である。
図13は、仕様フロントエンド6によって入出力仕様第1行に対応する内部仕様を抽象構文木に変換した結果を示すものである。図14は、プログラムフロントエンド5によって回路0を抽象構文木に変換した結果である。図13及び図14に示す二つの抽象構文木は要素数、抽象構文木の構造、ノードの名前全てが完全に一致しているため、回路0は内部仕様を満足している。
図13は、仕様フロントエンド6によって入出力仕様第1行に対応する内部仕様を抽象構文木に変換した結果を示すものである。図14は、プログラムフロントエンド5によって回路0を抽象構文木に変換した結果である。図13及び図14に示す二つの抽象構文木は要素数、抽象構文木の構造、ノードの名前全てが完全に一致しているため、回路0は内部仕様を満足している。
抽象構文木比較部12は、プログラムから生成されたそれぞれのプログラム抽象構文木8に対して、最適化部10や等価回路変換部11を用いて、最適化、等価な回路への変換を行い、仕様抽象構文木9との比較を行う。一致する内部仕様を検出した場合は、対応する仕様抽象構文木9の識別子(変換の際に付加した入出力仕様の行番号などの情報)を内部仕様抽象構文木検証結果記憶部14に記憶する。一方、一致する内部仕様が検出されない場合、プログラム抽象構文木検証結果記憶部13に対象のプログラム抽象構文木の識別子(変換の際に付加した行番号などの情報)を記憶する。
検証結果報告部15は、プログラム抽象構文木検証結果記憶部13におけるプログラム抽象構文木検証結果と、内部仕様抽象構文木検証結果記憶部14における内部仕様抽象構文木検証結果を基に検証結果を報告する。内部仕様の全ての要素が内部仕様抽象構文木検証結果記憶部14に登録されていれば、全ての内部仕様を満足しているため、OKを出力する。一方、全ての内部仕様が登録されていなければ、対応するプログラムが存在しない要素番号を報告書に出力する。即ち、このような場合、検証結果報告部15は、検証結果をプログラムの誤り位置として示す検証結果報告書3を出力する。
図15における[error1]は、内部仕様のエラー例である。また、プログラム抽象構文木検証結果記憶部13には、一致する内部仕様が存在しないプログラムの行番号が登録されるため、その情報を検証結果報告書に出力する。図15における[error2]は、プログラムのエラー例である。
図16は、仕様フロントエンド6によって入出力仕様要素第2行に対応する内部仕様を抽象構文木に変換した結果である。また、図17は、プログラムフロントエンド5によって回路3を抽象構文木に変換した結果である。図12の回路3は、ユーザは入力変数の順番を内部仕様と逆でプログラムを作成している。抽象構文木検証部7は、一致する抽象構文木が存在しない場合、等価回路変換部11における等価抽象構文木変換機能によって抽象構文木の左右のノードを入れ替える機能を持つ。図17の抽象構文木のORノードの左右のノードを入れ替えると図16と一致するため、回路3は内部仕様を満足する。このように、抽象構文木検証部7は、抽象構文木の左右位置が異なる場合も同様の解析木として判断することが可能である。
図18は、仕様フロントエンド6によって入出力仕様要素第3行に対する内部仕様を抽象構文木に変換した結果である。図19は、プログラムフロントエンド5によって回路6を抽象構文木に変換した結果である。回路6は、ユーザが入力変数X5を冗長に記述しているため、図19の抽象構文木は図18の内部仕様の抽象構文木と異なる。この例では、等価な抽象構文木に変換しても全て一致しない。等価変換で一致しない場合、抽象構文木比較部12は、最適化部10における抽象構文木最適化機能に基づいて、抽象構文木を最適化する。図19の抽象構文木に対して論理条件の最適化を行うと、冗長なX5ノードが削除され、図18の抽象構文木と全く同じ構成となる。従って、回路6は内部仕様を満足する。
以上説明したように、実施の形態1のプログラム検証装置によれば、検証対象プログラムが内部仕様を満足するかを検証するプログラム検証装置において、検証対象プログラムを抽象構文木に変換するプログラム変換手段と、内部仕様を抽象構文木に変換する内部仕様変換手段と、変換したそれぞれの抽象構文木を比較することで仕様に一致するか否かを検証する抽象構文木検証部とを備えたので、ユーザの判定作業を不要とし、プログラムの検証を効率化することができる。
また、実施の形態1のプログラム検証装置によれば、抽象構文木検証部は、抽象構文木を比較した結果、一致する抽象構文木が存在しない場合は、検証対象プログラムから生成した抽象構文木を所定のテンプレートに基づいて等価な抽象構文木に変換して比較するようにしたので、左右のノードの入れ替えといった変換が行え、確実な検証を行うことができる。
また、実施の形態1のプログラム検証装置によれば、抽象構文木検証部は、抽象構文木を比較した結果、一致する抽象構文木が存在しない場合は、検証対象プログラムから生成した抽象構文木を、そのプログラムとして等価な抽象構文木に最適化して比較するようにしたので、冗長な記述を最適化する中間変数の削除や論理条件の最適化を行うことができ、その結果、確実な検証を行うことができる。
また、実施の形態1のプログラム検証装置によれば、抽象構文木検証部は、一致しない抽象構文木を検証結果として記憶し、この検証結果を検証対象プログラムの誤り位置として出力するようにしたので、仕様に対するプログラムの誤りやプログラムの欠落を報告することができ、ユーザのプログラム修正を容易にすることができる。
実施の形態2.
実施の形態2は、仕様が数式の例であり、プログラム検証装置の構成については実施の形態1と同様であるため、ここでの説明は省略する。
図20は、実施の形態2におけるプログラムの入出力仕様を定義した入出力仕様である。また、図21は、入出力間の関係を示す動作仕様である。動作仕様は、Xin1*Xin2+Xin3の結果をYoutに出力することを意味する。図20の入出力仕様、及び図21の動作仕様は、以下のように展開される。
実施の形態2は、仕様が数式の例であり、プログラム検証装置の構成については実施の形態1と同様であるため、ここでの説明は省略する。
図20は、実施の形態2におけるプログラムの入出力仕様を定義した入出力仕様である。また、図21は、入出力間の関係を示す動作仕様である。動作仕様は、Xin1*Xin2+Xin3の結果をYoutに出力することを意味する。図20の入出力仕様、及び図21の動作仕様は、以下のように展開される。
D4=D1*D2+D3
図22は、内部仕様図20及び図21に基づいてユーザが作成したプログラムである。このプログラムでは、中間変数を用いて演算を行っている。これを抽象構文木で表したものが、図23及び図24である。図23は、 * D1 D2 D10 (D10=D1*D2)の抽象構文木であり、図24は、 + D10 D3 D4 (D4=D10+D3)の抽象構文木である。一方、図25は内部仕様を抽象構文木に変換した結果である。
図22は、内部仕様図20及び図21に基づいてユーザが作成したプログラムである。このプログラムでは、中間変数を用いて演算を行っている。これを抽象構文木で表したものが、図23及び図24である。図23は、 * D1 D2 D10 (D10=D1*D2)の抽象構文木であり、図24は、 + D10 D3 D4 (D4=D10+D3)の抽象構文木である。一方、図25は内部仕様を抽象構文木に変換した結果である。
プログラムは二つの抽象構文木から構成され、内部仕様は一つの抽象構文木から構成される。これらの抽象構文木を比較しても結果は一致しない。そのため、最適化部10による最適化を適用する。図23と図24の抽象構文木に中間変数の削除を適用すると、図24のD10ノードが、D10と等価な図23のMULノード以下で置換される。結果として、中間変数の削除を行ったプログラム抽象構文木は図25と全く同じ構成となる。従って、プログラムと内部仕様の抽象構文木が一致するため、プログラムは内部仕様を満足する。
以上説明したように、実施の形態2のプログラム検証装置によれば、仕様が数式の場合でも実施の形態1と同様の効果を奏することができる。
実施の形態3.
実施の形態3では、高級言語で作成されたプログラムの検証の一例として、C言語を対象とした場合を説明する。
図26は、実施の形態3における内部仕様である。動作仕様と入出力仕様が1対1に対応する場合には、動作仕様の提供のみでよい。実施の形態3では、入出力仕様は提供していないため、動作仕様各要素の展開は行わず、そのまま抽象構文木を生成する。つまり、z=x*yという抽象構文木を生成する。入出力仕様も提供した場合は、実施の形態1で説明したように各要素名を基に入出力仕様のラベルを検索し、検出された列から1行ずつデータを取り出し、動作仕様の各要素を置換する。
実施の形態3では、高級言語で作成されたプログラムの検証の一例として、C言語を対象とした場合を説明する。
図26は、実施の形態3における内部仕様である。動作仕様と入出力仕様が1対1に対応する場合には、動作仕様の提供のみでよい。実施の形態3では、入出力仕様は提供していないため、動作仕様各要素の展開は行わず、そのまま抽象構文木を生成する。つまり、z=x*yという抽象構文木を生成する。入出力仕様も提供した場合は、実施の形態1で説明したように各要素名を基に入出力仕様のラベルを検索し、検出された列から1行ずつデータを取り出し、動作仕様の各要素を置換する。
また、C言語の場合には、図26に示すように関数単位で動作仕様を提供することを可能とする。関数単位で動作仕様を提供することにより、比較対象が関数内の抽象構文木に限定されるため、効率的に検証を行うことが可能となる。
図27は、ユーザが内部仕様を基に作成したプログラムである。図28は、プログラムのmain関数を抽象構文木に変換したものである。図29は、main関数の内部仕様を抽象構文木に変換したものである。図28と図29の抽象構文木は一致しているため、このプログラムは内部仕様を満足する。
図30に示すように、一つの関数あるいはプログラムに対して複数の動作仕様を記述することも可能である。また、本発明はC言語以外の高級言語にも対応可能である。複数の言語に対応するために言語毎にプログラムフロントエンドを準備すればよい。
図27は、ユーザが内部仕様を基に作成したプログラムである。図28は、プログラムのmain関数を抽象構文木に変換したものである。図29は、main関数の内部仕様を抽象構文木に変換したものである。図28と図29の抽象構文木は一致しているため、このプログラムは内部仕様を満足する。
図30に示すように、一つの関数あるいはプログラムに対して複数の動作仕様を記述することも可能である。また、本発明はC言語以外の高級言語にも対応可能である。複数の言語に対応するために言語毎にプログラムフロントエンドを準備すればよい。
以上説明したように、実施の形態3のプログラム検証装置によれば、高級言語で作成されたプログラムに対しても実施の形態1、2と同様の効果を奏することができる。
1 プログラム、2 内部仕様、3 検証結果報告書、4 プログラム検証装置、5 プログラムフロントエンド、6 仕様フロントエンド、7 抽象構文木検証部、8 プログラム抽象構文木、9 仕様抽象構文木、10 最適化部、11 等価回路変換部、12 抽象構文木比較部、13 プログラム抽象構文木検証結果記憶部、14 内部仕様抽象構文木検証結果記憶部、15 検証結果報告部。
Claims (4)
- 検証対象プログラムが内部仕様を満足するかを検証するプログラム検証装置において、
前記検証対象プログラムを抽象構文木に変換するプログラム変換手段と、
前記内部仕様を抽象構文木に変換する内部仕様変換手段と、
変換したそれぞれの抽象構文木を比較することで仕様に一致するか否かを検証する抽象構文木検証部とを備えたプログラム検証装置。 - 抽象構文木検証部は、抽象構文木を比較した結果、一致する抽象構文木が存在しない場合は、検証対象プログラムから生成した抽象構文木を所定のテンプレートに基づいて等価な抽象構文木に変換して比較することを特徴とする請求項1記載のプログラム検証装置。
- 抽象構文木検証部は、抽象構文木を比較した結果、一致する抽象構文木が存在しない場合は、検証対象プログラムから生成した抽象構文木を、当該プログラムとして等価な抽象構文木に最適化して比較することを特徴とする請求項1記載のプログラム検証装置。
- 抽象構文木検証部は、一致しない抽象構文木を検証結果として記憶し、当該検証結果を検証対象プログラムの誤り位置として出力することを特徴とする請求項1から請求項3のうちのいずれか1項記載のプログラム検証装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2010085057A JP2011215998A (ja) | 2010-04-01 | 2010-04-01 | プログラム検証装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2010085057A JP2011215998A (ja) | 2010-04-01 | 2010-04-01 | プログラム検証装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2011215998A true JP2011215998A (ja) | 2011-10-27 |
Family
ID=44945633
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2010085057A Pending JP2011215998A (ja) | 2010-04-01 | 2010-04-01 | プログラム検証装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2011215998A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2019160284A (ja) * | 2018-03-08 | 2019-09-19 | 富士通株式会社 | 抽象コードグラフを用いたソフトウェアの表現 |
CN112506767A (zh) * | 2020-12-03 | 2021-03-16 | 清华大学 | 一种基于强化学习的程序验证方法及装置 |
-
2010
- 2010-04-01 JP JP2010085057A patent/JP2011215998A/ja active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2019160284A (ja) * | 2018-03-08 | 2019-09-19 | 富士通株式会社 | 抽象コードグラフを用いたソフトウェアの表現 |
JP7172435B2 (ja) | 2018-03-08 | 2022-11-16 | 富士通株式会社 | 抽象コードグラフを用いたソフトウェアの表現 |
CN112506767A (zh) * | 2020-12-03 | 2021-03-16 | 清华大学 | 一种基于强化学习的程序验证方法及装置 |
CN112506767B (zh) * | 2020-12-03 | 2022-07-05 | 清华大学 | 一种基于强化学习的程序验证方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Verma et al. | A comparative study of black box testing and white box testing | |
CN105095491B (zh) | 基于Petri网基本结构的过程模型修复方法 | |
Tan et al. | relifix: Automated repair of software regressions | |
US6385765B1 (en) | Specification and verification for concurrent systems with graphical and textual editors | |
Gervasi et al. | Lightweight validation of natural language requirements | |
US8020153B2 (en) | Source code checker, source code checking method, program for causing execution of the method, and storage medium for storing the program | |
JP5207007B2 (ja) | モデル検証システム、モデル検証方法および記録媒体 | |
US20100333073A1 (en) | Systems and methods for automated generation of software tests based on modeling the software test domain | |
JP6479184B2 (ja) | コンピュータ実行可能なモデルリバースエンジニアリング方法及び装置 | |
JP2735698B2 (ja) | インタフェース検証処理方式 | |
US20030097637A1 (en) | Schema generation apparatus, data processor, and program for processing in the same data processor | |
JP2006134284A (ja) | データ生成方法 | |
JP2000232516A (ja) | 妥当性検査規則を作成するための方法、生成モジュール、サーバ、制御モジュール、および記憶手段 | |
CN117312281A (zh) | 一种多源异构数据自动融合方法、系统、设备及存储介质 | |
Oluwagbemi et al. | Automatic generation of test cases from activity diagrams for UML based testing (UBT) | |
JP2011215998A (ja) | プログラム検証装置 | |
CN104216703A (zh) | 嵌入式软件系统程序的开发方法 | |
Leonard et al. | Program synthesis from formal requirements specifications using APTS | |
Lipaczewski et al. | Using tool-supported model based safety analysis--Progress and experiences in SAML development | |
Lu et al. | Zen-CC: An automated and incremental conformance checking solution to support interactive product configuration | |
JP2008305079A (ja) | 要求仕様自動検証方式 | |
JPWO2016151710A1 (ja) | 仕様構成装置および方法 | |
Hálecek et al. | On XAIG rewriting | |
JPH11224211A (ja) | ソフトウェア検査支援装置 | |
US6675373B1 (en) | Automatic generation of balancing logic for data conversion |