JP2022038884A - 不具合解析装置、プログラムおよび不具合解析方法 - Google Patents

不具合解析装置、プログラムおよび不具合解析方法 Download PDF

Info

Publication number
JP2022038884A
JP2022038884A JP2020143591A JP2020143591A JP2022038884A JP 2022038884 A JP2022038884 A JP 2022038884A JP 2020143591 A JP2020143591 A JP 2020143591A JP 2020143591 A JP2020143591 A JP 2020143591A JP 2022038884 A JP2022038884 A JP 2022038884A
Authority
JP
Japan
Prior art keywords
analysis
function
program
start point
execution
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
Application number
JP2020143591A
Other languages
English (en)
Inventor
真澄 川上
Masumi Kawakami
康文 鈴木
Yasufumi Suzuki
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.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2020143591A priority Critical patent/JP2022038884A/ja
Priority to US18/015,266 priority patent/US20230259447A1/en
Priority to PCT/JP2021/007054 priority patent/WO2022044376A1/ja
Publication of JP2022038884A publication Critical patent/JP2022038884A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Debugging And Monitoring (AREA)

Abstract

【課題】プログラムに含まれる不具合が発生する実行パスの特定を可能とする。【解決手段】不具合解析装置100は、入力にプログラム(ソースコード210)の実行ログ(プログラム実行ログ220)を含む。不具合解析装置100は、実行ログから例外が発生したプログラムのステートメントを解析開始点として取得する解析開始点取得部112と、解析開始点を含む関数を直接または間接に呼び出す関数を解析終了点として取得する解析終了点取得部113と、解析開始点から解析終了点へ逆向き記号実行を行い、実行パス240を出力する記号実行エンジン114とを備える。【選択図】図1

Description

