(57)【要約】【課題】エラー検出が改善されたソフトウェアプログラム解析方法等を提供する。【解決手段】方法６００は、ソフトウェアプログラム６０２を中間表現へとコンパイルすること６０６を含む。方法６００は、中間表現において、チェックパターン６０４におけるパターンと整合する命令を見つけること６０８を更に含む。方法６００は、チェックパターンにおいて特定されるアクションに従って命令が変更されるインストルメントされた中間表現を生成すること６１０を更に含む。方法６００は、インストルメントされた中間表現を記号的に実行すること６１２を更に含む。【選択図】図６
2014219969.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアプログラムを解析する方法であって、
ソフトウェアプログラムを中間表現へとコンパイルし、
前記中間表現において、チェックパターンにおけるパターンと整合する命令を見つけ、
前記チェックパターンにおいて特定されるアクションに従って前記命令が変更されるインストルメントされた中間表現を生成し、
前記インストルメントされた中間表現を記号的に実行する
方法。
【請求項２】
前記チェックパターンにおいて特定されるアクションに従って前記命令が変更されるインストルメントされた中間表現を生成することは、前記中間表現における前記命令を、前記チェックパターンに含まれる差し替え用命令により置換することを含む、
請求項１に記載の方法。
【請求項３】
前記差し替え用命令は、エラーレポートへの呼び出しを含む、
請求項２に記載の方法。
【請求項４】
前記パターンは、２又はそれ以上の引数の間の関係を定義し、
前記アクションは、条件と、
前記命令が前記パターンによって特定される前記関係を有する２又はそれ以上の引数を含み、且つ
前記条件が満たされる
場合に前記中間表現における前記命令を置換する差し替え用命令とを特定する、
請求項１に記載の方法。
【請求項５】
前記２又はそれ以上の引数は、第１の引数及び第２の引数を含み、
前記パターンは、前記第１の引数が前記第２の引数でメモリに格納されることを含み、
前記条件は、前記第２の引数がゼロに等しいことを含み、
前記差し替え用命令は、ヌルポインタアクセスレポートへの呼び出しを含む、
請求項４に記載の方法。
【請求項６】
前記２又はそれ以上の引数は、第１の引数、第２の引数、及び第３の引数を含み、
前記パターンは、前記第３の引数を生成するよう前記第１の引数を前記第２の引数で割り算することを含み、
前記条件は、前記第２の引数がゼロに等しいことを含み、
前記差し替え用命令は、ゼロ除算レポートへの呼び出しを含む、
請求項４に記載の方法。
【請求項７】
前記条件は、ユーザによって定義される条件を含み、前記差し替え用命令は、前記ユーザによって定義されるレポートへの呼び出しを含む、
請求項４に記載の方法。
【請求項８】
更に、前記インストルメントされた中間表現の記号的実行に基づきレポートを生成し、該レポートは、前記ソフトウェアプログラム内の１又はそれ以上のエラーを示す、
請求項１に記載の方法。
【請求項９】
更に、
複数のチェックパターンのうちの対応する１つにおいて夫々含まれる複数のパターンのいずれかに整合する命令を前記中間表現から探し、
前記複数のチェックパターンのうちの対応する１つに整合する夫々の命令について、前記複数のチェックパターンのうちの対応する１つにおいて特定されるアクションに従って前記中間表現からの対応する命令を変更し、
前記複数のパターンのいずれかに整合する命令を前記中間表現から探す前に、前記複数のチェックパターンの１つとして含めるよう利用可能なチェックパターンの組から少なくとも第１のチェックパターンを選択するのに有効なユーザ入力を受け取る
請求項１に記載の方法。
【請求項１０】
少なくとも前記第１のチェックパターンを選択するのに有効なユーザ入力を受け取る前に、更に、前記第１のチェックパターンを定義するのに有効なユーザ入力を受け取る
請求項９に記載の方法。
【請求項１１】
ソフトウェアプログラムを解析するシステムであって、
処理装置と、
ソフトウェアプログラムを中間表現へとコンパイルするよう前記処理装置によって実行可能なコンパイラと、前記中間表現においてチェックパターンにおけるパターンと整合する命令を見つけ、前記チェックパターンにおいて特定されるアクションに従って前記命令が変更されるインストルメントされた中間表現を生成するよう前記処理装置によって実行可能なアサーション・インストルメンテーションモジュールとを記憶する非一時的なコンピュータ可読媒体と、
前記インストルメントされた中間表現を記号的に実行するよう前記処理装置によって実行可能な記号的実行モジュールと
を有するシステム。
【請求項１２】
前記中間表現における前記命令を置換する前記チェックパターンに含まれる差し替え用命令は、エラーレポートへの呼び出しを含む、
請求項１１に記載のシステム。
【請求項１３】
前記パターンは、２又はそれ以上の引数の間の関係を定義し、
前記アクションは、条件と、
前記命令が前記パターンによって特定される前記関係を有する２又はそれ以上の引数を含み、且つ
前記条件が満たされる
場合に前記中間表現における前記命令を置換する差し替え用命令とを特定する、
請求項１１に記載のシステム。
【請求項１４】
前記２又はそれ以上の引数は、第１の引数及び第２の引数を含み、
前記パターンは、前記第１の引数が前記第２の引数でメモリに格納されることを含み、
前記条件は、前記第２の引数がゼロに等しいことを含み、
前記差し替え用命令は、ヌルポインタアクセスレポートへの呼び出しを含む、
請求項１３に記載のシステム。
【請求項１５】
前記２又はそれ以上の引数は、第１の引数、第２の引数、及び第３の引数を含み、
前記パターンは、前記第３の引数を生成するよう前記第１の引数を前記第２の引数で割り算することを含み、
前記条件は、前記第２の引数がゼロに等しいことを含み、
前記差し替え用命令は、ゼロ除算レポートへの呼び出しを含む、
請求項１３に記載のシステム。
【請求項１６】
ソフトウェアプログラムを解析する動作を実行するよう処理装置によって実行されるコンピュータ命令を記憶する非一時的なコンピュータ可読媒体であって、
前記動作は、
ソフトウェアプログラムを中間表現へとコンパイルし、
前記中間表現において、チェックパターンにおけるパターンと整合する命令を見つけ、
前記チェックパターンにおいて特定されるアクションに従って前記命令が変更されるインストルメントされた中間表現を生成し、
前記インストルメントされた中間表現を記号的に実行する
ことを含む、非一時的なコンピュータ可読媒体。
【請求項１７】
前記チェックパターンにおいて特定されるアクションに従って前記命令が変更されるインストルメントされた中間表現を生成することは、前記中間表現における前記命令を、前記チェックパターンに含まれる差し替え用命令により置換することを含む、
請求項１６に記載の非一時的なコンピュータ可読媒体。
【請求項１８】
前記動作は、前記インストルメントされた中間表現の記号的実行に基づきレポートを生成することを更に含み、該レポートは、前記ソフトウェアプログラム内の１又はそれ以上のエラーを示す、
請求項１６に記載の非一時的なコンピュータ可読媒体。
【請求項１９】
前記動作は、
複数のチェックパターンのうちの対応する１つにおいて夫々含まれる複数のパターンのいずれかに整合する命令を前記中間表現から探し、
前記複数のチェックパターンのうちの対応する１つに整合する夫々の命令について、前記複数のチェックパターンのうちの対応する１つにおいて特定されるアクションに従って前記中間表現からの対応する命令を変更し、
前記複数のパターンのいずれかに整合する命令を前記中間表現から探す前に、前記複数のチェックパターンの１つとして含めるよう利用可能なチェックパターンの組から少なくとも第１のチェックパターンを選択するのに有効なユーザ入力を受け取る
ことを更に含む、請求項１６に記載の非一時的なコンピュータ可読媒体。
【請求項２０】
前記動作は、少なくとも前記第１のチェックパターンを選択するのに有効なユーザ入力を受け取る前に、前記第１のチェックパターンを定義するのに有効なユーザ入力を受け取ることを更に含む、
請求項１９に記載の非一時的なコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本願で論じられる実施形態は、プログラム可能な記号的実行に基づく動的チェッカーに関する。
【背景技術】
【０００２】
動的チェッカーは、２、３例を挙げると、アサーションの不成功又は違反、メモリエラー、及びゼロ除算エラーのようなソフトウェアプログラムにおける様々な種類のエラーの存在を確認するために使用される。動的チェッカー機能を備える一般的なツールの例には、幾つかのメモリアナライザ、プロファイラ、及びカバレッジアナライザがある。
【０００３】
典型的な実施において、動的チェッカーは、１又はそれ以上の具象な（concrete）入力を含むテストスイートを用いてソフトウェアプログラムを実行することによって、ソフトウェアプログラムを解析する。具象な入力は、ユーザによって手動で特定されて提供される。エラーを検出するために、ユーザは、エラーをトリガする具象な入力を提供する必要がある。然るに、ソフトウェアプログラムにおける十分に多くのパスを訓練し且つまれなバグを捕らえる高品質のテストスイートを保持することは困難である。
【０００４】
記号的実行は、ソフトウェアプログラムを動的に解析するための技術である。記号的実行は、実際のデータに代えてシンボリック値を入力値として使用し、プログラム変数の値をシンボリック表現として表す。結果として、記号的に実行されるソフトウェアプログラムによって計算される出力は、シンボリック入力の関数として表される。記号的実行により、ソフトウェアプログラム内の各パスは記号的に実行されてよい。
【０００５】
幾つかの動的チェッカーは記号的実行を実施し、記号的実行に基づく動的チェッカーと呼ばれることがある。従来の記号的実行に基づく動的チェッカーは、ヌルポインタエラー及び境界外（out-of-bound）アクセスエラーを含む単純なメモリエラーの検出のような、限られた欠陥検出を有する。更に、従来の記号的実行に基づく動的チェッカーにおける検出可能な欠陥のタイプは、検出される欠陥のタイプをユーザが容易に変更することができないようにハードコーディングされる。
【０００６】
本願で請求される対象は、如何なる欠点も解消し又は先に記載されたような環境においてのみ動作する実施形態に制限されない。むしろ、この背景は、本願で記載される幾つかの実施形態が実施され得る一例としての技術範囲を説明するためにのみ提供される。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本発明は、エラー検出が改善された、ソフトウェアプログラムを解析する方法及びシステム並びに非一時的なコンピュータ可読媒体を提供することを目的とする。
【課題を解決するための手段】
【０００８】
実施形態の一態様に従って、ソフトウェアプログラムを解析する方法は、ソフトウェアプログラムを中間表現へとコンパイルすることを含む。方法は、中間表現において、チェックパターンにおけるパターンと整合する命令を見つけることを更に含む。方法は、チェックパターンにおいて特定されるアクションに従って命令が変更されるインストルメントされた中間表現を生成することを更に含む。方法は、インストルメントされた中間表現を記号的に実行することを更に含む。
【０００９】
本願で記載される実施形態の目的及び利点は、少なくとも、特に特許請求の範囲において指摘される要素、特徴及び組み合わせによって、実現され達成されるであろう。
【００１０】
上記の概要及び下記の詳細な説明はいずれも例示及び説明のためであり、請求される発明の限定でないことが理解されるべきである。
【発明の効果】
【００１１】
本願発明の実施形態によれば、具象入力を手動入力することに伴う時間及び労力を軽減し且つ全てのエラーが特定される可能性を改善するように具象入力を供給することなしにソフトウェアプログラムを解析することが可能となる。
【図面の簡単な説明】
【００１２】
【図１】例となる関数、対応するテスト関数、及び従来の動的チェッカーによって生成される対応するエラーレポートを表す。
【図２】図１の例となる関数、及び記号的実行に基づく動的チェッカーによって生成される対応するエラーレポートを表す。
【図３】ソフトウェアプログラムを解析するシステムの例のブロック図である。
【図４】図３のシステムで実施され得るチェックパターンの様々な例を表す。
【図５】記号的実行に基づく動的チェッカーを用いてソフトウェアプログラムを解析する処理フローを概略的に表す。
【図６】記号的実行に基づく動的チェッカーを用いてソフトウェアプログラムを解析する方法の例のフローチャートである。
【図７】記号的実行に基づく動的チェッカーを用いてソフトウェアプログラムを解析するよう配置されるコンピュータ装置の例を表すブロック図である。
【発明を実施するための形態】
【００１３】
例となる実施形態は、添付の図面の使用を通じて、更なる特異性及び詳細を伴って記載及び説明されるであろう。
【００１４】
図１は、例となる関数１０２と、対応するテスト関数１０４と、従来の動的チェッカー１０８によって生成される対応するエラーレポート１０６とを表す。より詳細に、例となる関数１０２は、エラーを試験されているソフトウェアプログラムの部分であってよく、“func.c.”と呼ばれ得る。テストスイート（図示せず。）は、関数１０２を試験するためにユーザによって手動入力された様々な具象入力を含む。テスト関数１０４は、関数１０２へ送られるべき０、１００及び２００の値を含む具象入力を含み、“test.c.”と呼ばれ得る。関数１０２は２つの“if”記述を含むので、テスト関数１０４は、関数１０２における全ての可能なパスをトラバースするよう３つの具象入力を含む。
【００１５】
動作において、従来の動的チェッカー１０８は、引数として具象入力の夫々により関数１０２を呼び出すことを含め、テスト関数１０４を実行する。func(0)がテスト関数１０４によって呼び出される場合に、関数１０２の３行目にある第１の“if”記述はスキップされ、５行目にある第２の“if”記述から関数が実行される。func(0)は、第２の“if”記述の実行は、第１の“if”記述を実行せずに、未割り当てメモリを自由にするので、メモリエラーを引き起こす。然るに、従来の動的チェッカー１０８は、エラー（例えば、“Mismatched  free()”）と、エラーが起こる関数１０２の６行目（例えば、“at  func.c:6”）と、エラーを引き起こしたテスト関数１０４の２行目（例えば、“by  text.c.:2”）とを特定するエラーレポート１０６を生成する。
【００１６】
func(100)及びfunc(200)もテスト関数１０４によって呼び出され、エラーレポート１０６から、func(200)がメモリリークエラーをもたらすことが分かる。
【００１７】
上記の例によって例示されるように、比較的簡単な関数１０２の全てのパスを実行し且つまれなバグ捕らえるには、３つの適切に選択された具象入力を要する。そのような具象入力は、通常は、ユーザ、例えば、関数１０２のプログラマによって手動で特定される。より複雑な関数及び／又は多数の関数を呼び出すプログラムに関し、全てのパスを実行し及び／又は全てのまれなバグを捕らえるよう十分且つ適切な具象入力を特定することは、複雑であり、時間がかかり、及び／又はユーザにとって間違いを起こしやすいことがある。
【００１８】
然るに、本願で論じられる幾つかの実施形態は、プログラム可能な記号的実行に基づく動的チェッカーに関する。幾つかの実施形態において、プログラム可能な記号的実行に基づく動的チェッカーは、具象入力を供給することなしにソフトウェアプログラムを解析して、具象入力を手動入力することに伴う時間及び労力を軽減し且つ全てのエラーが特定される可能性を改善するよう構成されてよい。
【００１９】
本発明の実施形態は、添付の図面を参照して説明されるであろう。
【００２０】
図２は、図１の例となる関数１０２と、本願で記載される少なくとも１つの実施形態に従って配置される記号的実行に基づく動的チェッカー２０２（以降「チェッカー２０２」）によって生成される対応するエラーレポート２０４とを表す。概して、チェッカー２０２は、１又はそれ以上のパターンに従ってアサーションを挿入することによって、対象のプログラム、例えば、関数１０２をインストルメントするよう構成されてよい。パターンは、デフォルトのパターン及び／又はユーザによって特定されるパターンを含んでよい。幾つかの実施形態において、インストルメンテーションは、対象のプログラムのコンパイルされたバージョンのような、対象のプログラムの中間表現に対して実行される。然るに、インストルメンテーションは言語非依存であってよい。
【００２１】
実施例において、例えば、チェッカー２０２は、関数１０２又は関数１０２を含むソフトウェアプログラムを中間表現へとコンパイルしてよい。チェッカー２０２は、中間表現において、対応するチェックパターンにおけるパターンと整合する命令を探して見つけてよい。チェッカー２０２は、対応するチェックパターンにおいて特定されるアクションに従って、整合した命令が変更されるインストルメントされた中間表現を生成してよい。例えば、命令は、以下で更に詳細に記載されるように対応するエラーレポートへの呼び出しを含む差し替え用命令によって置換されてよい。チェッカー２０２は次いで、インストルメントされた中間表現を記号的に実行してよく、関数１０２内、すなわち、より一般的には、対応するソフトウェアプログラム内の１又はそれ以上のエラーを示すエラーレポート２０４のようなレポートを生成してよい。
【００２２】
図３は、本願で記載される少なくとも１つの実施形態に従って配置される、ソフトウェアプログラムを解析する例となるシステム３００のブロック図である。システム３００は、本願記載されるようにソフトウェアプログラムを解析するようソフトウェアエディタに含まれてよく、及び／又は該ソフトウェアエディタと協働してよい。システム３００は、記号的実行に基づく動的チェッカー３０２（以降「チェッカー３０２」）と、チェックパターンデータベース３０４とを有する。チェッカー３０２は、図２のチェッカー２０２の実施例である。
【００２３】
チェッカー３０２は、コンパイラ３０６と、アサーション・インストルメンテーションモジュール３０８と、記号的実行モジュール３１０とを有してよい。コンパイラ３０６と、アサーション・インストルメンテーションモジュール３０８と、記号的実行モジュール３１０とを有するチェッカー３０２は、ソフトウェア、ハードウェア、又はそれらの何らかの組み合わせにおいて実施されてよい。実施例において、コンパイラ３０６、アサーション・インストルメンテーションモジュール３０８及び記号的実行モジュール３１０は、本願で記載される機能及び動作を実行するよう処理装置によって実行される、メモリのような非一時的なコンピュータ可読媒体に記憶されたコンピュータ命令として実施される。然るに、図３に表されていないとしても、システム３００は、非一時的なコンピュータ可読媒体、処理装置、及び／又は他のハードウェアを更に有してよい。
【００２４】
システム３００は、全体として高度なソフトウェアコードを有するソフトウェアプログラム３１２を受け取るよう構成されてよい。ソフトウェアプログラム３１２の高度なソフトウェアコードは概して、テキストのような、ヒトが読める形式におけるソフトウェアコードを含んでよい。例えば、ソフトウェアプログラム３１２の高度なソフトウェアコードは、Ｐｅｒｌ、Ｃ、Ｃ＋＋、Ｃ＃、Ｊａｖａ(登録商標)、ＪａｖａＳｃｒｉｐｔ(登録商標)、Ｐｈｙｔｈｏｎ、Ｒｕｂｙ、アセンブリ言語、Ｆｏｒｔｒａｎ、ＣＯＢＯＬ、ＳＱＬ、及びＰＨＰを含む（がこれらに限られない）様々な種類のソフトウェアプログラミング言語のいずれか１つにおいて記述されてよい。ソフトウェアプログラム３１２は、ソフトウェアエディタから、又は何らかの他のソースから受け取られてよい。
【００２５】
コンパイラ３０６は、ソフトウェアプログラム３１２を受け取り、それを中間表現３１４へとコンパイルするよう構成されてよい。ソフトウェアプログラム３１２をコンパイルすることは概して、ソフトウェアプログラム３１２をパースすること、パースされたソフトウェアプログラム３１２が構文的に正しいかどうかを決定すること、及びパースされた構文的に正しいソフトウェアプログラム３１２を中間表現３１４へ変換することを含んでよい。中間表現３１４は概して、バイト、コード、オブジェクトコード、マシンコード、仮想命令、ＬＬＶＭ、及びマシンコードの他の中間表現を含む（がこれらに限られない）機会により読み出し可能な形式におけるソフトウェアコードを含んでよい。
【００２６】
アサーション・インストルメンテーションモジュール３０８は、中間表現３１４を受け取り、中間表現３１４をインストルメントするよう構成されてよい。特に、アサーション・インストルメンテーションモジュール３０８は、中間表現３１４において、対応するチェックパターン３１６における対応するパターンと夫々整合する１又はそれ以上の命令を見つけるよう構成されてよい。アサーション・インストルメンテーションモジュール３０８は更に、対応するチェックパターン３１６において特定されるアクションに従って、整合した命令が夫々変更されるインストルメントされた中間表現３１８を生成するよう構成されてよい。チェックパターン３１６に関する更なる詳細は以下で記載される。
【００２７】
記号的実行モジュール３１０は、インストルメントされた中間表現３１８をアサーション・インストルメンテーションモジュール３０８から受け取り、インストルメントされた中間表現３１８を記号的に実行するよう構成されてよい。幾つかの実施形態において、インストルメントされた中間表現３１８は、シンボリック形式であってよく、従って、記号的実行モジュール３１０による記号的実行の準備ができている。代替的に、記号的実行モジュール３１０は、インストルメントされた中間表現３１８の記号的実行の前又はそれと同時に、インストルメントされた中間表現３１８をシンボリック形式へと変換してよい。
【００２８】
インストルメントされた中間表現３１８を記号的に実行することによって、記号的実行モジュール３１０は、インストルメントされた中間表現３１８内のパスの一部、大部分、又は全てを解析してよい。インストルメントされた中間表現３１８内のパスの解析に基づき、記号的実行モジュール３１０は、インストルメントされた中間表現３１８内でエラーを特定するよう構成されてよい。エラーは、ユーザにより定義されたエラーに加えて、とりわけ、論理エラー、ヌルポインタアクセスのような不正なメモリ位置のアクセス、初期化されていないポインタ、ゼロ除算、境界外メモリアクセス、メモリが割り当てられるが決して割り当てを解除されないメモリリーク、未割り当てメモリの自由化を含んでよい。特定されたエラーは、レポート３２０において集められて出力されてよい。幾つかの実施形態において、レポート３２０は、ソフトウェアプログラム３１０を開発した及び／又は試験しているユーザ、例えば、プログラマに提示されてよい。例えば、レポート３２０又はその部分は、ソフトウェアエディタのステータスウィンドウに表示されてよい。
【００２９】
上述されたように、チェックパターン３１６の夫々は、パターン及びアクションの両方を含んでよい。概して、パターンは２又はそれ以上の引数の間の関係を定義し、一方、アクションは条件を特定する。アクションは更に、命令がパターンによって特定される関係を有する２又はそれ以上の引数を含み且つ条件が満たされる場合に、中間表現３１４における命令を置換する差し替え用命令を特定してよい。
【００３０】
図４は、本願で記載される少なくとも１つの実施形態に従って配置される図３のシステム３００で実施され得るチェックパターン４００の様々な例を表す。チェックパターン４００はチェックパターン４００Ａ〜４００Ｄを含む。
【００３１】
チェックパターン４００Ａは、ヌルポインタアクセスを確認するよう構成されてよい。然るに、チェックパターン４００Ａは、引数%1及び%2の間の関係を定義するパターン“store  %1,%2”を含む。チェックパターン４００Ａにおいて、関係は、引数%1を引数%2でメモリに記憶することを含む。チェックパターン４００Ａはまた、条件“if(%2==0)”と、エラーレポート呼び出し“call  report_null_ptr_access”を含む差し替え用命令“%i”とを両方とも特定するアクション（Action:）を含む。代替的に、又は追加的に、差し替え用命令は、差し替え用命令において単に代替物となるいずれかのジェネリック型引数、例えば、%1、%2が、整合する命令において使用される対応する特定の引数によって満たされるところの条件及びエラーレポート呼び出しの両方を含んでよい。この及び他のチェックパターンに関して、整合する命令を差し替え用命令により置換することは、この例における“call  report_null_ptr_access”のような特定のエラーレポートへの呼び出しを含む差し替え用命令の記号的実行が、図３のレポート３２０のような結果として得られるレポートにおける包含のために特定のエラーを報告する、結果として得られるインストルメントされた中間表現の記号的実行を可能にする。例えば、結果として得られるレポートにおける包含のために特定のエラーを報告することは、中間表現の、及び／又はエラーを引き起こしたインストルメントされた中間表現の、呼び出されるエラーレポートに基づきエラーのタイプを報告すること、及び／又はソフトウェアプログラムの対応する行を報告することを含んでよい。
【００３２】
チェックパターン４００Ｂは、ゼロ除算エラーを確認するよう構成されてよい。チェックパターン４００Ｂは、引数%1、%2及び%3の間の関係を定義するパターン“%3=fdiv%1,%2”を含む。チェックパターン４００Ｂにおける関係は、引数%3を生成するよう引数%1が引数%1で割り算されることを含む。チェックパターン４００Ｂは、条件“if(%2==0)”と、エラーレポート呼び出し“call  report_div_by_zero”を含む差し替え用命令“%i”とを両方とも特定するアクション（Action:）を更に含む。代替的に、又は追加的に、差し替え用命令は、差し替え用命令において単に代替物となるいずれかのジェネリック型引数、例えば、%1、%2が、整合する命令において使用される対応する特定の引数によって満たされるところの条件及びエラーレポート呼び出しの両方を含んでよい。
【００３３】
チェックパターン４００Ａ及び４００Ｂは、ヌルポインタアクセスエラー及びゼロ除算エラーを夫々含む一般的な又は既知のエラーを検出するために、本願で記載される実施形態に従って使用され得るチェックパターンの例である。本願で記載されるような適切なチェックパターンを用いて検出され得る一般的な又は既知のエラーの例には、とりわけ、論理エラー、ヌルポインタアクセスのような不正なメモリ位置のアクセス、初期化されていないポインタ、ゼロ除算、境界外メモリアクセス、メモリが割り当てられるが決して割り当てを解除されないメモリリーク、未割り当てメモリの自由化があるが、これらに限られない。
【００３４】
代替的に、又は追加的に、チェックパターンは、ユーザにより定義されるエラーを検出するために、本願で記載される実施形態に従って使用されてよい。チェックパターン４００Ｃ及び４００Ｄは、ユーザにより定義されるエラーを検出するために使用され得るチェックパターンの例である。特に、チェックパターン４００Ｃは、計算結果の範囲が閾値に満たないかどうかを検出するために使用されてよく、チェックパターン４００Ｄは、コードの一部が閾回数以内で実行されるかどうかを検出するために使用されてよい。他のチェックパターンが、他のユーザ定義エラーを検出するために定義されて使用されてよい。
【００３５】
チェックパターン４００Ｃ及び４００Ｄの更に詳細な説明がここで実例として与えられる。チェックパターン４００Ｃは、引数%1、%2及び%3の間の関係を定義するパターン“%3=(add|sub|mul)%1,%2”を含む。チェックパターン４００Ｃにおける関係は、引数%3を生成するよう引数%2が引数%1に足し算されるか、引数%1から引き算されるか、又は引数%1を掛け算されることを含む。チェックパターン４００Ｃは、条件“if(%3>100)”と、エラーレポート呼び出し“call  report_out_of_range”を含む差し替え用命令“%i”とを両方とも特定するアクション（Action:）を更に含む。代替的に、又は追加的に、差し替え用命令は、差し替え用命令において単に代替物となるいずれかのジェネリック型引数、例えば、%1、%2が、整合する命令において使用される対応する特定の引数によって満たされるところの条件及びエラーレポート呼び出しの両方を含んでよい。このように、チェックパターン４００Ｃは、ユーザが、計算結果の範囲がこの例では１００の閾値に満たないかどうかを検出することを可能にする。
【００３６】
チェックパターン４００Ｄは、既に記載されたチェックパターン４００Ｃと同じパターンを含む。チェックパターン４００Ｄは、条件“if(user_count>=10)”と、エラーレポート呼び出し“call  report_many_executions”を含む差し替え用命令“%i”とを両方とも特定するアクション（Action:）を更に含む。代替的に、又は追加的に、差し替え用命令は、差し替え用命令において単に代替物となるいずれかのジェネリック型引数、例えば、%1、%2が、整合する命令において使用される対応する特定の引数によって満たされるところの条件及びエラーレポート呼び出しの両方を含んでよい。このように、チェックパターン４００Ｄは、ユーザが、コードの一部がこの例では１０の閾回数以内で実行されるかどうかを検出することを可能にする。
【００３７】
図４のチェックパターン４００の夫々は、チェックパターン４００Ａにおける“store  %1,%2”、チェックパターン４００Ｂにおける“%3==fdiv%1,%2”、並びにチェックパターン４００Ｃ及び４００Ｄにおける“%3=(add|sub|mul)%1,%2”のような単一のパターンを含む。代替的に、如何なる所与のチェックパターンも、チェックパターンのアクションにおいて特定される対応する条件を評価する前にソフトウェアプログラムの中間表現における命令によって整合される必要がある複数のパターンを含んでよい。それらの及び他の実施形態において、複数のパターンは、セミコロン若しくは他の適切な文字によって分けられてよく、又は別なふうに互いに区別されてよい。次の３行は、同じチェックパターンに全て含まれ得る３つのパターンの例である：
%1=load%2；
%3=(add|sub|mul)%1,%4；及び
store  %3,%5。
上記のパターンは、単なる例示として与えられており、本願で記載される実施形態を制限するよう解釈されるべきではない。例えば、複数のパターンを備えるチェックパターンはわずか２つのパターン、又は３以上のパターンを含んでよい。更に、パターンの夫々は、上記の同じパターン及び／又は何らかの他の所望のパターンを含んでよい。
【００３８】
加えて、図４のチェックパターン４００の夫々は、単一の差し替え用命令“%i”を含む。代替的に、又は追加的に、１又はそれ以上のチェックパターンは複数の差し替え用命令%i1、%i2、・・・、%iNを含んでよい。
【００３９】
図５は、本願で記載される少なくとも１つの実施形態に従って配置される記号的実行に基づく動的チェッカー（以降「チェッカー」）を用いてソフトウェアプログラムを解析する処理フロー５００を概略的に表す。処理フロー５００は、図３のチェッカー３０２との関連で記載される。
【００４０】
チェッカー３０２はソフトウェアプログラム５０２を受け取る。ソフトウェアプログラム５０２は、図３のソフトウェアプログラム３１２の実施例である。コンパイラ３０６は、ソフトウェアプログラム５０２を中間表現５０４へとコンパイルしてよい。中間表現５０４は、図３の中間表現３１４の実施例である。アサーション・インストルメンテーションモジュール３０８は中間表現５０４を受け取り、更に１又はそれ以上のチェックパターン５０６を受け取る。チェックパターン５０６は、図３のチェックパターン３１６の実施例である。
【００４１】
図５に表されているように、チェックパターン５０６は、ヌルポインタアクセスエラーを検出する第１のチェックパターン５０８と、ゼロ除算エラーを検出する第２のチェックパターン５１０を含む。第１のチェックパターン５０８は、“store  %1,%2”のパターン５０８Ａを含み、第２のチェックパターン５１０は、“%3=fdiv%1,%2”のパターン５１０Ａを含む。然るに、アサーション・インストルメンテーションモジュール３０８は、パターン５０８Ａ、５１０Ａのいずれか一方又は両方に整合するあらゆる命令を中間表現５０４から検索する。
【００４２】
例示される実施形態では、アサーション・インストルメンテーションモジュール３０８は、中間表現５０４において、パターン５０８Ａに整合する命令５０４Ａを見つける。然るに、アサーション・インストルメンテーションモジュール３０８は、パターン５０８Ａのアクションにおいて特定される条件５０８Ｂが命令５０４Ａにおける引数のうちの適切な１又はそれ以上によって満足されるかどうかを評価する。特に、例示される実施形態では、アサーション・インストルメンテーションモジュール３０８は、命令５０４Ａにおける第２の引数、すなわち、%ptrがゼロに等しいかどうかを評価する。条件５０８Ｂが満足されない場合は、アサーション・インストルメンテーションモジュール３０８は、同じか又は他のパターンに整合する他の命令を中間表現５０４において探してよい。しかし、中間表現５０４の２行目が%ptrにゼロの値を割り当てるので、条件５０４Ｂは満足される。
【００４３】
このように、アサーション・インストルメンテーションモジュール３０８は、チェックパターン５０８において特定されるアクションに従って命令５０４Ａが変更されるインストルメントされた中間表現５１２を生成する。特に、例示される例では、命令５０４Ａは、インストルメントされた中間表現において当該命令をチェックパターン５０８のアクションにおいて特定される差し替え用命令、すなわち、インストルメントされた中間表現５１２において５１２Ａで表される、条件５０８Ｂ及びエラーレポート呼び出し５０８Ｃの両方を含む差し替え用命令により置換することによって、変更される。図５で表されるように、テキスト５１２Ａは、差し替え用命令に含まれる条件の引数、すなわち、代替物%2が命令５０４において使用される対応する特定の引数、すなわち、%ptrによって満たされるところの、パターン５０８Ａのアクションにおいて特定される差し替え用命令を含む。
【００４４】
図６は、本願で記載される少なくとも１つの実施形態に従って配置される記号的実行に基づく動的チェッカー（以降「チェッカー」）を用いてソフトウェアプログラム６０２を解析する例となる方法６００のフローチャートである。方法６００は、幾つかの実施形態において、図２又は図３のチェッカー２０２又は３０２のようなチェッカーによって実行される。別個のブロックとして表されているとしても、様々なブロックは、所望の実施に依存して、追加のブロックに分けられ、より少ないブロックにまとめられ、又は削除されてよい。方法６００は、入力としてソフトウェアプログラム６０２及び１以上のチェックパターン６０４の両方を受け取ってよい。
【００４５】
方法６００は、ソフトウェアプログラムが中間表現へとコンパイルされるブロック６０６で開始してよい。
【００４６】
ブロック６０８で、中間表現において、チェックパターン６０４の１つにおけるパターンに整合する命令が見つけられる。パターンに整合する命令を見つける前に、方法６００は概して、チェックパターン６０４のうちの１以上の対応するチェックパターンにおける１以上のパターンに整合する命令を中間表現から探すことを含んでよい。
【００４７】
ブロック６１０で、チェックパターン６０４の対応する１つにおいて特定されるアクションに従って命令が変更されるインストルメントされた中間表現が生成される。それらの及び他の実施形態において、チェックパターンにおいて特定されるアクションに従って命令が変更されるインストルメントされた中間表現は、チェックパターンに含まれる差し替え用命令により中間表現における命令を置換することを含んでよい。更に、上述されたように、パターンは、２又はそれ以上の引数の間の関係を定義してよい。アクションは、条件と、命令がパターンによって特定される関係を有する２又はそれ以上の引数を含み且つ条件が満たされる場合に中間表現における命令を置換する差し替え用命令とを特定してよい。
【００４８】
ブロック６１２で、インストルメントされた中間表現は記号的に実行される。
【００４９】
ブロック６１４で、レポート６１６が、インストルメントされた中間表現の記号的実行に基づき生成される。レポートは、ソフトウェアプログラム６０２内の１又はそれ以上のエラーを示してよい。
【００５０】
然るに、本願で記載される幾つかの実施形態は、記号的実行に基づく動的チェッカーについての検出可能な欠陥タイプが、中間表現をインストルメントすることによってプログラムされることを可能にすることができる。代替的に、又は追加的に、本願で記載される幾つかの実施形態は、パターンと対応するアクションとの組において、検出可能な欠陥タイプを表してよい。
【００５１】
当業者には明らかなように、本願で開示されるこの及び他の処理及び方法に関して、そのような処理及び方法において実行される機能は異なる順序で実施されてよい。更に、説明されるステップ及び動作は単に例として提供されており、ステップ及び動作の幾つかは、開示される実施形態の本質から逸脱することなしに、任意であり、より少ないステップ及び動作にまとめられ、又は追加のステップ及び動作に拡張されてよい。
【００５２】
例えば、方法６００は、複数のチェックパターンの対応する１つにおいて夫々含まれる複数のパターンのいずれかと整合する命令を中間表現から探すことを更に含んでよい。パターンの対応する１つと整合する夫々の命令に関し、中間表現からの対応する命令は、チェックパターンの対応する１つにおいて特定されるアクションに従って変更されてよい。加えて、パターンのいずれかと整合する命令を中間表現から探す前に、複数のチェックパターンの１つとして含めるよう利用可能なチェックパターンの組から少なくとも第１のチェックパターンを選択するのに有効なユーザ入力が受け取られてよい。方法６００は、少なくとも第１のチェックパターンを選択するのに有効なユーザ入力を受け取る前に、第１のチェックパターンを定義するのに有効なユーザ入力を受け取ることを更に含んでよい。然るに、本願で記載される幾つかの実施形態は、ユーザが、特定の欠陥を検出し及び／又はソフトウェアプログラムを解析する場合に考慮されるチェックパターンのデータベース若しくは他のリポジトリから１以上のチェックパターンを選択するためのチェックパターンを定義することを可能にする。
【００５３】
本願で記載される幾つかの実施形態は、図６におけるブロック６０６、６０８、６１０、６１２及び／又は６１４のような図６の方法６００に含まれる動作のうちの１又はそれ以上を実行するよう処理装置によって実行可能なコンピュータ命令を記憶した非一時的なコンピュータ可読媒体のような製品、及び／又はその変形を含む。非一時的なコンピュータ可読媒体及び処理装置は、例えば、図３のシステム３００に含まれてよい。
【００５４】
図７は、本願で記載される少なくとも１つの実施形態に従って、記号的実行に基づく動的チェッカー（以降「チェッカー」）７２６を用いてソフトウェアプログラムを解析する用は位置される例となるコンピュータ装置７００を表すブロック図である。コンピュータ装置７００は、例えば、図３のシステム３００に含まれるか又は該システム３００に対応してよい。基本構成７０２において、コンピュータ装置７００は、通常、１又はそれ以上のプロセッサ７０４と、システムメモリ７０６とを有する。メモリバス７０８が、プロセッサ７０４とシステムメモリ７０６との間の通信のために使用されてよい。
【００５５】
所望の構成に依存して、プロセッサ７０４は、マイクロプロセッサ（ＵＰ）、マイクロコントローラ（ＵＣ）、中央演算処理装置（ＣＰＵ）、デジタル信号プロセッサ（ＤＳＰ）、それらの何らかの組み合わせ、又は他の適切な処理装置を含む（がこれらに限られない）如何なるタイプであってもよい。プロセッサ７０４は、レベル１キャッシュ７１０及びレベル２キャッシュ７１２のようなキャッシングの１又はそれ以上のレベルと、プロセッサコア７１４と、レジスタ７１６とを有してよい。プロセッサコア７１４の例には、数値演算ユニット（ＡＵＬ）、浮動小数点演算ユニット（ＦＰＵ）、ＤＳＰコア、又はそれらの何れかの組み合わせがある。また、例となるメモリコントローラ７１８がプロセッサ７０４とともに使用されてよく、あるいは、幾つかの実施において、メモリコントローラ７１８はプロセッサ７０４の内部部品であってよい。
【００５６】
所望の構成に依存して、システムメモリ７０６は、揮発性メモリ（例えば、ＲＡＭ）、不揮発性メモリ（例えば、ＲＯＭ、フラッシュメモリ、等）、又はそれらの何れか組み合わせを含む（がこれらに限られない）如何なるタイプであってもよい。システムメモリ７０６は、ＯＳ７２０と、１又はそれ以上のアプリケーション７２２と、プログラムデータ７２４とを有してよい。アプリケーション７２２は、図６の方法６００に関して記載されるようなソフトウェアプログラムを解析する動作を含む本願で記載される動作又は機能の１又はそれ以上を実行するよう配置されるチェッカー７２６を有してよい。プログラムデータ７２４は、テスト対象及びチェックパターン７２８を含んでよい。テスト対象は、例えば、チェッカー７２６によって解析されているソフトウェアプログラムを含んでよい。テスト対象及びチェックパターン７２８は、テスト対象においてエラーを検出するよう上述されたように解析及び／又は使用されてよい。幾つかの実施形態において、アプリケーション７２２は、図６の方法６００のようなソフトウェアプログラムを解析する方法の実施が本願で記載されるように提供され得るように、ＯＳ７２０でプログラムデータ７２４により動作するよう配置されてよい。
【００５７】
コンピュータ装置７００は、基本構成７０２と他の装置及びインターフェースとの間の通信を助けるよう追加の特徴又は機能及び追加のインターフェースを有してよい。例えば、バス／インターフェースコントローラ７３０が、記憶インターフェースバス７３４を介した基本構成７０２と１以上のデータ記憶装置７３２との間の通信を助けるために使用されてよい。データ記憶装置７３２は、リムーバブル記憶装置７３６、非リムーバブル記憶装置７３８、又はそれらの組み合わせであってよい。リムーバブル記憶装置及び非リムーバブル記憶装置の例には、２、３例を挙げると、フレキシブルディスクドライブ及びハードディスクドライブ（ＨＤＤ）のような磁気ディスク装置、コンパクトディスク（ＣＤ）ドライブ又はデジタルバーサタイルディスク（ＤＶＤ）ドライブのような光ディスクドライブ、ソリッドステートドライブ（ＳＳＤ）、並びにテープドライブがある。コンピュータ記憶媒体の例には、コンピュータ可読命令、データ構造、プログラムモジュール、又は他のデータのような情報の記憶のための何らかの方法又は技術において実施される揮発性及び不揮発性の、リムーバブル及び非リムーバブルの媒体がある。
【００５８】
システムメモリ７０６、リムーバブル記憶装置７３６、及び非リムーバブル記憶装置７３８は、非一時的なコンピュータ可読媒体の例である。非一時的なコンピュータ可読媒体の例には、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリ若しくは他のメモリ技術、ＣＤ−ＲＯＭ、デジタルバーサタイルディスク（ＤＶＤ）若しくは他の光ディスク、磁気カセット、磁気テープ、磁気ディスク記憶若しくは他の磁気記憶装置、又は所望の情報を記憶するために使用されてよく且つコンピュータ装置７００によってアクセスされ得る何らかの他の非一時的な媒体があるが、これらに限られない。如何なるそのような非一時的なコンピュータ可読媒体も、コンピュータ装置７００の部分であってよい。
【００５９】
コンピュータ装置７００は、バス／インターフェースコントローラ７３０を介した様々なインターフェース装置（例えば、出力装置７４２、周辺機器インターフェース７４４、及び通信装置７４６）から基本構成７０２への通信を助けるためのインターフェースバス７４０を更に有してよい。例となる出力装置７４２は、１又はそれ以上のＡ／Ｖポート７５２を介してディスプレイ又はスピーカのような様々な外部装置と通信するよう構成され得るグラフィクス処理ユニット７４８及びオーディオ処理ユニット７５０を含む。例となる周辺機器インターフェース７４４は、１又はそれ以上のＩ／Ｏポート７５８を介して入力装置（例えば、キーボード、マウス、ペン、音声入力装置、タッチ入力装置、等）又は他の周辺機器（例えば、プリンタ、スキャナ、等）のような外部装置と通信するよう構成され得るシリアルインターフェースコントローラ７５４又はパラレルインターフェースコントローラ７５６を含む。例となる通信装置７４６は、１又はそれ以上の通信ポート７６４を介してネットワーク通信リンク上で１又はそれ以上の他のコンピュータ装置７６４と通信するのを助けるよう配置され得るネットワークコントローラ７６０を含む。
【００６０】
ネットワーク通信リンクは、通信媒体の一例であってよい。通信媒体は、通常、搬送波若しくは他の伝送メカニズムのような変調データ信号におけるコンピュータ可読命令、データ構造、プログラムモジュール、又は他のデータによって具現されてよく、如何なる情報伝送媒体も含んでよい。「変調データ信号」は、その特性のうちの１又はそれ以上が信号における情報を符号化するように設定又は変更されている信号であってよい。一例として、制限なしに、通信媒体は、有線ネットワーク又は直接配線接続のような有線媒体と、音響、無線周波数（ＲＦ）、マイクロ波、赤外線、及び頼む千媒体のような無線媒体とを有してよい。本願で使用される語「コンピュータ可読媒体」は、記憶媒体及び通信媒体の両方を含んでよい。
【００６１】
コンピュータ装置７００は、携帯電話機、パーソナルデジタルアシスタント（ＰＤＡ）、パーソナルメディアプレイヤ装置、無線ウェブウォッチ装置、パーソナルヘッドセット装置、特定用途向け装置、又はこれらの機能のいずれかを含む複合型装置のようなスモールフォームファクタのポータブル（又はモバイル）電子機器の一部として実施されてよい。コンピュータ装置７００はまた、ラップトップコンピュータ及び非ラップトップコンピュータの両構造を含むパーソナルコンピュータとして実施されてよい。
【００６２】
本願で挙げられている全ての例及び条件付き言語は、当該技術を促進することに発明者によって寄与された発明及び概念を読む者が理解するのを助ける教示を目的としており、そのような具体的に挙げられている例及び条件に制限されないと解釈されるべきである。本発明の実施形態が詳細に記載されてきたが、様々な変更、置換及び代替が本開示の精神及び適用範囲から逸脱することなしにそれらに対してなされ得ることが理解されるべきである。
【００６３】
上記の実施形態に関し、更に以下の付記を開示する。
（付記１）
ソフトウェアプログラムを解析する方法であって、
ソフトウェアプログラムを中間表現へとコンパイルし、
前記中間表現において、チェックパターンにおけるパターンと整合する命令を見つけ、
前記チェックパターンにおいて特定されるアクションに従って前記命令が変更されるインストルメントされた中間表現を生成し、
前記インストルメントされた中間表現を記号的に実行する
方法。
（付記２）
前記チェックパターンにおいて特定されるアクションに従って前記命令が変更されるインストルメントされた中間表現を生成することは、前記中間表現における前記命令を、前記チェックパターンに含まれる差し替え用命令により置換することを含む、
付記１に記載の方法。
（付記３）
前記差し替え用命令は、エラーレポートへの呼び出しを含む、
付記２に記載の方法。
（付記４）
前記パターンは、２又はそれ以上の引数の間の関係を定義し、
前記アクションは、条件と、
前記命令が前記パターンによって特定される前記関係を有する２又はそれ以上の引数を含み、且つ
前記条件が満たされる
場合に前記中間表現における前記命令を置換する差し替え用命令とを特定する、
付記１に記載の方法。
（付記５）
前記２又はそれ以上の引数は、第１の引数及び第２の引数を含み、
前記パターンは、前記第１の引数が前記第２の引数でメモリに格納されることを含み、
前記条件は、前記第２の引数がゼロに等しいことを含み、
前記差し替え用命令は、ヌルポインタアクセスレポートへの呼び出しを含む、
付記４に記載の方法。
（付記６）
前記２又はそれ以上の引数は、第１の引数、第２の引数、及び第３の引数を含み、
前記パターンは、前記第３の引数を生成するよう前記第１の引数を前記第２の引数で割り算することを含み、
前記条件は、前記第２の引数がゼロに等しいことを含み、
前記差し替え用命令は、ゼロ除算レポートへの呼び出しを含む、
付記４に記載の方法。
（付記７）
前記条件は、ユーザによって定義される条件を含み、前記差し替え用命令は、前記ユーザによって定義されるレポートへの呼び出しを含む、
付記４に記載の方法。
（付記８）
更に、前記インストルメントされた中間表現の記号的実行に基づきレポートを生成し、該レポートは、前記ソフトウェアプログラム内の１又はそれ以上のエラーを示す、
付記１に記載の方法。
（付記９）
更に、
複数のチェックパターンのうちの対応する１つにおいて夫々含まれる複数のパターンのいずれかに整合する命令を前記中間表現から探し、
前記複数のチェックパターンのうちの対応する１つに整合する夫々の命令について、前記複数のチェックパターンのうちの対応する１つにおいて特定されるアクションに従って前記中間表現からの対応する命令を変更し、
前記複数のパターンのいずれかに整合する命令を前記中間表現から探す前に、前記複数のチェックパターンの１つとして含めるよう利用可能なチェックパターンの組から少なくとも第１のチェックパターンを選択するのに有効なユーザ入力を受け取る
付記１に記載の方法。
（付記１０）
少なくとも前記第１のチェックパターンを選択するのに有効なユーザ入力を受け取る前に、更に、前記第１のチェックパターンを定義するのに有効なユーザ入力を受け取る
付記９に記載の方法。
（付記１１）
ソフトウェアプログラムを解析するシステムであって、
処理装置と、
ソフトウェアプログラムを中間表現へとコンパイルするよう前記処理装置によって実行可能なコンパイラと、前記中間表現においてチェックパターンにおけるパターンと整合する命令を見つけ、前記チェックパターンにおいて特定されるアクションに従って前記命令が変更されるインストルメントされた中間表現を生成するよう前記処理装置によって実行可能なアサーション・インストルメンテーションモジュールとを記憶する非一時的なコンピュータ可読媒体と、
前記インストルメントされた中間表現を記号的に実行するよう前記処理装置によって実行可能な記号的実行モジュールと
を有するシステム。
（付記１２）
前記中間表現における前記命令を置換する前記チェックパターンに含まれる差し替え用命令は、エラーレポートへの呼び出しを含む、
付記１１に記載のシステム。
（付記１３）
前記パターンは、２又はそれ以上の引数の間の関係を定義し、
前記アクションは、条件と、
前記命令が前記パターンによって特定される前記関係を有する２又はそれ以上の引数を含み、且つ
前記条件が満たされる
場合に前記中間表現における前記命令を置換する差し替え用命令とを特定する、
付記１１に記載のシステム。
（付記１４）
前記２又はそれ以上の引数は、第１の引数及び第２の引数を含み、
前記パターンは、前記第１の引数が前記第２の引数でメモリに格納されることを含み、
前記条件は、前記第２の引数がゼロに等しいことを含み、
前記差し替え用命令は、ヌルポインタアクセスレポートへの呼び出しを含む、
付記１３に記載のシステム。
（付記１５）
前記２又はそれ以上の引数は、第１の引数、第２の引数、及び第３の引数を含み、
前記パターンは、前記第３の引数を生成するよう前記第１の引数を前記第２の引数で割り算することを含み、
前記条件は、前記第２の引数がゼロに等しいことを含み、
前記差し替え用命令は、ゼロ除算レポートへの呼び出しを含む、
付記１３に記載のシステム。
（付記１６）
ソフトウェアプログラムを解析する動作を実行するよう処理装置によって実行されるコンピュータ命令を記憶する非一時的なコンピュータ可読媒体であって、
前記動作は、
ソフトウェアプログラムを中間表現へとコンパイルし、
前記中間表現において、チェックパターンにおけるパターンと整合する命令を見つけ、
前記チェックパターンにおいて特定されるアクションに従って前記命令が変更されるインストルメントされた中間表現を生成し、
前記インストルメントされた中間表現を記号的に実行する
ことを含む、非一時的なコンピュータ可読媒体。
（付記１７）
前記チェックパターンにおいて特定されるアクションに従って前記命令が変更されるインストルメントされた中間表現を生成することは、前記中間表現における前記命令を、前記チェックパターンに含まれる差し替え用命令により置換することを含む、
付記１６に記載の非一時的なコンピュータ可読媒体。
（付記１８）
前記動作は、前記インストルメントされた中間表現の記号的実行に基づきレポートを生成することを更に含み、該レポートは、前記ソフトウェアプログラム内の１又はそれ以上のエラーを示す、
付記１６に記載の非一時的なコンピュータ可読媒体。
（付記１９）
前記動作は、
複数のチェックパターンのうちの対応する１つにおいて夫々含まれる複数のパターンのいずれかに整合する命令を前記中間表現から探し、
前記複数のチェックパターンのうちの対応する１つに整合する夫々の命令について、前記複数のチェックパターンのうちの対応する１つにおいて特定されるアクションに従って前記中間表現からの対応する命令を変更し、
前記複数のパターンのいずれかに整合する命令を前記中間表現から探す前に、前記複数のチェックパターンの１つとして含めるよう利用可能なチェックパターンの組から少なくとも第１のチェックパターンを選択するのに有効なユーザ入力を受け取る
ことを更に含む、付記１６に記載の非一時的なコンピュータ可読媒体。
（付記２０）
前記動作は、少なくとも前記第１のチェックパターンを選択するのに有効なユーザ入力を受け取る前に、前記第１のチェックパターンを定義するのに有効なユーザ入力を受け取ることを更に含む、
付記１９に記載の非一時的なコンピュータ可読媒体。
【符号の説明】
【００６４】
１０２                          関数
２０２，３０２，７２６          動的チェッカー
２０４                          エラーレポート
３００                          システム
３０４                          チェックパターンデータベース
３０６                          コンパイラ
３０８                          アサーション・インストルメンテーションモジュール
３１０                          記号的実行モジュール
３１２，５０２，６０２          ソフトウェアプログラム
３１４，５０４                  中間表現
３１６，４００，５０６、６０４  チェックパターン
３１８，５１２                  インストルメントされた中間表現
３２０，６１６                  レポート
５０４Ａ                        命令
５０８Ａ，５１０                パターン
５０８Ｂ                        条件
５０８Ｃ                        エラーレポート呼び出し
５１２Ａ                        差し替え用命令
７００                          コンピュータ装置
７０４                          プロセッサ
７０６                          システムメモリ
【図１】
2014219969.tif 000003
【図２】
2014219969.tif 000004
【図３】
2014219969.tif 000005
【図４】
2014219969.tif 000006
【図５】
2014219969.tif 000007
【図６】
2014219969.tif 000008
【図７】
2014219969.tif 000009