(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2023056953
(43)【公開日】2023-04-20
(54)【発明の名称】不具合解析装置及び不具合解析方法
(51)【国際特許分類】
G06F 11/36 20060101AFI20230413BHJP
【FI】
G06F11/36 108
【審査請求】未請求
【請求項の数】8
【出願形態】OL
(21)【出願番号】P 2021166472
(22)【出願日】2021-10-08
(71)【出願人】
【識別番号】000005108
【氏名又は名称】株式会社日立製作所
(74)【代理人】
【識別番号】110000176
【氏名又は名称】弁理士法人一色国際特許事務所
(72)【発明者】
【氏名】川上 真澄
(72)【発明者】
【氏名】鈴木 康文
(72)【発明者】
【氏名】安田 和矢
【テーマコード(参考)】
5B042
【Fターム(参考)】
5B042HH10
5B042HH11
5B042HH41
(57)【要約】
【課題】対象プログラムのループ構造を踏まえた効率的な不具合解析を可能とする。
【解決手段】不具合解析装置100において、解析対象であるソフトウェアのソースコードにおける、解析の開始及び終了、各ループの開始、及び関数呼出関係の各情報を保持する記憶部120と、前記各ループのうち前記解析の開始点を含むものを起点とし、前記関数呼出関係にある一連のループ群での呼出元方向に応じて、前記解析の終了点に向け、当該ループ群の各ループに関して、前記ソースコードで規定された変数の値域ごとに記号実行を並行処理して、不具合が検出された箇所と条件を出力する制御部110を含む構成とする。
【選択図】
図2
【特許請求の範囲】
【請求項1】
解析対象であるソフトウェアのソースコードにおける、解析の開始及び終了、各ループの開始、及び関数呼出関係の各情報を保持する記憶部と、
前記各ループのうち前記解析の開始点を含むものを起点とし、前記関数呼出関係にある一連のループ群での呼出元方向に応じて、前記解析の終了点に向け、当該ループ群の各ループに関して、前記ソースコードで規定された変数の値域ごとに記号実行を並行処理して、不具合が検出された箇所と条件を出力する制御部と、
を含むことを特徴とする不具合解析装置。
【請求項2】
前記制御部は、
前記起点から前記呼出元方向に向けた、前記各ループに関する前記記号実行及び前記不具合の検出に際し、当該ループの開始点で前記変数の所定仕様を満たすことを検出した場合、当該ループに関して解析を終了するものである、
ことを特徴とする請求項1に記載の不具合解析装置。
【請求項3】
前記記憶部は、
前記解析の終了の情報として、処理対象とする最大ループ数の情報を保持し、
前記制御部は、
前記起点から前記呼出元方向に向けた、前記各ループに関する前記記号実行及び前記不具合の検出に際し、前記解析が終了となったループが前記最大ループ数に達した時点で処理を終了するものである、
ことを特徴とする請求項2に記載の不具合解析装置。
【請求項4】
前記制御部は、
前記解析の開始点から終了点に向けた逆向きの記号実行を行うことで実行パスを出力する記号実行エンジンを用いて、不具合が発生する条件であるパス条件を算出し、
前記不具合の箇所と条件の検出および出力に際し、所定のソルバを用いて、前記パス条件を満たす前記解析の終了点となる関数の入力パラメータ値の条件、または、前記パス条件を満たす前記解析の終了点となる関数の入力パラメータ値を出力するものである、
ことを特徴とする請求項1に記載の不具合解析装置。
【請求項5】
情報処理装置が、
記憶部において、解析対象であるソフトウェアのソースコードにおける、解析の開始及び終了、各ループの開始、及び関数呼出関係の各情報を保持し、
前記各ループのうち前記解析の開始点を含むものを起点とし、前記関数呼出関係にある一連のループ群での呼出元方向に応じて、前記解析の終了点に向け、当該ループ群の各ループに関して、前記ソースコードで規定された変数の値域ごとに記号実行を並行処理して、不具合が検出された箇所と条件を出力する、
ことを特徴とする不具合解析方法。
【請求項6】
前記情報処理装置が、
前記起点から前記呼出元方向に向けた、前記各ループに関する前記記号実行及び前記不具合の検出に際し、当該ループの開始点で前記変数の所定仕様を満たすことを検出した場合、当該ループに関して解析を終了する、
ことを特徴とする請求項5に記載の不具合解析方法。
【請求項7】
前記情報処理装置が、
前記記憶部において、前記解析の終了の情報として、処理対象とする最大ループ数の情報を保持し、
前記起点から前記呼出元方向に向けた、前記各ループに関する前記記号実行及び前記不具合の検出に際し、前記解析が終了となったループが前記最大ループ数に達した時点で処理を終了する、
ことを特徴とする請求項6に記載の不具合解析方法。
【請求項8】
前記情報処理装置が、
前記解析の開始点から終了点に向けた逆向きの記号実行を行うことで実行パスを出力する記号実行エンジンを用いて、不具合が発生する条件であるパス条件を算出し、
前記不具合の箇所と条件の検出および出力に際し、所定のソルバを用いて、前記パス条件を満たす前記解析の終了点となる関数の入力パラメータ値の条件、または、前記パス条件を満たす前記解析の終了点となる関数の入力パラメータ値を出力する、
ことを特徴とする請求項5に記載の不具合解析方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、不具合解析装置及び不具合解析方法に関するものである。
【背景技術】
【0002】
ソフトウェア開発において、仕様書と異なる、または開発者が想定していないソフトウェア(プログラム、ソフトウェアプログラム)の動作は、不具合と呼ばれる。
ソフトウェアをリリースする前に、そうした不具合を全て修正し解消することが望ましい。
【0003】
上述の不具合を検出する一般的な手法としては、テストが存在する。テストでは、仕様書に記述された又は開発者が期待する、入力及び出力をテストケースとして作成する。また、このテストケースを利用して、対象プログラムが入力に対して正しい出力を返すかを確認する。
【0004】
その結果、入力に対して出力が異なる、又は例外(故障)が発生してプログラムが動作しない場合、不具合がある(不具合が発生した)と判断される。
【0005】
不具合がある場合、開発者は、ソフトウェアのどの部分で想定外の処理がなされたかを解析し、原因箇所を特定する。そして開発者は、適切な入出力を行うように当該プログラムのロジックを修正する。
【0006】
一方、巨大で複雑なプログラムでは、多くのテストケースが必要となる。より具体的には、プログラムの全てのステートメント(行/ステップ)、分岐、分岐条件などをカバーするため、膨大な数のテストケースが必要となる。こうした膨大な数のテストケースを生成することは、現実的ではない。
【0007】
ところで、入力から出力を計算する制御プログラムにおいて、殆どの入力に対しては正しく処理するが、非常にまれな条件で不正な処理を行う場合がある。このような不具合は、非再現性不具合と呼ばれ、不具合が起きる、まれな条件を特定するのが困難である。
【0008】
出荷直前に非再現性不具合が見つかると、不具合の解析に非常に時間がかかってしまい、出荷が延期されてしまう可能性もある。また、出荷後に非再現性不具合が見つかると、原因となる手がかりが少ないため、原因分析が非常に難しくなる。
【0009】
一定の確率で不具合が発生するならば、製品回収や製品修正のためのリコールを行わざるをえなくなる。出荷遅延や製品回収、リコールは利用者の信頼を傷付け、さらに非常に大きなコストがかかるため、できる限り避けるのが望ましい。
【0010】
そこで例えば、ソフトウェアコンポーネントの仕様から、ソフトウェアコンポーネントにおいて故障がどのように伝播するかを評価する方法(特許文献1参照)などが提案されている。
【0011】
この方法は、モデルの形式検証機能を有するコンピュータが、ソフトウェアコンポーネントの入力インタフェース仕様、出力インタフェース仕様、内部仕様を含む仕様情報を取得する仕様情報取得ステップと、前記仕様情報中の入力インタフェース仕様を正常値以外に変更した仕様情報に従って、前記形式検証機能によって前記ソフトウェアコンポーネントを検証する検証ステップと、前記検証ステップにおいて前記出力インタフェース仕様を
満足しない出力値となる例が発見された場合には、前記正常値以外に変更した入力と、前記出力インタフェース仕様を満たさない出力とを、対応づけて記憶する故障伝播路記憶ステップを実行するものである。
【先行技術文献】
【特許文献】
【0012】
【発明の概要】
【発明が解決しようとする課題】
【0013】
上述の従来技術によれば、確かに、異常な入力を与えた場合のソフトウェアコンポーネントの挙動を評価できる。ところが、入出力単位で制約違反かどうかの粒度でしか評価がなされていない。したがって、不具合発生の事象が、一方のループの引数が他方のループの出力値であるといった、互いに関連しあう複数ループに起因するケースには対応困難である。そうした多層的な関係も網羅した構造に関して従来技術を単純に適用しようとしても、状態数が爆発して解析が終了しなくなる問題も存在する。
そこで本発明の目的は、対象プログラムのループ構造を踏まえた効率的な不具合解析を可能とする技術を提供することにある。
【課題を解決するための手段】
【0014】
上記課題を解決する本発明の不具合解析装置は、解析対象であるソフトウェアのソースコードにおける、解析の開始及び終了、各ループの開始、及び関数呼出関係の各情報を保持する記憶部と、前記各ループのうち前記解析の開始点を含むものを起点とし、前記関数呼出関係にある一連のループ群での呼出元方向に応じて、前記解析の終了点に向け、当該ループ群の各ループに関して、前記ソースコードで規定された変数の値域ごとに記号実行を並行処理して、不具合が検出された箇所と条件を出力する制御部と、を含むことを特徴とする。
また、本発明の不具合解析方法は、情報処理装置が、記憶部において、解析対象であるソフトウェアのソースコードにおける、解析の開始及び終了、各ループの開始、及び関数呼出関係の各情報を保持し、前記各ループのうち前記解析の開始点を含むものを起点とし、前記関数呼出関係にある一連のループ群での呼出元方向に応じて、前記解析の終了点に向け、当該ループ群の各ループに関して、前記ソースコードで規定された変数の値域ごとに記号実行を並行処理して、不具合が検出された箇所と条件を出力する、ことを特徴とする。
【発明の効果】
【0015】
本発明によれば、対象プログラムのループ構造を踏まえた効率的な不具合解析が可能となる。
【図面の簡単な説明】
【0016】
【
図1】本実施形態における不具合解析装置の全体構成例を示す図である。
【
図2】本実施形態における実行パス及びパス条件に関する説明図である。
【
図3】本実施形態における不具合解析装置の画面例を示す図である。
【
図4】本実施形態における実行パス表示画面の例を示す図である。
【
図5】本実施形態におけるループ構造を踏まえた解析概念例を示す図である。
【
図6】本実施形態における不具合解析方法のフロー例を示す図である。
【
図7】本実施形態におけるループ構造での不具合解析概念を示す説明図である。
【
図8】本実施形態におけるソースコード例を示す図である。
【発明を実施するための形態】
【0017】
以下に、本実施形態における不具合解析装置について説明する。本実施形態における不具合解析装置は、対象プログラムのループ構造を踏まえた効率的な不具合解析を可能とする情報処理装置である。
また、本実施形態の不具合解析装置は、特に、記号実行エンジンおよびSMTソルバを備え、不具合の発生箇所を含むループを解析開始点にし、複数のループ間における関数呼出関係に基づく、解析終了点に向けた逆向きの記号実行を行って、SMTソルバによる不具合箇所の関数やその際のパラメータを特定できる。
【0018】
こうした不具合解析装置の入力には、プログラムのソースコードと、プログラムの実行ログ、プログラム仕様などが含まれる。
【0019】
このうちソースコードは、不具合解析対象となるプログラムのものである。また、実行ログには、当該プログラムの実行中に呼び出された関数(メソッド)が含まれている。実行中に例外(例えば0徐算)が発生すると、実行ログは例外が発生した関数の呼び出しで終わっている(プログラム停止を記録している)。
【0020】
不具合解析装置は、上述の実行ログから、例外が発生した関数中の例外が発生した(例えば0徐算の徐算演算)プログラムのステートメント(ソースコードの行/ステップ)を利用者に提示し、解析開始点の指定を受け付ける。
【0021】
また、不具合解析装置は、利用者(開発者)に問い合わせて、上述の解析開始点を基点に関数呼出関係に連なる一連の各ループを母集団とした、解析処理対象とする最大ループ数を、解析終了の条件として設定する。或いは、上述の解析開始点を基点に、関数呼出関係を踏まえた所定ループの関数を解析終了点と設定する。
【0022】
不具合解析装置は、解析開始点から処理を始め、最大で解析終了条件のループ数に至るまで、通常のプログラム実行とは逆方向の逆向き記号実行を行う。逆向き記号実行の間、不具合解析装置は、実行パスとパス条件を記録する。
【0023】
実行パスは、解析終了となった点と解析開始点とを結ぶプログラム中のパス(ステートメント/行/ステップの並び)であり、実行パスに沿って処理が進む。実行パスは、関数の呼び出しも含む。
【0024】
パス条件は、例外(例えば0徐算)が発生する変数の条件である。変数には、関数内のローカル変数や関数の入力パラメータが含まれる。
【0025】
実行パスやパス条件を参照することで、利用者は、どのようにして例外(不具合)が発生するかを理解することができ、不具合の修正方法を検討する材料にすることができる。結果として、不具合解析装置は、利用者の不具合の解析(分析)を支援することができる。
【0026】
不具合解析装置は、SMTソルバ(Satisfiability Modulo Theories Solver)を用い
てパス条件を満足する解析終了点である関数の入力パラメータ値を算出する。この値を入力とするテストを行うことで、利用者は修正したプログラムが正しく動作するかを確認できるようになる。
≪不具合解析装置の構成≫
図1は、本実施形態に係る不具合解析装置100の入力、出力、および全体構成を示す図である。不具合解析装置100は、制御部110、記憶部120、および入出力部180を備える。
【0027】
このうち制御部110は、記憶部120で保持するプログラム121を呼び出して実行し、必要な機能(機能部111~114)を実装するCPU(Central Processing Unit)である。また、記号実行エンジン115およびSMTソルバ116も有する。
【0028】
記憶部120は、RAM(Random Access Memory)やROM(Read Only Memory)、SSD(Solid State Drive)などから構成される。記憶部120には、プログラム121
や関数呼出関係DB122、解析開始/終了点情報123、ループ開始点情報124などが記憶される。
【0029】
なお、プログラム121は、コンピュータを不具合解析装置100として機能させるためのプログラムであって、不具合解析処理の処理手順の記述を含む。
【0030】
また、関数呼出関係DB122には、ループ間でどの関数がどの関数を呼び出すかの関係、換言すれば、呼出関係グラフ(関数間の呼出関係を表現する制御フローのグラフ)を示すデータが記憶される。
【0031】
入出力部180は、ディスプレイやキーボード、マウスなどのユーザインターフェイスである。この入出力部180は、さらに、通信インターフェイスや記録媒体の読み書きデバイスを備えてもよい。
【0032】
制御部110を説明する前に、不具合解析装置100の入力と出力とを説明する。
≪不具合解析装置の入力≫
不具合解析装置100の入力には、ソースコード210、プログラム実行ログ220、およびプログラム仕様230が含まれる。ソースコード210は、解析対象であるソフトウェアプログラムを構成する関数(メソッド)のソースコードである。プログラム仕様230には、関数の名前、および、関数の入力パラメータ値と返り値(戻り値)の名前と型と範囲とが記述されている。
【0033】
プログラム実行ログ220(実行ログ)は、プログラム実行中の関数呼び出しの記録を含む。プログラム実行ログ220には、呼び出された関数の名前(識別情報)の他に呼び出し時の入力パラメータ値や、呼び出しから戻るときの返り値を含んでもよい。プログラム実行ログ220は、さらにプログラム実行中に発生した例外を含んでもよい。例外としては、0徐算やプログラム仕様230に記述された入力パラメータ値または返り値の違反(仕様の範囲外の値)がある。
≪不具合解析装置の出力≫
不具合解析装置100の出力には、実行パス240、および入力パラメータ値250が含まれる。実行パス240は、不具合が発生するプログラム中のパス(ソースコード210のなかで順次処理される一連のステートメント/行/ステップ)である。
【0034】
実行パス240の一端は、不具合に係る例外(故障)が発生するステートメント/行/ステップであり、解析開始点、または単に開始点と記す。解析開始点は、例えば0徐算が発生する徐算演算を含むステートメントである。
【0035】
実行パス240の他端は、解析開始点を含む関数を直接または間接に呼び出すループの関数であり、解析終了点、またはエントリポイントと記す。
【0036】
入力パラメータ値250は、エントリポイントとなる関数の、不具合が発生するときの入力パラメータ値である。
≪不具合解析装置の制御部の構成≫
制御部110は、CPU(Central Processing Unit)を含んで構成され、呼出関係生
成部111、解析開始点取得部112、解析終了点取得部113、ループ開始点取得部114、記号実行エンジン115、およびSMTソルバ116を備える。
【0037】
呼出関係生成部111は、ソースコード210から、複数ループの各間における関数の呼出関係を取得し、これを関数呼出関係DB122に格納する。
【0038】
解析開始点取得部112は、実行ログ220が示す不具合発生箇所に基づいた、開発者からの解析開始点の指定を受け付けるか、あるいは、プログラム実行ログ220を解析して解析開始点を取得するとしてもよい(その場合の解析開始点の取得手順の詳細は後記する)。
【0039】
解析終了点取得部113は、上述の解析開始点を基点に関数呼出関係に連なる一連の各ループを母集団とした、解析処理対象とするループ数の最大値を、解析終了の条件として開発者から受け付ける。
【0040】
或いは、上述の解析開始点を基点に、関数呼出関係を踏まえた所定ループの関数を解析終了点と設定する。その場合、解析開始点を含む関数を呼び出す関数を関数呼出関係DB122から取得して、エントリポイントの候補として入出力部180に備わるディスプレイに表示する。利用者(開発者)は、候補のなかから1つまたは複数のエントリポイントを選択する。解析終了点取得部113は、選択された関数を解析終了点(エントリポイント)として設定する。
【0041】
ループ開始点取得部114は、ソースコード210が含む各ループにおける開始点について、例えば、開発者から指定を受けるか、或いは予め定めた所定コードをキーにループ開始点を検索、特定する。
【0042】
記号実行エンジン115は、実行パス240、およびパス条件を生成する。パス条件は、解析対象のプログラムの実行が実行パス240を通るための変数(ローカル変数や入力パラメータ)の条件である。実行パス240やパス条件の詳細は後記する。
【0043】
記号実行エンジン115は、ソースコード210が含む各ループのうち解析開始点を含むものを起点とし、関数呼出関係DB122が示す呼出関係に基づく一連のループ群での呼出元方向に応じて、解析終了点に向け、当該ループ群の各ループに関して、共通変数の値域ごとに記号実行を並行処理する。その結果、上述の実行パス240、およびパス条件が生成される。
【0044】
以下の文献に記号実行エンジンンの詳細が記述されている: Peter Dinges and Gul Agha, "Targeted Test Input GenerationUsing Symbolic Concrete Backward Execution"。
【0045】
SMTソルバ116(ソルバ)は、上述の記号実行エンジン115が生成したパス条件を満たす入力パラメータ値250を生成する。以下の文献にSMTソルバが記述されている: Leonardo deMoura and Nikolaj Bjorner, "Z3: An Efficient SMT Solver"。
≪実行パスとパス条件:基本的な考え方≫
図2は、本実施形態に係る実行パスおよびパス条件を説明するための図である。
図2は、関数baz10、関数bar20、および関数foo30の3つの関数のソースコード210を含む。関数baz10は関数bar20を呼び出し、関数bar20は関数foo30を呼び出す。関数foo30で0徐算の例外が発生し、エントリポイントとして関数baz10が指定されたという前提で、説明を続ける。
【0046】
この場合、プログラム実行ログ220は、関数baz10の呼び出しの記録、関数bar20の呼び出しの記録、関数foo30の呼び出しの記録を含み、0徐算発生の記録で終わる。
【0047】
プログラム実行ログ220を解析することで、解析開始点取得部112は、関数foo30のなかで0徐算の例外が発生したことを検出する。関数fooの行3が、徐算演算を含む唯一のステートメント/行であるから、解析開始点取得部112は、開始点を関数foo30の行3に設定する。つまりは解析開始点取得部112は、実行ログから例外が発生したプログラムのステートメントを解析開始点として取得する。
【0048】
パス条件は、例外が発生する条件/制約である。解析開始点である関数foo30の行3におけるパス条件32は「b=0」である。
【0049】
記号実行エンジン115は、開始点から始めて、通常の(前向き)実行とは反対の方向にプログラム(ソースコード210)のなかを、エントリポイントに到達するまで探索(逆向き記号実行とも記す)する。エントリポイントが複数ある場合には、記号実行エンジン115は、何れか1つのエントリポイントに到達するまで探索する。
【0050】
図2の場合、記号実行エンジン115は、関数foo30の行3から探索を始めて、行1(先頭行)に到達する。この時点での実行パスは、関数foo30の行3~行1である。行1におけるパス条件31は「b=0」のままとなる。
【0051】
記号実行エンジン115は、関数foo30が、第2入力パラメータのbが0で呼ばれたと判断して、関数foo30を呼び出すステートメントを探索する。
図2の場合、関数foo30を呼び出すステートメントは、関数bar20の行3であり、記号実行エンジン115は、当該行から探索を継続する。
【0052】
この行におけるパス条件22は、第2入力パラメータが0となる「a-b=0」である。この時点における実行パスは、関数foo30の行3~行1、関数bar20の行3である。また、この時点でのパス条件は、関数foo30における「b=0」、関数bar20における「a-b=0」である。
【0053】
なお、関数baz10、関数bar20、および関数foo30にそれぞれ同じ名前の変数a,b,cがあるが、これらはぞれぞれの関数のローカル変数であり、異なる変数である。
【0054】
記号実行エンジン115は、関数bar20の行3から探索を始めて、行1に到達する。この時点での実行パスは、関数foo30の行3~行1、関数bar20の行3~行1である。行1におけるパス条件21は「a=b」であり、パス条件22の「a-b=0」と同等である。
【0055】
記号実行エンジン115は、関数bar20が、第1パラメータと第2入力パラメータとが同じ値で呼ばれたと判断して、関数bar20を呼び出すステートメントを探索する。
図2の場合、関数bar20を呼び出すステートメントは、関数baz10の行3であり、記号実行エンジン115は、当該行から探索を継続する。この行におけるパス条件12は「a=b」である。
【0056】
この時点における実行パスは、関数foo30の行3~行1、関数bar20の行3~行1、関数baz10の行3である。また、この時点でのパス条件は、関数foo30に
おける「b=0」、関数bar20における「a-b=0」、関数baz10における「a=b」である。
【0057】
記号実行エンジン115は、関数baz10の行3から探索を始めて、行1に到達する。関数baz10は、解析終了点なので、探索はここで終了する。この時点での実行パスは、関数foo30の行3~行1、関数bar20の行3~行1、関数baz10の行3~行1である。また、この時点でのパス条件は、関数foo30における「b=0」、関数bar20における「a-b=0」、関数baz10における「a=b」である。
【0058】
パス条件には、エントリポイント(解析終了点)の入力パラメータ値の条件を含んでいる。SMTソルバ116は、パス条件を解いて、エントリポイントである関数baz10の、パス条件を満たす入力パラメータ値250、例えばa=0でb=0、を算出する。
【0059】
最後に、記号実行エンジン115は、実行パスを入出力部180に備わるディスプレイに表示する(実行パスを出力する)。利用者は、プログラムのなかで、どのような条件でどのように処理が進んで不具合が発生するかを理解することができる。ひいては、問題点を見出し、プログラムを修正することができるようになる。
【0060】
SMTソルバ116は、入力パラメータ値250(パス条件を満たすエントリポイント(解析終了点)の入力値)を提供し、利用者はこの値を用いて修正したプログラムのテストができる。
【0061】
上記の説明において、関数foo30、および関数bar20の呼び出し元のステートメントはそれぞれ1つであった。複数の呼び出し元がある場合には、それぞれの呼び出し元から探索を継続する。
【0062】
例えば、関数bazA(不図示)が、行5でbar(d+1,d―2)と関数bar20を呼び出したとする。記号実行エンジン115は、関数bazAの行5まで探索して、パス条件を求める。
【0063】
この場合、関数bar20のパス条件である第1パラメータと第2パラメータとが等しいことから、「d+1=d―2」がパス条件となる。しかしながら、このような条件が成立することはないので、記号実行エンジン115は、関数bazAの行5からの探索を打ち切り、別の呼び出し元の探索を継続する。
【0064】
なお、複数の呼び出し元の探索を行い、それぞれがエントリポイントに到達した場合には、記号実行エンジン115は、それぞれの実行パスとパス条件とを記録するようにしてもよい。このような場合には、実行パスとパス条件とが、それぞれ複数あることになる。換言すれば、異なる条件で、同じ個所(解析開始点)で例外が発生することが判明したことになる。
【0065】
探索途中で条件分岐があった場合には、記号実行エンジン115は、分岐条件をパス条件に加える。例えば、関数foo30の行3が、「if (x<=y) c=a/b;」であったとする。この場合のパス条件は、「b=0」かつ「x<=y」である。
【0066】
解析終了点が複数指定されたり、関数の呼び出し元が複数あったり、条件分岐があったりする場合には、探索で辿り着く解析終了点や実行パス、パス条件が複数になる場合がある。記号実行エンジン115は、このようにして実行パスとパス条件とを算出して特定する。
【0067】
≪ユーザインターフェイス≫
図3は、本実施形態に係る不具合解析装置100の画面400の構成図である。画面400の左右における中央には上から、解析開始点の情報表示領域411、解析終了点の情報表示領域412、および解析結果の情報表示領域413が配置される。
【0068】
解析開始点取得部112が解析開始点を設定すると、解析開始点の情報表示領域411に解析開始点を含む関数名や解析開始点の行数、例外が発生する条件などが表示される。例えば、0徐算の例外が発生し徐算演算が複数ある場合には、解析開始点の候補が複数あることになる。このような場合には、情報表示領域411には、解析開始点の候補が複数あり、そのなかの1つを選択するように利用者を促すメッセージが表示される。利用者は、「指定」ボタン421を押下して、解析開始点の候補を表示する画面(不図示)から1つの解析開始点を選択する。解析開始点取得部112は、選択された解析開始点の候補を解析開始点と設定する。
【0069】
不具合解析装置100の起動直後の時点では、解析終了点の情報表示領域412には、解析終了点(エントリポイント)の選択を促すメッセージが表示される。利用者は「指定」ボタン422を押下して、解析終了点の候補(開始点を含む関数、当該関数を直接または間接に呼び出す関数)を表示する画面(不図示)から1つ以上の解析終了点を選択する。解析終了点取得部113は、選択された解析終了点の候補を解析終了点と設定して、情報表示領域412に表示する。複数選択された場合には、複数の解析終了点が情報表示領域412に表示される。
【0070】
「解析開始」ボタン423が押下されると、記号実行エンジン115が、実行パスの探索を行い、辿り着いた解析終了点と解析終了点の入力パラメータに関するパス条件が、解析結果の情報表示領域413に表示される。複数の解析終了点、または、複数の入力パラメータに関するパス条件があれば、情報表示領域413には、複数の解析終了点やパス条件が表示される。
【0071】
「実行パス表示」ボタン424が押下されると、実行パス表示画面430(後記する
図4参照)が入出力部180に備わるディスプレイに表示される。
図4は、本実施形態に係る実行パス表示画面430の構成図である。実行パス表示画面430には、実行パスが通る関数baz10、関数bar20、および関数foo30のソースコードが表示される。
【0072】
関数baz10、関数bar20、および関数foo30のソースコードのなかで、それぞれの実行パス431,432,433となるステートメントは、反転表示される。また、解析開始点のステートメントには「開始点」が、エントリポイントの関数名のステートメントには「終了点」がプログラムのコメントとして表示される。
【0073】
さらに、ステートメントに対応してパス条件が、プログラムのコメントとして表示される。プログラムの流れを示す実行パス、および実行パスにおける不具合が発生する条件であるパス条件を確認することで、利用者(開発者)は不具合が発生する原因が理解でき、延いてはどのようにソースコードを修正するかを検討しやすくなる。
【0074】
図4では、開始点、終了点、パス条件が、プログラムのコメントの形式で表示されるが、ステートメント/行との対応が把握可能であれば、他の形式であってもよい。
【0075】
≪ループの概念を踏まえた例≫
上述の≪実行パスとパス条件:基本的な考え方≫では、同じ処理を周期的に実行する、いわゆるループ構造に関して特に配慮した概念について示してはいない。一方、組込み制
御ソフトはループ構造を持つことが多い。
【0076】
そうしたループ構造を有するプログラムでの不具合は、
図5で例示するように、最初の周期のループから複数周期離れたループで発生するケースも多い。この時、各周期のループ間には共通して用いる変数つまり共通変数Sがあり、当該共通変数Sの値をループ間(の関数を介して)で伝達している。
【0077】
この値が、エラー発生時点で、共通変数Sにて想定している値の範囲にない場合、不具合の原因は、最初に値の範囲を逸脱した範囲のソースコード部位近辺にあると考えられる。そこで、ループ開始点となる毎に、複数の変数の値域(例:if文で分岐したパスごと)で記号実行を並行処理に分割し、ループ開始点で変数仕様を満たす時点を検出した時点で解析を終了する。また、解析が終了しなかった場合に備え、最大ループ数を指定するものとする。
【0078】
≪不具合解析処理≫
図6は、本実施形態に係る不具合解析処理のフローチャートである。また、
図7は、本実施形態におけるループ構造での不具合解析概念を示す説明図である。
【0079】
ステップs10において制御部110は、入力であるソースコード210(
図8)、プログラム実行ログ220、プログラム仕様230を読み込む。
【0080】
ステップs11において呼出関係生成部111は、読み込まれたソースコード210(
図8)から関数の呼出関係を抽出して、関数呼出関係DB122に格納する。
【0081】
ステップs12において解析開始点取得部112は、プログラム実行ログ220から解析開始点を取得して設定する。
【0082】
例えば、プログラム仕様230によれば共通変数sの値域は「0」か「1」であるところ、実行ログ220における不具合発生箇所では、共通変数Sの値が「-100」となっていた。つまり、
図8のソースコードサンプルにおいて、「y=s/(s+100)」の関数)が0除算のエラー発生箇所となっており、このコードを含むループが解析開始点となる。
【0083】
なお、解析開始点の候補が複数ある場合には、利用者に問い合わせて取得する(
図3記載の「指定」ボタン421参照)。また、このステップs12において解析終了点取得部113は、利用者に問い合わせて解析終了条件を取得して設定する。
図7では、処理上限とするループ数の最大値を「200」と利用者が設定し、これを受け付けた例を示している。
【0084】
ステップs13において記号実行エンジン115は、解析開始点のループから、関数呼出関係に従って、一連のループそれぞれについて探索(逆向き記号実行)を開始する。こうした逆向き記号実行の流れ自体は、対象が
図8のソースコードとなった点を除けば、
図2~4のものとほぼ同様である。ただし、
図8で示すソースコードを繰り返し実行するごと、すなわちループするごとに、共通変数Sの値が規定値域を越えていないか確認する探索を行う点は特徴的である。
【0085】
ステップ14において記号実行エンジン115は、解析終了条件に到達しているか判定する。つまり、ループの処理回数が上限の「200」を越えたか判定する。この判定の結果、ループの処理回数が上限の「200」回を越えていない場合(s14:N)、ステップs15において記号実行エンジン115は、当該ループでの共通変数Sの値が規定の値
域に適合しているか判定する。
【0086】
この判定の結果、共通変数Sの値が規定の値域に適合している場合(ステップs15:Y)、処理はs13に遷移する。
【0087】
他方、上述の判定の結果、共通変数Sの値が規定の値域に適合していない場合(ステップs15:N)、ステップs16において記号実行エンジン115は、実行パスとパス条件を記録し、処理をs13に戻す。
【0088】
上述のように、ステップs14において解析終了条件に到達したと判定されるまで、各ループで共通変数の値についての判定と、実行パス及びパス条件の記録を繰り返す。
【0089】
ステップS17において記号実行エンジン115は、探索(逆向き記号実行)の結果として、例えば、複数ループの実行に伴う不具合の発生元である関数:mainに関して、呼出変数のパラメータ:x=53,y=1.1, s=1、を表示する(
図9参照)。
【0090】
なお、記号実行エンジン115は、ソースコードで規定された変数の値域ごとに記号実行を並行処理し、不具合が検出された箇所と条件を出力するものとする。また、各ループに関する記号実行及び不具合の検出に際し、当該ループの開始点で変数の所定仕様を満たすことを検出した場合、当該ループに関して解析を終了するものである、
以上、本発明を実施するための最良の形態などについて具体的に説明したが、本発明はこれに限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能である。
【0091】
こうした本実施形態によれば、対象プログラムのループ構造を踏まえた効率的な不具合解析が可能となる。
【0092】
本明細書の記載により、少なくとも次のことが明らかにされる。すなわち、本実施形態の不具合解析装置において、前記制御部は、前記起点から前記呼出元方向に応じて、前記解析の終了点に向けた、前記各ループに関する前記記号実行及び前記不具合の検出に際し、当該ループの開始点で前記変数の所定仕様を満たすことを検出した場合、当該ループに関して解析を終了するものである、としてもよい。
【0093】
これによれば、不具合発生箇所ではないループに関して処理を回避/終了し、全体として効率化を図ることにつながる。ひいては、対象プログラムのループ構造を踏まえた、より効率的な不具合解析が可能となる。
【0094】
また、本実施形態の不具合解析装置において、前記記憶部は、前記解析の終了の情報として、処理対象とする最大ループ数の情報を保持し、前記制御部は、前記起点から前記呼出元方向に応じて、前記解析の終了点に向けた、前記各ループに関する前記記号実行及び前記不具合の検出に際し、前記解析が終了となったループが前記最大ループ数に達した時点で処理を終了するものである、としてもよい。
【0095】
これによれば、解析自体が未完となってしまう自体を効果的に回避可能となる。ひいては、対象プログラムのループ構造を踏まえた、より効率的な不具合解析が可能となる。
【0096】
また、本実施形態の不具合解析装置において、前記制御部は、前記解析の開始点から終了点に向けた逆向きの記号実行を行うことで実行パスを出力する記号実行エンジンを用いて、不具合が発生する条件であるパス条件を算出し、前記不具合の箇所と条件の検出および出力に際し、所定のソルバを用いて、前記パス条件を満たす前記解析の終了点となる関数の入力パラメータ値の条件、または、前記パス条件を満たす前記解析の終了点となる関
数の入力パラメータ値を出力するものである、としてもよい。
【0097】
これによれば、不具合箇所の特定や条件を効率的に実行できる。ひいては、対象プログラムのループ構造を踏まえた、より効率的な不具合解析が可能となる。
【0098】
また、本実施形態の不具合解析方法において、前記情報処理装置が、前記起点から前記呼出元方向に応じて、前記解析の終了点に向けた、前記各ループに関する前記記号実行及び前記不具合の検出に際し、当該ループの開始点で前記変数の所定仕様を満たすことを検出した場合、当該ループに関して解析を終了する、としてもよい。
【0099】
また、本実施形態の不具合解析方法において、前記情報処理装置が、前記記憶部において、前記解析の終了の情報として、処理対象とする最大ループ数の情報を保持し、前記起点から前記呼出元方向に向けた、前記各ループに関する前記記号実行及び前記不具合の検出に際し、前記解析が終了となったループが前記最大ループ数に達した時点で処理を終了する、としてもよい。
【0100】
また、本実施形態の不具合解析方法において、前記情報処理装置が、前記解析の開始点から終了点に向けた逆向きの記号実行を行うことで実行パスを出力する記号実行エンジンを用いて、不具合が発生する条件であるパス条件を算出し、前記不具合の箇所と条件の検出および出力に際し、所定のソルバを用いて、前記パス条件を満たす前記解析の終了点となる関数の入力パラメータ値の条件、または、前記パス条件を満たす前記解析の終了点となる関数の入力パラメータ値を出力する、としてもよい。
【符号の説明】
【0101】
100 不具合解析装置
110 制御部
111 呼出関係生成部
112 解析開始点取得部
113 解析終了点取得部
114 ループ開始点取得部
115 記号実行エンジン
116 SMTソルバ(ソルバ)
120 記憶部
121 プログラム
122 関数呼出関係DB
123 解析開始/終了点情報
124 ループ開始点情報
180 入出力部
210 ソースコード(プログラム)
220 プログラム実行ログ(実行ログ)
230 プログラム仕様
240 実行パス
250 入力パラメータ値