本発明は、ソフトウェアプログラムの不具合の解析を支援する不具合解析装置、プログラムおよび不具合解析方法に関する。
ソフトウェア開発において、仕様書と異なる、または開発者が想定していないソフトウェア(プログラム、ソフトウェアプログラム)の動作は、不具合と呼ばれ、ソフトウェアをリリースする前に不具合を全て修正してなくすことが望ましい。不具合を検出する一般的な手法としてはテストがある。テストでは、仕様書にある、または開発者が期待する、入力と出力とをテストケースとして作成し、プログラムが入力に対して正しい出力を返すかを確認する。入力に対して出力が異なる、または、例外(故障)が発生してプログラムが動作しない場合には、不具合がある(不具合が発生した)と判断される。不具合がある場合、開発者は、ソフトウェアのどの部分で想定外の処理をしたかを解析し、原因箇所を特定して、適切な入出力を行うようにプログラムのロジックを修正する。
巨大で複雑なプログラムでは、たくさんのテストケースが必要となる。詳しくは、プログラムの全てのステートメント(行/ステップ)、分岐、分岐条件をカバーするには、膨大な量のテストケースが必要となり、現実的ではない。入力から出力を計算する制御プログラムにおいて、殆どの入力に対しては正しく処理するが、非常にまれな条件で不正な処理を行う場合がある。このような不具合は、非再現性不具合と呼ばれ、不具合が起きるまれな条件を特定するのが困難である。
出荷直前に非再現性不具合が見つかると、不具合の解析に非常に時間がかかってしまい、出荷が延期されてしまうかもしれない。また、出荷後に非再現性不具合が見つかると、原因となる手がかりが少ないため、原因分析が非常に難しくなる。一定の確率で不具合が発生するならば、製品回収や製品修正のためのリコールを行わざるをえなくなる。出荷遅延や製品回収、リコールは利用者の信頼を傷付け、さらに非常に大きなコストがかかるため、できる限り避けるのが望ましい。
特許文献1には、入力仕様と出力仕様とが定義されたソフトウェアコンポーネントにおいて、仕様に違反した入力に対してどの出力が仕様を満たせなくなるかを求めることにより、ソフトウェアコンポーネントの故障時の故障伝搬を評価する手法が記載されている。
特開2012-128727号公報
特許文献1に記載の手法では、異常な入力を与えた場合のソフトウェアコンポーネントの挙動を評価できるが、通常の入力に対して異常な出力が起こる不具合の原因を解析することはできない。
本発明は、このような背景を鑑みてなされたものであり、プログラムに含まれる不具合が発生する実行パスの特定を可能とする不具合解析装置、プログラムおよび不具合解析方法を提供することを課題とする。
上記した課題を解決するため、本発明に係る不具合解析装置は、入力にプログラムの実行ログを含むプログラムの不具合解析装置であって、前記実行ログから例外が発生したプログラムのステートメントを解析開始点として取得する解析開始点取得部と、前記解析開始点を含む関数を直接または間接に呼び出す関数を解析終了点として取得する解析終了点取得部と、前記解析開始点から前記解析終了点へ逆向き記号実行を行い、実行パスを出力する記号実行エンジンとを備える。
本発明によれば、プログラムに含まれる不具合が発生する実行パスの特定を可能とする不具合解析装置、プログラムおよび不具合解析方法を提供することができる。
本実施形態に係る不具合解析装置の入力、出力、および全体構成を示す図である。 本実施形態に係る実行パスおよびパス条件を説明するための図である。 本実施形態に係る不具合解析装置の画面の構成図である。 本実施形態に係る実行パス表示画面の構成図である。 本実施形態に係る不具合解析処理のフローチャートである。 本実施形態の変形例に係る実行パスおよびパス条件を説明するための図である。 本実施形態の変形例に係る不具合解析装置の画面の構成図である。 本実施形態の変形例に係る不具合解析処理のフローチャート(1)である。 本実施形態の変形例に係る不具合解析処理のフローチャート(2)である。
以下に、本発明を実施するための形態(実施形態)における不具合解析装置について説明する。不具合解析装置の入力には、プログラムのソースコードと、プログラムの実行ログとが含まれる。実行ログには、実行中に呼び出された関数(メソッド)が含まれている。実行中に例外(例えば0徐算)が発生すると、実行ログは例外が発生した関数の呼び出しで終わっている(プログラム停止を記録している)。
不具合解析装置は、実行ログから例外が発生した関数のなかの徐算演算を含むプログラムのステートメント(ソースコードの行/ステップ)を解析開始点と設定する。また、利用者(開発者)に問い合わせて、解析開始点を含む関数を直接または間接に呼び出す関数を、解析終了点と設定する。
不具合解析装置は、解析開始点から解析終了点まで、通常のプログラム実行とは逆方向の逆向き記号実行を行う。逆向き記号実行の間は、不具合解析装置は、実行パスとパス条件を記録する。実行パスは、解析終了点と解析開始点とを結ぶプログラム中のパス(ステートメント/行/ステップの並び)であり、実行パスに沿って処理が進む。実行パスは、関数の呼び出しも含む。パス条件は、例外(例えば0徐算)が発生する変数の条件である。変数には、関数内のローカル変数や関数の入力パラメータが含まれる。
実行パスやパス条件を参照することで、利用者は、どのようにして例外(不具合)が発生するかを理解することができ、不具合の修正方法を検討する材料にすることができる。結果として、不具合解析装置は、利用者の不具合の解析(分析)を支援することができる。
不具合解析装置は、SMTソルバ(Satisfiability Modulo Theories Solver)を用いてパス条件を満足する解析終了点である関数の入力パラメータ値を算出する。この値を入力とするテストを行うことで、利用者は修正したプログラムが正しく動作するかを確認できるようになる。
≪不具合解析装置の構成≫
図1は、本実施形態に係る不具合解析装置100の入力、出力、および全体構成を示す図である。不具合解析装置100は、制御部110、記憶部120、および入出力部180を備える。
入出力部180は、ディスプレイやキーボード、マウスなどのユーザインターフェイスを備える。入出力部180は、さらに、通信インターフェイスや記録媒体の読み書きデバイスを備えてもよい。
記憶部120は、RAM(Random Access Memory)やROM(Read Only Memory)、SSD(Solid State Drive)などから構成される。記憶部120には、プログラム121や関数呼び出し関係データベース130(図1では関数呼び出し関係DB(Database)と記載)が記憶される。プログラム121は、コンピュータを不具合解析装置100として機能させるためのプログラムであって、不具合解析処理(後記する図5参照)の処理手順の記述を含む。関数呼び出し関係データベース130には、どの関数がどの関数を呼び出すかの関係、換言すれば、呼び出し関係グラフ(関数間の呼び出し関係を表現する制御フローのグラフ)を示すデータが記憶される。
制御部110を説明する前に、不具合解析装置100の入力と出力とを説明する。
≪不具合解析装置の入力≫
不具合解析装置100の入力には、ソースコード210、プログラム実行ログ220、およびプログラム仕様230が含まれる。ソースコード210は、解析対象であるソフトウェアプログラムを構成する関数(メソッド)のソースコードである。プログラム仕様230には、関数の名前、および、関数の入力パラメータ値と返り値(戻り値)の名前と型と範囲とが記述されている。
プログラム実行ログ220(実行ログ)は、プログラム実行中の関数呼び出しの記録を含む。プログラム実行ログ220には、呼び出された関数の名前(識別情報)の他に呼び出し時の入力パラメータ値や、呼び出しから戻るときの返り値を含んでもよい。プログラム実行ログ220は、さらにプログラム実行中に発生した例外を含んでもよい。例外としては、0徐算やプログラム仕様230に記述された入力パラメータ値または返り値の違反(仕様の範囲外の値)がある。
≪不具合解析装置の出力≫
不具合解析装置100の出力には、実行パス240、および入力パラメータ値250が含まれる。実行パス240は、不具合が発生するプログラム中のパス(ソースコード210のなかで順次処理される一連のステートメント/行/ステップ)である。実行パス240の一端は、不具合に係る例外(故障)が発生するステートメント/行/ステップであり、解析開始点、または単に開始点と記す。解析開始点は、例えば0徐算が発生する徐算演算を含むステートメントである。実行パス240の他端は、解析開始点を含む関数を直接または間接に呼び出す関数であり、解析終了点、またはエントリポイントと記す。解析終了点は、開始点を含む関数であってもよい。
入力パラメータ値250は、エントリポイントとなる関数の、不具合が発生するときの入力パラメータ値である。
≪不具合解析装置の制御部の構成≫
制御部110は、CPU(Central Processing Unit)から構成され、呼び出し関係生成部111、解析開始点取得部112、解析終了点取得部113、記号実行エンジン114、およびSMTソルバ115を備える。
呼び出し関係生成部111は、ソースコード210から関数の呼び出し関係を取得して、関数呼び出し関係データベース130に格納する。
解析開始点取得部112は、プログラム実行ログ220を解析して解析開始点を取得する。解析開始点の取得手順の詳細は後記する。
解析終了点取得部113(エントリポイント取得部)は、解析開始点を含む関数を呼び出す関数を関数呼び出し関係データベース130から取得して、エントリポイントの候補として入出力部180に備わるディスプレイに表示する。利用者(開発者)は、候補のなかから1つまたは複数のエントリポイントを選択する。解析終了点取得部113は、選択された関数を解析終了点(エントリポイント)として設定する。
記号実行エンジン114は、実行パス240、およびパス条件を生成する。パス条件は、解析対象のプログラムの実行が実行パス240を通るための変数(ローカル変数や入力パラメータ)の条件である。実行パス240やパス条件の詳細は後記する。以下の文献に記号実行エンジンンの詳細が記述されている: Peter Dinges and Gul Agha, "Targeted Test Input Generation Using Symbolic Concrete Backward Execution"。
SMTソルバ115(ソルバ)は、パス条件を満たす入力パラメータ値250を生成する。以下の文献にSMTソルバが記述されている: Leonardo de Moura and Nikolaj Bjorner, "Z3: An Efficient SMT Solver"。
≪実行パスとパス条件≫
図2は、本実施形態に係る実行パスおよびパス条件を説明するための図である。図2は、関数baz10、関数bar20、および関数foo30の3つの関数のソースコード210を含む。関数baz10は関数bar20を呼び出し、関数bar20は関数foo30を呼び出す。関数foo30で0徐算の例外が発生し、エントリポイントとして関数baz10が指定されたという前提で、説明を続ける。この場合、プログラム実行ログ220は、関数baz10の呼び出しの記録、関数bar20の呼び出しの記録、関数foo30の呼び出しの記録を含み、0徐算発生の記録で終わる。
プログラム実行ログ220を解析することで、解析開始点取得部112は、関数foo30のなかで0徐算の例外が発生したことを検出する。関数fooの行3が、徐算演算を含む唯一のステートメント/行であるから、解析開始点取得部112は、開始点を関数foo30の行3に設定する。
パス条件は、例外が発生する条件/制約である。解析開始点である関数foo30の行3におけるパス条件32は「b=0」である。
記号実行エンジン114は、開始点から始めて、通常の(前向き)実行とは反対の方向にプログラム(ソースコード210)のなかを、エントリポイントに到達するまで探索(逆向き記号実行とも記す)する。エントリポイントが複数ある場合には、記号実行エンジン114は、何れか1つのエントリポイントに到達するまで探索する。
図2の場合、記号実行エンジン114は、関数foo30の行3から探索を始めて、行1(先頭行)に到達する。この時点での実行パスは、関数foo30の行3~行1である。行1におけるパス条件31は「b=0」のままとなる。
記号実行エンジン114は、関数foo30が、第2入力パラメータのbが0で呼ばれたと判断して、関数foo30を呼び出すステートメントを探索する。図2の場合、関数foo30を呼び出すステートメントは、関数bar20の行3であり、記号実行エンジン114は、当該行から探索を継続する。この行におけるパス条件22は、第2入力パラメータが0となる「a-b=0」である。この時点における実行パスは、関数foo30の行3~行1、関数bar20の行3である。また、この時点でのパス条件は、関数foo30における「b=0」、関数bar20における「a-b=0」である。なお、関数baz10、関数bar20、および関数foo30にそれぞれ同じ名前の変数a,b,cがあるが、これらはぞれぞれの関数のローカル変数であり、異なる変数である。
記号実行エンジン114は、関数bar20の行3から探索を始めて、行1に到達する。この時点での実行パスは、関数foo30の行3~行1、関数bar20の行3~行1である。行1におけるパス条件21は「a=b」であり、パス条件22の「a-b=0」と同等である。
記号実行エンジン114は、関数bar20が、第1パラメータと第2入力パラメータとが同じ値で呼ばれたと判断して、関数bar20を呼び出すステートメントを探索する。図2の場合、関数bar20を呼び出すステートメントは、関数baz10の行3であり、記号実行エンジン114は、当該行から探索を継続する。この行におけるパス条件12は「a=b」である。この時点における実行パスは、関数foo30の行3~行1、関数bar20の行3~行1、関数baz10の行3である。また、この時点でのパス条件は、関数foo30における「b=0」、関数bar20における「a-b=0」、関数baz10における「a=b」である。
記号実行エンジン114は、関数baz10の行3から探索を始めて、行1に到達する。関数baz10は、解析終了点なので、探索はここで終了する。この時点での実行パスは、関数foo30の行3~行1、関数bar20の行3~行1、関数baz10の行3~行1である。また、この時点でのパス条件は、関数foo30における「b=0」、関数bar20における「a-b=0」、関数baz10における「a=b」である。
パス条件には、エントリポイント(解析終了点)の入力パラメータ値の条件を含んでいる。SMTソルバ115は、パス条件を解いて、エントリポイントである関数baz10の、パス条件を満たす入力パラメータ値250、例えばa=0でb=0、を算出する。
最後に、記号実行エンジン114は、実行パスを入出力部180に備わるディスプレイに表示する。利用者は、プログラムのなかで、どのような条件でどのように処理が進んで不具合が発生するかを理解することができる。延いては、問題点を見出し、プログラムを修正することができるようになる。SMTソルバ115は、入力パラメータ値250(パス条件を満たすエントリポイント(解析終了点)の入力値)を提供し、利用者はこの値を用いて修正したプログラムのテストができる。
上記の説明において、関数foo30、および関数bar20の呼び出し元のステートメントはそれぞれ1つであった。複数の呼び出し元がある場合には、それぞれの呼び出し元から探索を継続する。例えば、関数bazA(不図示)が、行5でbar(d+1,d―2)と関数bar20を呼び出したとする。記号実行エンジン114は、関数bazAの行5まで探索して、パス条件を求める。この場合、関数bar20のパス条件である第1パラメータと第2パラメータとが等しいことから、「d+1=d―2」がパス条件となる。しかしながら、このような条件が成立することはないので、記号実行エンジン114は、関数bazAの行5からの探索を打ち切り、別の呼び出し元の探索を継続する。
なお、複数の呼び出し元の探索を行い、それぞれがエントリポイントに到達した場合には、記号実行エンジン114は、それぞれの実行パスとパス条件とを記録するようにしてもよい。このような場合には、実行パスとパス条件とが、それぞれ複数あることになる。換言すれば、異なる条件で、同じ個所(解析開始点)で例外が発生することが判明したことになる。
探索途中で条件分岐があった場合には、記号実行エンジン114は、分岐条件をパス条件に加える。例えば、関数foo30の行3が、「if (x<=y) c=a/b;」であったとする。この場合のパス条件は、「b=0」かつ「x<=y」である。
解析終了点が複数指定されたり、関数の呼び出し元が複数あったり、条件分岐があったりする場合には、探索で辿り着く解析終了点や実行パス、パス条件が複数になる場合がある。
≪ユーザインターフェイス≫
図3は、本実施形態に係る不具合解析装置100の画面400の構成図である。画面400の左右における中央には上から、解析開始点の情報表示領域411、解析終了点の情報表示領域412、および解析結果の情報表示領域413が配置される。
解析開始点取得部112が解析開始点を設定すると、解析開始点の情報表示領域411に解析開始点を含む関数名や解析開始点の行数、例外が発生する条件などが表示される。例えば、0徐算の例外が発生し徐算演算が複数ある場合には、解析開始点の候補が複数あることになる。このような場合には、情報表示領域411には、解析開始点の候補が複数あり、そのなかの1つを選択するように利用者を促すメッセージが表示される。利用者は、「指定」ボタン421を押下して、解析開始点の候補を表示する画面(不図示)から1つの解析開始点を選択する。解析開始点取得部112は、選択された解析開始点の候補を解析開始点と設定する。
不具合解析装置100の起動直後(後記する図5記載の不具合解析処理の前)の時点では、解析終了点の情報表示領域412には、解析終了点(エントリポイント)の選択を促すメッセージが表示される。利用者は、「指定」ボタン422を押下して、解析終了点の候補(開始点を含む関数、当該関数を直接または間接に呼び出す関数)を表示する画面(不図示)から1つ以上の解析終了点を選択する。解析終了点取得部113は、選択された解析終了点の候補を解析終了点と設定して、情報表示領域412に表示する。複数選択された場合には、複数の解析終了点が情報表示領域412に表示される。
「解析開始」ボタン423が押下されると、記号実行エンジン114が、実行パスの探索を行い、辿り着いた解析終了点と解析終了点の入力パラメータに関するパス条件が、解析結果の情報表示領域413に表示される。複数の解析終了点、または、複数の入力パラメータに関するパス条件があれば、情報表示領域413には、複数の解析終了点やパス条件が表示される。「実行パス表示」ボタン424が押下されると、実行パス表示画面430(後記する図4参照)が表示される。
図4は、本実施形態に係る実行パス表示画面430の構成図である。実行パス表示画面430には、実行パスが通る関数baz10、関数bar20、および関数foo30のソースコードが表示される。関数baz10、関数bar20、および関数foo30のソースコードのなかで、それぞれの実行パス431,432,433となるステートメントは、反転表示される。また、解析開始点のステートメントには「開始点」が、エントリポイントの関数名のステートメントには「終了点」がプログラムのコメントとして表示される。さらに、ステートメントに対応してパス条件が、プログラムのコメントとして表示される。プログラムの流れを示す実行パス、および実行パスにおける不具合が発生する条件であるパス条件を確認することで、利用者(開発者)は不具合が発生する原因が理解でき、延いてはどのようにソースコードを修正するかを検討しやすくなる。
図4では、開始点、終了点、パス条件が、プログラムのコメントの形式で表示されるが、ステートメント/行との対応が把握可能であれば、他の形式であってもよい。
≪不具合解析処理≫
図5は、本実施形態に係る不具合解析処理のフローチャートである。
ステップS11において制御部110は、入力であるソースコード210、プログラム実行ログ220、プログラム仕様230を読み込む。
ステップS12において呼び出し関係生成部111は、読み込まれたソースコード210から関数の呼び出し関係を抽出して、関数呼び出し関係データベース130に格納する。
ステップS13において解析開始点取得部112は、プログラム実行ログ220から解析開始点を取得して設定する。解析開始点の候補が複数ある場合には、利用者に問い合わせて取得する(図3記載の「指定」ボタン421参照)。
ステップS14において解析終了点取得部113は、利用者に問い合わせて解析終了点(エントリポイント)を取得して設定する。
ステップS15において記号実行エンジン114は、解析開始点から探索(逆向き記号実行)を開始する。詳しくは、記号実行エンジン114は関数の先頭行に向かって逆向きに記号実行を行う。
ステップS16において記号実行エンジン114は、実行パスとパス条件を記録する。
ステップS17において記号実行エンジン114は、現在探索しているステートメント/行が、解析終了点(エントリポイント)の先頭行であれば(ステップS17→YES)ステップS18に進み、解析終了点の先頭行でなければ(ステップS17→NO)ステップS19に進む。
ステップS18において記号実行エンジン114は、探索(逆向き記号実行)の結果を表示する(図3記載の解析結果の情報表示領域413参照)。
ステップS19において記号実行エンジン114は、関数の呼び出し元を特定する。
ステップS20において記号実行エンジン114は、関数の呼び出し元から探索(関数の先頭行に向かう逆向き記号実行)を継続し、ステップS16に戻る。ステップS19において、複数の関数の呼び出し元が特定されれば、それぞれの呼び出し元から探索を継続する。また、探索途中でパス条件が成立しない条件になった場合には、探索を打ち切る。
≪不具合解析装置の特徴≫
不具合解析装置100は、プログラム実行ログ220から不具合に係る例外(故障)が発生するステートメント/行を特定して、解析開始点として設定する。解析開始点を特定できない場合には、不具合解析装置100は、利用者に解析開始点の候補を提示して、選択された候補を解析開始点として設定する。不具合解析装置100は、解析開始点から利用者が指定した解析終了点(エントリポイント)まで、プログラムのなかを通常の実行方向とは逆に探索(逆向き記号実行)して、実行パス240とパス条件を特定して出力する。
利用者は、実行パス240を参照することで、プログラムのなかで、どのような条件でどのように処理が進んで不具合が発生するかを理解することができる。延いては、問題点を見出し、プログラムを修正することができるようになる。さらに、パス条件を満たすエントリポイントの入力パラメータ値250を用いて修正したプログラムのテストができるようになる。
≪変形例≫
上記した実施形態では、不具合解析装置100は、探索(逆向き記号実行)終了後に、パス条件を満足するエントリポイントの入力パラメータ値を求めている。不具合解析装置100は、プログラム仕様230に記載の入力パラメータ値や返り値の範囲まで考慮して、パス条件を解いたり、例外(故障)を検出したりするようにしてもよい。
図6は、本実施形態の変形例に係る実行パスおよびパス条件を説明するための図である。図6は、関数foobar40、および関数qux50の2つの関数のソースコード210を含む。関数foobar40は関数qux50を呼び出す。プログラム仕様230では、関数foobar40の第1パラメータの範囲は1以上5以下であり、第2入力パラメータの範囲は0以上かつ5以下であって、返り値の範囲は1以上10未満である(後記する図7記載の解析終了点の情報表示領域412参照)。以下では、関数foobar40で返り値の異常が発生し、エントリポイントとして関数foobar40が指定されたという前提で、説明を続ける。この場合、プログラム実行ログ220は、関数foobar40の呼び出しの記録、関数qux50の呼び出しの記録、関数foobar40の返り値に係る例外(異常)の記録を含む。
プログラム実行ログ220を解析することで、解析開始点取得部112は、関数foobar40のなかで返り値の例外が発生したことを検出する。関数foobar40の行4が、呼び出し元に返る唯一のステートメント/行であるから、解析開始点取得部112は、開始点を関数foobar40の行4に設定する。
関数foobar40の返り値の範囲は1以上10未満であるので、解析開始点取得部112は、行4のパス条件43として、例えば「c=10」を設定する。解析開始点取得部112は、利用者に問い合わせてパス条件43を設定してもよい。
記号実行エンジン114は、開始点から始めて、通常の(前向き)実行とは反対の方向にプログラムのなかを、エントリポイントに到達するまで探索する。
図6の場合、記号実行エンジン114は、関数foobar40の行3から探索を始めて、行3で関数qux50の呼び出しに到達する。この時点での実行パスは、関数foobar40の行4~行3である。
記号実行エンジン114は、関数qux50の返り値が10であると判断して、関数qux50の呼び出し元に戻るステートメントを探索する。図6の場合、呼び出し元に戻るステートメントは、行3と行5とがある。記号実行エンジン114は、行3と行5とのそれぞれから探索を継続する。
行3におけるパス条件は「y=10」である。また、行2において行3に分岐する条件は「x<y」である。よって、実行パスが行3から行1である場合のパス条件52は、「y=10」かつ「x<y」であり、結果として「y=10」かつ「x<10」となる(図6では、「y=10 & x<10」と記載)。同様にして行5について、実行パスが行5、行3から行1である場合のパス条件53は、「x=10」かつ「y<=10」となる(図6では、「x=10 & y<=10」と記載)。
以上により、関数qux50の行1におけるパス条件51は、「y=10 & x<10」または「x=10 & y<=10」となる(図6では、「(y=10 & x<10)|(x=10 & y<=10)」と記載)。
記号実行エンジン114は、関数foobar40の行3に戻り、パス条件51を関数foobar40の変数に当てはめて、パス条件42は「(a-b=10 & a+b<10)|(a+b=10 & a-b<=10)」となる。記号実行エンジン114は、さらに探索を継続して、エントリポイントである関数foobar40の先頭行に到達して、パス条件41の「(a-b=10 & a+b<10)|(a+b=10 & a-b<=10)」を得る。
SMTソルバ115は、関数foobar40の入力パラメータの仕様と合わせてパス条件を解く。入力パラメータの仕様は、第1パラメータのaが1以上5以下、第2パラメータのbが0以上5以下である。この条件と合わせてパス条件41を解いて、SMTソルバ115は、「a=5」と「b=5」を得る。続いて、記号実行エンジン114は、この値を用いてエントリポイントから解析開始点までの(順向き)記号実行を行い、最初のパス条件43である「c=10」を得る。
図7は、本実施形態の変形例に係る不具合解析装置100の画面400Aの構成図である。以下、画面400(図3参照)との違いを説明する。
解析終了点の情報表示領域412に表示されるエントリポイントの情報には、入力パラメータや返り値の仕様が含まれる。また、解析結果の情報表示領域413には、エントリポイントの入力パラメータ値250の他に、エントリポイントである関数をこの値で呼び出した場合の開始点の変数値が表示される。
上記の変形例では、開始点でのパス条件43として、「c=10」と変数値が設定されているが、これに限らない。例えば、仕様上の返り値の範囲外である「c<1|c>=10」という条件を設定してもよい。但し、パス条件が数値ではなく条件であると、条件を処理する記号実行エンジン114やSMTソルバ115の処理が遅くなったり、場合によっては処理不能となったりする場合がある。
図8は、本実施形態の変形例に係る不具合解析処理のフローチャート(1)である。図9は、本実施形態の変形例に係る不具合解析処理のフローチャート(2)である。
ステップS31~S39は、図5記載のステップS11~S17,S19,S20とそれぞれ同様である。但し、ステップS37において、現在探索しているステートメント/行が、解析終了点(エントリポイント)の先頭行であれば(ステップS37→YES)記号実行エンジン114は、図9記載のステップS40に進む。
ステップS40においてSMTソルバ115は、パス条件を解き、不具合が発生する入力パラメータ値を求める。詳しくは、SMTソルバ115は、エントリポイントにおけるパス条件、およびエントリポイントである関数の入力パラメータ値の範囲に係る条件(仕様)を満足する入力パラメータ値250を求める。
ステップS41において記号実行エンジン114は、ステップS40で求めた入力パラメータ値でエントリポイントから順向き記号実行を行う。
ステップS42において記号実行エンジン114は、実行パスと変数値を記録する。
ステップS43において記号実行エンジン114は、現在の順向け記号実行をしているステートメント/行が、解析開始点ならば(ステップS43→YES)ステップS44に進み、解析開始点でなければ(ステップS43→NO)ステップS45に進む。
ステップS44において記号実行エンジン114は、順向き記号実行の結果を表示する(図7記載の解析結果の情報表示領域413参照)。
ステップS45において記号実行エンジン114は、関数呼び出しにおいて呼び出す関数を特定する。
ステップS46において記号実行エンジン114は、呼び出す関数において、呼び出し時の入力パラメータ値で順向き記号実行を継続し、ステップS42に戻る。
≪変形例:例外≫
上記の実施形態や変形例において、例外として0徐算や、プログラム仕様230の記載に反する入力パラメータ値と返り値を示した。プログラム仕様230に限らず、プログラム(ソースコード210)から呼び出されるライブラリ関数の入力パラメータの仕様に反するライブラリ関数の呼び出しや、ライブラリ関数の返り値の仕様に反するライブラリ関数の呼び出しからの戻りを例外に含めてもよい。
≪その他変形例≫
以上、本発明のいくつかの実施形態について説明したが、これらの実施形態は、例示に過ぎず、本発明の技術的範囲を限定するものではない。例えば、上記した実施形態では、解析開始点取得部112は、プログラム実行ログから例外発生を検出して、開始点を設定しているが、利用者に問い合わせて、開始点や当該開始点における例外(パス条件)を取得するようにしてもよい。プログラム実行ログが例外の発生を記録していない場合には、利用者(開発者)は、最後に記録されている関数呼び出しから例外発生個所の見当をつけて開始点を設定する。
本発明はその他の様々な実施形態を取ることが可能であり、さらに、本発明の要旨を逸脱しない範囲で、省略や置換等種々の変更を行うことができる。これら実施形態やその変形は、本明細書等に記載された発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
100 不具合解析装置
111 呼び出し関係生成部
112 解析開始点取得部
113 解析終了点取得部
114 記号実行エンジン
115 SMTソルバ(ソルバ)
210 ソースコード(プログラム)
220 プログラム実行ログ(実行ログ)
230 プログラム仕様
240 実行パス
250 入力パラメータ値
11,12,21,22,31,32,41,42,43,51,52,53 パス条件
411 情報表示領域(解析開始点の情報表示領域)
412 情報表示領域(解析終了点の情報表示領域)
413 情報表示領域(解析結果の情報表示領域)
431,432,433 実行パス

