JP7447044B2 - プログラム分析装置、プログラム分析方法およびトレース処理追加装置 - Google Patents

プログラム分析装置、プログラム分析方法およびトレース処理追加装置 Download PDF

Info

Publication number
JP7447044B2
JP7447044B2 JP2021044926A JP2021044926A JP7447044B2 JP 7447044 B2 JP7447044 B2 JP 7447044B2 JP 2021044926 A JP2021044926 A JP 2021044926A JP 2021044926 A JP2021044926 A JP 2021044926A JP 7447044 B2 JP7447044 B2 JP 7447044B2
Authority
JP
Japan
Prior art keywords
execution
program
function
execution path
trace
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2021044926A
Other languages
English (en)
Other versions
JP2022144078A (ja
Inventor
洋渡 加賀
真澄 川上
康文 鈴木
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
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 JP2021044926A priority Critical patent/JP7447044B2/ja
Priority to PCT/JP2022/005804 priority patent/WO2022196219A1/ja
Priority to EP22770978.9A priority patent/EP4310682A1/en
Priority to US18/547,873 priority patent/US20240143300A1/en
Publication of JP2022144078A publication Critical patent/JP2022144078A/ja
Application granted granted Critical
Publication of JP7447044B2 publication Critical patent/JP7447044B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4434Reducing the memory space required by the program code
    • G06F8/4435Detection or removal of dead or redundant code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • G06F8/4451Avoiding pipeline stalls
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • 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

Landscapes

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

Description

本発明は、ソフトウェアプログラムの分析を支援するプログラム分析装置、プログラム分析方法およびトレース処理追加装置に関する。
ソフトウェア(プログラム)開発において、開発者が想定していないソフトウェアの動作を不具合と呼び、ソフトウェアをリリースする前に不具合を修正してなくすことが望ましい。不具合を検出する一般的な手法としてテストがある。テストでは、開発者が期待する入力と出力とを定義してソフトウェアがそのとおりに動作するかを確認し、動作しない場合を不具合とする。不具合が発生した場合、開発者はソフトウェアのどの部位で想定外の処理をしたかを分析し、原因箇所を特定したのち、適切な処理を行うようにソフトウェアのロジックを修正する。
入力値に基づいて何らかの計算を行って出力値を決定する組み込みソフトウェアの場合、殆どの入力に対しては正常に動作するが、極めてまれな条件下においてのみ異常が発生することがある。この種の不具合は、不具合が発生する条件を突き止めることが難しく、非再現不具合と呼ばれる。
特許文献1には、入力仕様と出力仕様とが定義されたソフトウェアコンポーネントにおいて、仕様に違反した入力に対してどの出力が仕様を満たせなくなるかを求めることにより、ソフトウェアコンポーネントの故障時の故障伝搬を評価する手法が記載されている。
特開2012-128727号公報
特許文献1に記載の手法では、異常な入力を与えた場合のソフトウェアコンポーネントの挙動を評価できるが、通常の入力に対して異常な出力が起こる不具合の原因を分析することはできない。
非再現不具合の解消のアプローチとして、記号実行を用いた分析を行うことができる。記号実行は、対象のソフトウェアが実行し得る処理の順序(実行パス)を網羅的に抽出し、それぞれのパスを実行する入力を決定する技術である。記号実行を用いることで、テスト時に入力するデータの生成や、不具合が発生する場合の入力データの導出が可能となり、テストを効率的に実施することができる。
一方で記号実行は、実行パスを網羅的に評価するため、計算リソースと計算時間を要する。記号実行を複雑で大規模なソフトウェアに適用すると実行パスが膨大となるため計算処理時間が大きくなり、予定された開発期間内で不具合分析を完了することができないことがある。
本発明は、このような背景を鑑みてなされたものであり、不具合を解消するためのプログラム分析時間の短縮を可能とするプログラム分析装置、プログラム分析方法およびトレース処理追加装置を提供することを課題とする。
上記した課題を解決するため、本発明に係るプログラム分析装置は、プログラムのなかで順に実行されるステートメントの列である実行パスについて、実行される可能性のある全ての実行パスである全実行パスから、前記プログラムに含まれる条件分岐の分岐先に係る情報を参照して実行されない実行パスを削除する実行パス削減部と、前記プログラムに含まれる関数の引数および戻り値の範囲の仕様を取得する関数仕様取得部と、前記実行パス削減部が削除した後の残存実行パスに含まれる関数のなかで、前記仕様と矛盾する前記引数の値である不具合条件を算出する不具合箇所検出部と、を備える。
また本発明に係るトレース処理追加装置は、プログラムに含まれる所定の条件を満たす条件分岐を優先して当該条件分岐のステートメントの直前に、当該条件分岐のステートメントに含まれる変数の値を実行ログに出力するトレース処理を挿入するトレース処理追加部を備え、前記所定の条件は、前記プログラムのなかで順に実行される関数の列である関数実行パスのなかで、複数の前記関数実行パスに含まれる関数にあるという条件、前記プログラムのなかで順に実行されるステートメントの列である実行パスのなかで、複数の前記実行パスに含まれるという条件、過去に不具合が発生した関数にあるという条件、およびテストが未実施である実行パスに含まれるという条件の何れかであることを特徴とする。
本発明によれば、不具合を解消するためのプログラム分析時間の短縮を可能とするプログラム分析装置、プログラム分析方法およびトレース処理追加装置を提供することができる。
本実施形態に係る不具合分析支援システムの全体構成図である。 本実施形態に係るトレース処理挿入前のソースコードである。 本実施形態に係るトレース処理挿入後のソースコードである。 本実施形態に係る実行パスを説明するための有向グラフである。 本実施形態に係るトレース処理追加装置の機能ブロック図である。 本実施形態に係るトレース処理追加処理のフローチャートである。 本実施形態に係る不具合分析装置の機能ブロック図である。 本実施形態に係る不具合分析処理を説明するための図である。 本実施形態に係る不具合分析処理のフローチャートである。 本実施形態に係る不具合分析結果画面の画面構成図である。 本実施形態の変形例に係る不具合履歴データベースのデータ構成である。 本実施形態の変形例に係るテスト履歴データベースのデータ構成である。
≪不具合分析支援システムの概要≫
以下に本発明を実施するための形態(実施形態)における不具合分析支援システムについて説明する。不具合分析システムは、プログラム(ソースコード、ソフトウェア)に対して記号実行の技術を用いて不具合箇所(の範囲)を特定する。記号実行とは、変数に具体的な値を代入してプログラムを実行する(プログラムの処理を進める)替わりに、変数に制約条件を設けて制約条件を更新しながらプログラムの実行をシミュレーションする技術である。後記するように、記号実行を用いることで関数の引数と戻り値の仕様に矛盾する引数の値(不具合発生条件)を算出することができ、不具合分析(不具合箇所の特定)に利用することができる。
プログラムのなかで実行されるステップ(ステートメント)の並びは、実行パスと呼ばれる。実行パスはプログラムが実行する可能性のある処理の順序とも捉えられる。実行される可能性のある全て実行パスに対して記号実行を用いると計算量が膨大になり、不具合分析手法として現実的ではない。
不具合分析支援システムでは、条件分岐で参照される変数の値を実行ログから取得し、どの分岐が実行されるかを特定して、記号実行の対象となる実行パスを削減する。不具合が発生したときの実行ログを用いることで、不具合が発生する実行パスに対して記号実行を用いることができ、不具合分析に要する時間を短縮することができるようになる。
≪不具合分析支援システムの構成≫
図1は、本実施形態に係る不具合分析支援システム10の全体構成図である。図1を参照しながら不具合分析支援システム10の構成、および不具合分析の流れを説明する。
不具合分析支援システム10は、トレース処理追加装置200と不具合分析装置100(プログラム分析装置)とを含んで構成される。トレース処理追加装置200は、ソースコード410、実行パス情報420、およびトレース仕様430を入力とし、トレース処理付きソースコード440を出力する。トレース処理追加装置200は、実行時における変数の値を実行ログ460に出力するトレース処理(Trace文)をソースコード410に埋め込む。トレース処理追加装置200の詳細については後記する。
実行形式生成装置300は、トレース処理付きソースコード440をコンパイルし、必要なライブラリプログラムとリンクして、トレース処理付き実行形式コード450(実行形式プログラム)を出力する。トレース処理付き実行形式コード450は、実際に実行形式のコードが実行され、異常が発生する実機350(例えば車載器)にインストールされる(組み込まれる)。
なお、特に混同するおそれがない場合には、トレース処理付きソースコード440、およびトレース処理付き実行形式コード450を単にプログラムとも記す。「プログラムを実行する」のプログラムはトレース処理付き実行形式コード450のことであり、「プログラムに含まれるステップ」のプログラムはトレース処理付きソースコード440のことである。
実機350がインストール済みのプログラム(トレース処理付き実行形式コード450)を実行することで実機350が稼働し、実行ログ460が生成される。実行ログ460には、トレース処理により実行時の変数の値が記録される。他に、呼び出された関数や異常(異常の内容や発生した関数など)が記録されてもよい。
不具合分析装置100は、トレース処理付きソースコード440、実行パス情報420、関数仕様書470、および実行ログ460を入力とし、不具合分析結果480を出力する。不具合分析装置100は実行ログ460を参照して、プログラム(トレース処理付きソースコード440)の実行パス全体から実行されていない実行パスを除く。不具合分析装置100は残った実行パスに対して記号実行処理を行うことで不具合発生個所を特定し、不具合発生条件を不具合分析結果480として出力する。不具合分析装置100の詳細については後記する。
≪トレース処理追加装置の概要≫
トレース処理追加装置200は、ソースコード410、実行パス情報420、およびトレース仕様430を入力とし、トレース処理付きソースコード440を出力する。トレース処理とは、実行ログ460にプログラムの変数の値を記録する処理である。ソースコード410は分析対象となるソースコードであって、トレース処理の埋め込み対象である。
図2は、本実施形態に係るトレース処理挿入前のソースコード412である。ソースコード412は、ソースコード410の一部である。図3は、本実施形態に係るトレース処理挿入後のソースコード442である。ソースコード442は、トレース処理付きソースコード440の一部である。
ソースコード412に含まれる行2の条件分岐文(if文)の前にトレース処理(Trace文)のステップが挿入された(埋め込まれた)結果が、ソースコード442である。関数fooが呼び出されてソースコード442の行2が実行(処理)されると、トレース処理の引数となっている変数xと変数yとの実行時点の値が実行ログ460(図1参照)に記録される。
実行パス情報420は、ソースコード410に含まれる実行可能性のある全ての実行パスの情報である。
図4は、本実施形態に係る実行パスを説明するための有向グラフ500である。有向グラフ500のノードはソースコードのステップ(ステートメント、文、行)を示し、エッジはステップの実行順序を示す。有向グラフ500では、ノード501が示すステップからプログラムが開始し、ノード502が示す条件分岐のステップ(条件分岐文)で実行パスが2つに分かれることを示す。始点となるノード501から始まり、終点(例えばノード521,522,523)となるノードまでのそれぞれの有向グラフ500のパスが実行パスである。有向グラフ500は実行パス全体を示していることになる。なお、実行パスの部分パスもまた実行パスと呼ぶ。
上記の説明では有向グラフ500のノードをソースコードのステップと見なしたが、ソースコードに含まれる関数と見なしてもよい。この場合には、エッジは関数の呼び出し関係と見なされ、実行パスは呼び出される関数の並びとなり、有向グラフ500は関数の呼び出し関係を示すと見なせる。
実行パス情報420は、ステップの実行パス(ステップ実行パスとも記す)および関数の実行パス(関数実行パスとも記す)の双方を含むものとする。
図1に戻ってトレース仕様430は、トレース処理の挿入処理に係る仕様であって、例えば、挿入可能なトレース処理(Trace文)の上限に係る情報を含む。上限は、実行ログ460が記憶される実機350の記憶容量、挿入されるTrace文の数、トレース処理の対象となる変数の数、変数の型(サイズ)などに依存する。説明を簡単にするために本実施形態では、上限は挿入されるTrace文の数によって決まり、トレース仕様430はTrace文の上限を含むものとする。
≪トレース処理追加装置の構成≫
図5は、本実施形態に係るトレース処理追加装置200の機能ブロック図である。トレース処理追加装置200は、コンピュータであって、制御部210、記憶部220、および入出力部280を含んで構成される。入出力部280には、ディスプレイやキーボード、マウスなどのユーザインターフェイス機器が接続される。また入出力部280は、記録媒体とのインターフェイス機能や他の装置との通信機能を備える。
記憶部220は、ROM(Read Only Memory)やRAM(Random Access Memory)、SSD(Solid State Drive)などから構成される。記憶部220には、プログラム221、および関数実行パスデータベース230(図5では関数実行パスDB(Database)と記載)が記憶される。プログラム221は、トレース挿入処理(後記する図6参照)の記述を含む。関数実行パスデータベース230には、ソースコード410の実行パス情報が格納される。
制御部210はCPU(Central Processing Unit)を含んで構成され、ソースコード入出力部211、トレース箇所決定部212、およびトレース処理追加部213を備える。ソースコード入出力部211は入出力部280を介してソースコード410(図1参照)や実行パス情報420、トレース仕様430を取得して記憶部220に記憶したり、トレース処理付きソースコード440を出力したりする。なお、ソースコード入出力部211は実行パス情報420に含まれる関数実行パスを関数実行パスデータベース230に格納する。
トレース箇所決定部212は、ソースコード410のなかでTrace文の挿入箇所を決定する。詳しくは、トレース箇所決定部212は関数実行パス(関数の呼び出し関係)と見なした有向グラフ500(図4参照)における始点となるノード501から終点までのノードまでの実行パスが多く通るノード対応する関数から順にTrace文を挿入する候補の関数とする。換言すれば、トレース箇所決定部212は関数実行パスデータベース230を参照して通る実行パスが多いノード(関数)ほどTrace文の挿入順位が高いとする。
例えば、ノード501,502(図4参照)は全ての実行パスが通るため、Trace文挿入の最高順位となる。また、ノード513の上流にはノード511があり、ノード511を通る実行パスはノード513を通るので、ノード513はノード511より挿入順位が高くなる。有向グラフ500を関数の呼び出し関係と見なすと、ノード501,502に対応する関数が、Trace文挿入順位が最高の関数となる。また、ノード513に対応する関数はノード511に対応する関数より挿入順位が高くなる。
トレース処理追加部213は、ソースコードの条件分岐文(if文)の前に、当該条件分岐の判定に参照される変数の値を実行ログ460に出力するTrace文を挿入する。
≪トレース処理追加処理≫
図6は、本実施形態に係るトレース処理追加処理のフローチャートである。
ステップS11においてソースコード入出力部211は、ソースコード410(図1参照)、実行パス情報420、およびトレース仕様430を取得して記憶部220に格納する。
ステップS12においてトレース箇所決定部212は、Trace文を挿入する関数の順位を決定する。トレース箇所決定部212は通る実行パス(図4記載の関数の呼び出し関係と見なす有向グラフ500参照)が多いノード(関数)ほどTrace文の挿入順位が高いとする。
ステップS13においてトレース箇所決定部212は、ステップS12で決定した挿入順位の高い関数から順にステップS14~S15を繰り返す処理を開始する。
ステップS14においてトレース箇所決定部212は、関数にTrace文を挿入すると上限を超えるか否かを判断する。トレース箇所決定部212は上限を超えるならば(ステップS14→YES)繰り返し処理を終えてステップS16に進み、超えないならば(ステップS14→NO)ステップS15に進む。なお上限は、トレース仕様430に含まれるTrace文の挿入可能な上限数である。
ステップS15においてトレース処理追加部213は、関数の条件分岐文の前にTrace文を挿入する(図2、図3参照)。
ステップS16においてソースコード入出力部211は、Trace文が挿入されたソースコード(図1記載のトレース処理付きソースコード440)を出力する。
≪不具合分析装置の構成≫
不具合分析装置100は、トレース処理付きソースコード440、実行パス情報420、関数仕様書470、および実行ログ460を入力とし、不具合分析結果480を出力する(図1参照)。関数仕様書470は、ソースコード410に含まれる関数の仕様書であって、引数および戻り値の型や範囲を含む(後記する図8記載の関数仕様479参照)。
図7は、本実施形態に係る不具合分析装置100の機能ブロック図である。不具合分析装置100はコンピュータであって、制御部110、記憶部120、および入出力部180を備える。入出力部180には、ディスプレイやキーボード、マウスなどのユーザインターフェイス機器が接続される。また入出力部180は、記録媒体とのインターフェイス機能や他の装置との通信機能を備える。
記憶部120は、ROMやRAM、SSDなどから構成される。記憶部120には、プログラム121、関数実行パスデータベース130、実行パスデータベース140、関数仕様データベース150、および実行ログデータベース160が記憶される。図7では、関数実行パスデータベース130を関数実行パスDBと、実行パスデータベース140を実行パスDBと、関数仕様データベース150を関数仕様DBと、実行ログデータベース160を実行ログDBと記載している。プログラム121は、不具合分析処理(後記する図9参照)の記述を含む。
制御部110はCPUを含んで構成され、関数仕様取得部111、実行パス削減部112、不具合箇所検出部113、および記号実行エンジン114を備える。関数仕様取得部111は、入出力部180を介してトレース処理付きソースコード440、実行パス情報420、関数仕様書470、および実行ログ460を取得する。関数仕様取得部111は、実行パス情報420に含まれるステップ実行パスを実行パスデータベース140に、実行パス情報420に含まれる関数実行パスを関数実行パスデータベース130に、関数仕様書470を関数仕様データベース150に、実行ログ460を実行ログデータベース160にそれぞれ格納する。実行パス情報420に含まれるステップの実行パス情報が格納された時点で実行パスデータベース140には、全ての可能性のあるステップ実行パス(全実行パス)が含まれている。
実行パス削減部112は、ステップ実行パスを削減する。図3に示す関数fooのソースコード442において、関数foo内の実行パスとして、行2、行3、行4と進む実行パスと、行2、行3、行6と進む実行パスとがある。実行ログデータベース160に含まれる行2のTrace文の出力結果である変数xと変数yの値(トレース結果とも記す)を参照することで、実行パス削減部112は何れの実行パスを通ったのかが判定できる。詳しくは、実行パス削減部112は実機350(図1参照)におけるプログラム実行時に、実機350が何れの実行パスを通った(実行した)のかが特定できる。実行パス削減部112は、条件分岐で複数に分かれた実行パスのなかで通っていない(実行されなかった、到達していない)実行パスを特定して、実行パスデータベース140から削除する。このようにして実行パス削減部112は、全ての可能性のある実行パス(全実行パス)から実行されなかった実行パスを削減する。
不具合箇所検出部113は、実行パスデータベース140に残存している実行パスに含まれる関数のなかから不具合が発生している関数を、記号実行エンジン114を用いて検出する。詳しくは、不具合箇所検出部113は残存している実行パスを通る記号実行を行い、不具合が発生する条件(引数と戻り値の値)を算出する。
図8は、本実施形態に係る不具合分析処理を説明するための図である。不具合箇所検出部113は、関数仕様書470(図1参照)に示された関数の引数の範囲を示す論理式と、戻り値の範囲外を示す論理式との論理積を満たす引数と戻り値とを不具合発生条件を算出する。算出には記号実行技術を用いる。以下では関数barを例に説明する。
関数barの仕様は、関数仕様479に示すとおりであって、引数の範囲を示す論理式(1)および戻り値の範囲外を示す論理式(2)は以下のとおりである。論理式(2)は戻り値の範囲を示す論理式の否定でもある。なお、「&」は論理積(AND)であり「|」は論理和(OR)である。
0<=a & a<=5 & 0<=b & b<=5 (1)
c<1 | 10<=c (2)
関数barを起点とする(ステップ)実行パスは2つある。第1の実行パスは、ソースコード411の行2、行3、ソースコード442の行2、行3、行4、ソースコード411の行3、行4である。第2の実行パスは、ソースコード411の行2、行3、ソースコード442の行2、行3、行6、ソースコード411の行3、行4である。この2つの実行パスは、ソースコード442の行3にあるif文に示される条件(x<y)に応じて分岐している。ここで、ソースコード411の行3については、関数fooの呼び出し前後で2回実行パスに含めている。
関数fooの第1引数xはa+b、第2引数yはa-bであるので、第1の実行パスの場合には論理式(3)が成り立ち、第2の実行パスの場合には論理式(4)が成り立つ。
a+b < a-b & c=a-b (3)
a+b >= a-b & c=a+b (4)
ソースコード442の行3の条件分岐(if文)で何れの分岐に進むか不明の場合には、不具合箇所検出部113は((1)&(2)&(3))|((1)&(2)&(4))という論理式から不具合発生条件を算出する必要がある。しかしながら、当該条件分岐で何れの実行パスに進むかが解れば分岐先となる実行パスに応じて、(1)&(2)&(3)または(1)&(2)&(4)を解けばよく、不具合発生条件の算出が効率化できる。
例えばトレース結果169は、プログラム実行時に変数xと変数yとがともに5であったことを示しており、第1の実行パスが削除され第2の実行パスが残るため、(1)&(2)&(4)から不具合発生条件を算出すればよい。
不具合箇所検出部113は、実行パス削減部112が削減して残った実行パスについて記号実行を行い、不具合が発生する関数と不具合発生条件とを求める。記号実行の対象となる関数は、関数実行パスの終点となる関数から始めて実行パスの上流に向かってもよいし、逆向きでもよい。
≪不具合分析処理≫
図9は、本実施形態に係る不具合分析処理のフローチャートである。
ステップS21において関数仕様取得部111は、実行パス情報420(図1参照)、関数仕様書470、トレース処理付きソースコード440、および実行ログ460を取得する。関数仕様取得部111は、取得した関数仕様書470と実行ログ460とを関数仕様データベース150と実行ログデータベース160とにそれぞれ格納する。また、関数仕様取得部111は、実行パス情報420に含まれる関数実行パスおよびステップ実行パスを関数実行パスデータベース130および実行パスデータベース140にそれぞれ格納する。
ステップS22において実行パス削減部112は、実行ログデータベース160に含まれるトレース結果を取得する。
ステップS23において実行パス削減部112は、ステップS22で取得したトレース結果ごとにステップS24を繰り返す処理を開始する。
ステップS24において実行パス削減部112は、トレース結果に含まれる変数結果を参照して条件分岐で複数に分かれた実行パスのなかで通っていない(実行されなかった、到達していない)ステップ実行パスを特定して、実行パスデータベース140から削除する。
ステップS25において不具合箇所検出部113は、実行パス削減部112が削減して残った実行パスについて記号実行を行い、不具合が発生する関数と不具合発生条件とを算出する。算出された不具合発生条件は、不具合分析結果480として出力される。
図10は、本実施形態に係る不具合分析結果画面710の画面構成図である。不具合分析結果画面710の左側には、関数barのソースコード表示領域711、および関数fooのソースコード表示領域712が配置されている。右側には、関数barの引数の仕様表示領域715、戻り値の仕様表示領域717、不具合発生条件の表示領域716、および不具合発生内容の表示領域718が配置されている。ソースコード表示領域711,712では、実行パスが反転表示されている。不具合発生条件の表示領域716、および不具合発生内容の表示領域718の左近傍には警告マークが表示されており、注目を促すようになっている。
不具合分析結果画面710を参照することで、開発者は不具合の内容(不具合発生内容の表示領域718参照)、不具合が発生する条件(不具合発生条件の表示領域716参照)、不具合発生の経過(反転表示された実行パス参照)を容易に把握することができる。延いては、開発者は不具合対策を効率よく進めることができるようになる。
≪不具合分析システムの特徴≫
トレース処理追加装置200はソースコード410にトレース処理(Trace文)を追加する。不具合分析装置100は、トレース処理が出力したトレース結果を参照してソースコード410に含まれる実行パスを削減し、残った実行パス(残存実行パス)について記号実行処理を行って、不具合発生条件を算出する。
不具合分析装置100はトレース結果を参照することで、実行パスを削減することができる。実行パスの数は、条件分岐があるごとに倍になる。このため実行パスの数は、関数に含まれる(当該関数が直接/間接に呼び出す関数も含む)条件分岐数のべき乗のオーダーであり、条件分岐数に応じて指数関数的に増える。不具合分析装置100はトレース結果を参照して条件分岐でどちらに分岐に進むかを特定することで、実行パスを大きく削減することができる。続いて不具合分析装置100は、残った実行パスに含まれる関数について引数と戻り値の範囲について仕様と矛盾する不具合条件を算出する。
不具合分析装置100は不具合条件を効率よく算出でき、開発者は不具合条件を参照することで不具合を特定して修正することができる。
トレース処理追加装置200は、通る実行パスが多く呼び出し回数が多いため、不具合発生の頻度が高いと考えられる関数から順にTrace文を挿入する。このようにすることで実行ログのサイズを抑えつつ効率よく不具合発生時の変数情報を取得できるようになる。延いては実行ログのための実機350の記憶容量を抑えることができ、コストを抑制することができる。
≪変形例:トレース処理追加≫
上記した実施形態においてトレース処理追加装置200のトレース箇所決定部212は、通る実行パスが多いノード(関数)ほどTrace文の挿入順位が高いとしている(図6記載のステップS12参照)。トレース箇所決定部212は、不具合発生が多い関数ほどTrace文の挿入順位を高くするようにしてもよい。また、トレース箇所決定部212は、テストを行っていない実行パスへのTrace文の挿入順位を高くするようにしてもよい。
図11は、本実施形態の変形例に係る不具合履歴データベース610のデータ構成である。不具合履歴データベース610は、トレース処理追加装置200の記憶部220に記憶される。不具合履歴データベース610は表形式のデータであって、1つの行(レコード)は1つの不具合発生を示す。レコードは、識別番号611(図11では#と記載)、不具合発生日時612、および発生箇所613の列(属性)を含む。識別番号611は、不具合発生の識別情報である。不具合発生日時612は、不具合が発生した日時である。発生箇所613は、不具合があった関数である。
図11記載の不具合履歴データベース610によると、関数Aで3件、関数Bで2件の不具合が発生している。このため、関数Aおよび関数Bには、まだ見つかっていない不具合がある可能性が高いと推定される。このような推定に基づいてトレース箇所決定部212は、Trace文の挿入順位について、不具合発生が発生した関数を高くするようにしてもよい。トレース箇所決定部212は、不具合発生の回数が多い関数ほど、Trace文の挿入順位を高くするようにしてもよい。このようにしてTrace文の挿入順位を決めることで、不具合発生が多いと思われる関数を通る実行パスを削減できるようになる。
図12は、本実施形態の変形例に係るテスト履歴データベース620のデータ構成である。テスト履歴データベース620は、トレース処理追加装置200の記憶部220に記憶される。テスト履歴データベース620は表形式のデータであって、1つの行(レコード)は1つのテストを示す。レコードは、識別番号621(図12では#と記載)、テスト日時622、および実行パス623の列(属性)を含む。識別番号621は、テストの識別情報である。テスト日時622は、テストを行った日時である。実行パス623は、テストした実行パスである。
テスト済みの実行パスに不具合が含まれている可能性は低く、テストをしていない実行パスに、まだ見つかっていない不具合がある可能性が高いと推定される。このような推定に基づいてトレース箇所決定部212は、Trace文の挿入順位について、テストしていない実行パスを高くするようにしてもよい。このようにしてTrace文の挿入順位を決めることで、不具合発生が多いと思われる実行パスと部分パスを共有する実行パスを削減できるようになる。
上記した実施形態ではトレース箇所決定部212は、実行パス情報420に含まれる関数の呼び出し関係である関数実行パスが多く通る関数から順にTrace文を挿入する候補の関数とする(図6のステップS12参照)。トレース箇所決定部212はステップ実行パスを参照して、実行パスが多く通る条件分岐文から順にTrace文を(当該条件文に前に)挿入する候補としてもよい。関数単位に比べて、より細かい粒度でTrace文の挿入順位を決めることができるようになり、より有用なトレース結果が実行ログに記録され、不具合分析の効率が向上するようになる。
≪変形例:トレース処理≫
上記の実施形態におけるトレース処理(Trace文)は、条件分岐文に含まれる変数の値を実行ログに出力している。不具合分析装置100は、この値を参照して何れの分岐先に分岐したかを判断している。トレース処理は、変数の値を出力する替わりに何れの分岐先に分岐したかを示す情報を出力するようにしてもよい。例えば、条件分岐文の条件式の値(条件の真偽値)を記録するようにしてもよい。
≪変形例:不具合条件≫
上記した実施形態では不具合条件として、不具合分析装置100は関数の引数の範囲を示す論理式と、戻り値の範囲外を示す論理積との論理積を満たす条件(引数の値)を算出している(図8参照)。不具合分析装置100は関数仕様と矛盾(相反)する他の不具合条件を求めてもよい。例えば、関数の引数の範囲を示す論理式と、実行パスのなかで当該関数が直接または間接に呼び出す関数の引数の範囲外を示す論理式との論理積を満たす条件を算出してもよい。例えば図8において、関数barの引数の仕様から求まる関数fooの引数(a+b、a-b)の範囲を示す論理式と、関数fooの引数の仕様で示される論理式の否定との論理積を満たす条件を算出してもよい。
上記した実施形態において記号実行を用いて不具合条件を探す対象の関数は、実行パスに含まれる関数である。実行パスに含まれる関数であって、不具合が多く発生している関数(図11参照)から順に不具合条件を探すようにしてもよい。また、テストをしていない実行パスを含む(図12参照)関数から順に不具合条件を探すようにしてもよい。実行ログ460に異常(エラー)が発生した関数やステップの情報が含まれていれば、不具合分析装置100は当該関数、または当該ステップを含む関数から順に不具合条件を探すようにしてもよい。または、不具合分析装置100の利用者(開発者)が指定した関数について不具合条件を探すようにしてもよい。このように、優先順位を付けて不具合条件を求めることで、より効率的に不具合条件を算出することができる。
前記不具合条件を探す対象は残存実行パスに含まれる関数(メソッド)であったが、加減乗除やインクリメントなどの演算を関数と見なして含めてもよい。例えば不具合箇所検出部113は、変数(変数の型)の仕様を利用して不具合条件を探してもよい。例えば加算について不具合箇所検出部113は、加算の結果が変数の仕様の範囲内であって、桁あふれが発生しないことを条件に不具合条件を探してもよい。また、配列のインデックスとなる変数や式について不具合箇所検出部113は、その値が当該配列の長さに対応していることを条件に不具合条件を探してもよい。
≪その他変形例≫
以上、本発明のいくつかの実施形態について説明したが、これらの実施形態は、例示に過ぎず、本発明の技術的範囲を限定するものではない。例えば、上記した実施形態では、トレース処理追加装置200、および不具合分析装置100の入力として、全ての実行パス情報を含む実行パス情報420がある。トレース処理追加装置200および不具合分析装置100は、ソースコード410またはトレース処理付きソースコード440を分析して実行パスを抽出して、実行パス情報420を不要としてもよい。
不具合分析支援システム10は不具合分析装置100およびトレース処理追加装置200を含んで構成されるが、2つの装置は一体となって1つの装置であってもよい。また、一部の機能部が一体となってもよい。例えば、トレース箇所決定部212とトレース処理追加部213とが一体となってトレース処理追加部となってもよいし、不具合箇所検出部113と記号実行エンジン114とが一体となって不具合箇所検出部となってもよい。
本発明はその他の様々な実施形態を取ることが可能であり、さらに、本発明の要旨を逸脱しない範囲で、省略や置換等種々の変更を行うことができる。これら実施形態やその変形は、本明細書等に記載された発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
10 不具合分析支援システム
100 不具合分析装置(プログラム分析装置)
111 関数仕様取得部(実行パス取得部)
112 実行パス削減部
113 不具合箇所検出部
114 記号実行エンジン
200 トレース処理追加装置
211 ソースコード入出力部
212 トレース箇所決定部(トレース処理追加部)
213 トレース処理追加部
410 ソースコード
420 実行パス情報
430 トレース仕様
440 トレース処理付きソースコード
460 実行ログ
470 関数仕様書
480 不具合分析結果(不具合条件)
500 有向グラフ(実行パス)

Claims (7)

  1. プログラムのなかで順に実行されるステートメントの列である実行パスについて、実行される可能性のある全ての実行パスである全実行パスから、前記プログラムに含まれる条件分岐の分岐先に係る情報を参照して実行されない実行パスを削除する実行パス削減部と、
    前記プログラムに含まれる関数の引数および戻り値の範囲の仕様を取得する関数仕様取得部と、
    前記実行パス削減部が削除した後の残存実行パスに含まれる関数のなかで、前記仕様と矛盾する前記引数の値である不具合条件を算出する不具合箇所検出部と、を備える
    ことを特徴とするプログラム分析装置。
  2. 前記条件分岐の分岐先に係る情報は、前記プログラムの実行時に生成される実行ログに含まれる当該条件分岐で参照される変数の値、および当該条件分岐に含まれる条件式の値の何れかである
    ことを特徴とする請求項1に記載のプログラム分析装置。
  3. 前記不具合条件は、
    前記残存実行パスに含まれる関数のなかで、前記引数の範囲を示す論理式と、前記戻り値の範囲を示す論理式の否定となる論理式との論理積を満足する前記引数および前記戻り値の値である不具合条件、および
    前記残存実行パスに含まれる関数のなかで、前記引数の範囲を示す論理式と、前記残存実行パスのなかで当該関数が直接または間接に呼び出す被呼び出し関数の引数の範囲を示す論理式の否定となる論理式との論理積を満足する当該関数の引数の値である不具合条件、の何れかである
    ことを特徴とする請求項に記載のプログラム分析装置。
  4. 前記不具合箇所検出部は、前記プログラムの実行時にエラーが発生したステートメントを含む前記残存実行パスを特定して、前記不具合条件を算出する
    ことを特徴とする請求項に記載のプログラム分析装置。
  5. 前記不具合箇所検出部は、不具合条件を算出する関数として過去に不具合が発生した関数を優先して不具合条件を算出する
    ことを特徴とする請求項に記載のプログラム分析装置。
  6. 前記不具合箇所検出部は、不具合条件を算出する関数としてテストが未実施である実行パスを含む関数を優先して不具合条件を算出する
    ことを特徴とする請求項に記載のプログラム分析装置。
  7. プログラム分析装置のプログラム分析方法であって、
    前記プログラム分析装置は、
    プログラムのなかで順に実行されるステートメントの列である実行パスについて、実行される可能性のある全ての実行パスである全実行パスから、前記プログラムに含まれる条件分岐の分岐先に係る情報を参照して実行されない実行パスを削除するステップと、
    前記プログラムに含まれる関数の引数および戻り値の範囲の仕様を取得するステップと、
    前記実行されない実行パスが削除された後の残存実行パスに含まれる関数のなかで、前記仕様と矛盾する前記引数の値である不具合条件を算出するステップと、を実行することを
    特徴とするプログラム分析方法。
JP2021044926A 2021-03-18 2021-03-18 プログラム分析装置、プログラム分析方法およびトレース処理追加装置 Active JP7447044B2 (ja)

Priority Applications (4)

Application Number Priority Date Filing Date Title
JP2021044926A JP7447044B2 (ja) 2021-03-18 2021-03-18 プログラム分析装置、プログラム分析方法およびトレース処理追加装置
PCT/JP2022/005804 WO2022196219A1 (ja) 2021-03-18 2022-02-15 プログラム分析装置、プログラム分析方法およびトレース処理追加装置
EP22770978.9A EP4310682A1 (en) 2021-03-18 2022-02-15 Program analysis device, program analysis method, and tracing process addition device
US18/547,873 US20240143300A1 (en) 2021-03-18 2022-02-15 Program analyzing apparatus, program analyzing method, and trace processing addition apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2021044926A JP7447044B2 (ja) 2021-03-18 2021-03-18 プログラム分析装置、プログラム分析方法およびトレース処理追加装置

Publications (2)

Publication Number Publication Date
JP2022144078A JP2022144078A (ja) 2022-10-03
JP7447044B2 true JP7447044B2 (ja) 2024-03-11

Family

ID=83322252

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2021044926A Active JP7447044B2 (ja) 2021-03-18 2021-03-18 プログラム分析装置、プログラム分析方法およびトレース処理追加装置

Country Status (4)

Country Link
US (1) US20240143300A1 (ja)
EP (1) EP4310682A1 (ja)
JP (1) JP7447044B2 (ja)
WO (1) WO2022196219A1 (ja)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013149164A (ja) 2012-01-20 2013-08-01 Hitachi Automotive Systems Ltd ソフトウェア検証支援装置、ソフトウェア検証支援方法、ソフトウェア検証支援プログラム
US20180114026A1 (en) 2016-10-25 2018-04-26 Nanjing University Method and system automatic buffer overflow warning inspection and bug repair

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013149164A (ja) 2012-01-20 2013-08-01 Hitachi Automotive Systems Ltd ソフトウェア検証支援装置、ソフトウェア検証支援方法、ソフトウェア検証支援プログラム
US20180114026A1 (en) 2016-10-25 2018-04-26 Nanjing University Method and system automatic buffer overflow warning inspection and bug repair

Also Published As

Publication number Publication date
EP4310682A1 (en) 2024-01-24
WO2022196219A1 (ja) 2022-09-22
JP2022144078A (ja) 2022-10-03
US20240143300A1 (en) 2024-05-02

Similar Documents

Publication Publication Date Title
US10586053B2 (en) Method for automatically detecting security vulnerability based on hybrid fuzzing, and apparatus thereof
Heger et al. Automated root cause isolation of performance regressions during software development
US9569345B2 (en) Architectural failure analysis
US8386851B2 (en) Functional coverage using combinatorial test design
US20130024847A1 (en) Software test automation systems and methods
US20080256393A1 (en) Detecting unexpected impact of software changes using coverage analysis
US20160321586A1 (en) Selecting tests for execution on a software product
US20170010957A1 (en) Method for Multithreaded Program Output Uniqueness Testing and Proof-Generation, Based on Program Constraint Construction
Herzig Using pre-release test failures to build early post-release defect prediction models
Ribeiro et al. Evaluating data-flow coverage in spectrum-based fault localization
Caglayan et al. Usage of multiple prediction models based on defect categories
JPWO2013058393A1 (ja) 異常検出装置、プログラム、及び、方法
US9404972B2 (en) Diagnosis and debug with truncated simulation
Chatelain et al. VeriTracer: Context-enriched tracer for floating-point arithmetic analysis
US11163674B1 (en) System and method for identifying a faulty component in a spectrum ambiguity group
KR20190128457A (ko) 대상 프로그램에 포함된 대상 함수를 테스트하는 방법 및 장치
JP7447044B2 (ja) プログラム分析装置、プログラム分析方法およびトレース処理追加装置
US10579761B1 (en) Method and system for reconstructing a graph presentation of a previously executed verification test
Jayakumar et al. Property-based fault injection: A novel approach to model-based fault injection for safety critical systems
Vesra A study of various static and dynamic metrics for open source software
Bernardi et al. Facilitating fault-simulation comprehension through a fault-lists analysis tool
Stratan et al. Diagnosing Violations of Time-based Properties Captured in iCFTL
Zhyhulin et al. Combined method of prioritization and automation of software regression testing
Lübke Selecting and prioritizing regression test suites by production usage risk in time-constrained environments
CN114153750B (zh) 代码检查方法及装置、代码编写方法、电子设备

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20230221

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20231219

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20240129

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20240213

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20240228

R150 Certificate of patent or registration of utility model

Ref document number: 7447044

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150