Claims (7)

  1. 入力にプログラムの実行ログを含むプログラムの不具合解析装置であって、
    前記実行ログから例外が発生したプログラムのステートメントを解析開始点として取得する解析開始点取得部と、
    前記解析開始点を含む関数を直接または間接に呼び出す関数を解析終了点として取得する解析終了点取得部と、
    前記解析開始点から前記解析終了点へ逆向き記号実行を行い、実行パスを出力する記号実行エンジンと
    を備える不具合解析装置。
  2. 前記解析開始点取得部は、
    前記例外が発生したプログラムのステートメントが1つに特定できない場合に、前記例外が発生する複数のステートメントのなかから選択されたステートメントを、前記解析開始点として取得する
    ことを特徴とする請求項1に記載の不具合解析装置。
  3. 前記例外は、
    0徐算、
    前記プログラムのプログラム仕様に記載される関数の入力パラメータ値の範囲から外れる値での関数呼び出し、
    前記プログラムのプログラム仕様に記載される関数の返り値の範囲から外れる値での関数呼び出しからの戻り、
    前記プログラムが呼び出すライブラリ関数の入力パラメータ値の範囲から外れる値での関数呼び出し、および、
    前記プログラムが呼び出すライブラリ関数の返り値の範囲から外れる値での関数呼び出しからの戻り
    のなかの何れかを含む
    ことを特徴とする請求項1に記載の不具合解析装置。
  4. ソルバをさらに備え、
    前記記号実行エンジンは、前記例外が発生する条件であるパス条件を算出し、
    前記ソルバは、前記パス条件を満たす前記解析終了点となる関数の入力パラメータ値の条件、または、前記パス条件を満たす前記解析終了点となる関数の入力パラメータ値を出力する
    ことを特徴とする請求項1に記載の不具合解析装置。
  5. ソルバをさらに備え、
    前記記号実行エンジンは、前記例外が発生する条件であるパス条件を算出し、
    前記ソルバは、前記パス条件を満たす前記解析終了点となる関数の入力パラメータ値を出力し、
    前記記号実行エンジンは、前記ソルバが出力した入力パラメータ値での前記解析終了点の呼び出しから前記解析開始点までの順向き記号実行を行い、前記解析開始点での変数値を出力する
    ことを特徴とする請求項1に記載の不具合解析装置。
  6. コンピュータを、請求項1~5の何れか1項の不具合解析装置として機能させるためのプログラム。
  7. 入力にプログラムの実行ログを含むプログラムの不具合解析装置の不具合解析方法であって、
    前記実行ログから例外が発生したプログラムのステートメントを解析開始点として取得するステップと、
    前記解析開始点を含む関数を直接または間接に呼び出す関数を解析終了点として取得するステップと、
    前記解析開始点から前記解析終了点へ逆向き記号実行を行い、実行パスを出力するステップと
    を実行する不具合解析方法。
JP2020143591A 2020-08-27 2020-08-27 不具合解析装置、プログラムおよび不具合解析方法 Pending JP2022038884A (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2020143591A JP2022038884A (ja) 2020-08-27 2020-08-27 不具合解析装置、プログラムおよび不具合解析方法
US18/015,266 US20230259447A1 (en) 2020-08-27 2021-02-25 Defect Analysis Apparatus, Program, and Defect Analysis Method
PCT/JP2021/007054 WO2022044376A1 (ja) 2020-08-27 2021-02-25 不具合解析装置、プログラムおよび不具合解析方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2020143591A JP2022038884A (ja) 2020-08-27 2020-08-27 不具合解析装置、プログラムおよび不具合解析方法

Publications (1)

Publication Number Publication Date
JP2022038884A true JP2022038884A (ja) 2022-03-10

Family

ID=80354854

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2020143591A Pending JP2022038884A (ja) 2020-08-27 2020-08-27 不具合解析装置、プログラムおよび不具合解析方法

Country Status (3)

Country Link
US (1) US20230259447A1 (ja)
JP (1) JP2022038884A (ja)
WO (1) WO2022044376A1 (ja)

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6390217B2 (ja) * 2014-07-04 2018-09-19 富士通株式会社 ソフトウェア変更プログラム、ソフトウェア変更装置、及びソフトウェア変更方法

Also Published As

Publication number Publication date
WO2022044376A1 (ja) 2022-03-03
US20230259447A1 (en) 2023-08-17

Similar Documents

Publication Publication Date Title
CN108388514B (zh) 接口自动化测试方法、装置、设备及计算机可读存储介质
JP5775829B2 (ja) ソフトウェアの構造可視化プログラムおよびシステム
Angerer et al. Configuration-aware change impact analysis (t)
US20150363295A1 (en) Command coverage analyzer
CN113742119A (zh) 嵌入式系统的调用栈回溯方法、装置和计算机设备
CN108399125B (zh) 自动化测试方法、装置、计算机设备和存储介质
JP6310527B1 (ja) オブジェクト分析装置、オブジェクト分析方法、及びプログラム
Schneid et al. Automated regression tests: a no-code approach for BPMN-based process-driven applications
CN106294109B (zh) 获取缺陷代码的方法及装置
WO2022044376A1 (ja) 不具合解析装置、プログラムおよび不具合解析方法
US20080195906A1 (en) Test pattern generation apparatus and test pattern generation method
WO2023058609A1 (ja) 不具合解析装置及び不具合解析方法
CN115203050A (zh) 一种服务的依赖关系的确定方法及装置
CN114996156A (zh) 一种小程序的测试方法、装置、电子设备和可读存储介质
KR101846140B1 (ko) 프로그램 진단 장치, 프로그램 진단 방법 및 프로그램 진단 프로그램
CN109359042B (zh) 一种基于路径搜索算法的自动化测试方法
JP7380851B2 (ja) テストスクリプト生成装置、テストスクリプト生成方法及びプログラム
Zhyhulin et al. Combined method of prioritization and automation of software regression testing
JP2023000907A (ja) ソースコード修正支援装置及びソースコード修正支援方法
US20240143300A1 (en) Program analyzing apparatus, program analyzing method, and trace processing addition apparatus
WO2020230241A1 (ja) テスト装置、テスト方法及びプログラム
Pauck et al. Android app merging for benchmark speed-up and analysis lift-up
CN113220596B (zh) 应用的测试方法、装置、设备、存储介质及程序产品
US20240020217A1 (en) Computer and Method for Selecting Correction Part of Software
CN116860628A (zh) 静态分析器测试方法及装置

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20230201

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20240402

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20240513