(57)【要約】【課題】  本発明は、記号テストドライバを反復生成する方法及びシステムを提供する。【解決手段】  １又は複数のコンピューティング装置により、評価されるべきコンピューティング装置に対する命令を決定するステップ、評価されるべき１又は複数の前記命令及び該命令の一部に対応する記号変数の指示を有する第１の記号テストドライバを生成するステップ、前記記号変数に関して前記命令を記号実行するステップ、前記記号実行の結果から、前記記号変数の所与の値で前記命令を実行する１又は複数のコマンドを有するテストケースを決定するステップ、前記コマンド内のオブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しを決定するステップ、前記の決定した呼び出しに基づき前記呼び出しを有する新しい記号テストドライバを生成するステップ、次に、前記新しい記号テストドライバを記号実行するステップ、を有する方法。【選択図】  図１
2014021982.tif 000002
【特許請求の範囲】
【請求項１】
１又は複数のコンピューティング装置により、
評価されるべきコンピューティング装置に対する命令を決定するステップ、
評価されるべき１又は複数の前記命令及び該命令の一部に対応する記号変数の指示を有する第１の記号テストドライバを生成するステップ、
前記記号変数に関して前記命令を記号実行するステップ、
前記記号実行の結果から、前記記号変数の所与の値で前記命令を実行する１又は複数のコマンドを有するテストケースを決定するステップ、
前記コマンド内のオブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しを決定するステップ、
前記の決定した呼び出しに基づき、前記決定した呼び出しを有する新しい記号テストドライバを生成するステップ、
次に、前記新しい記号テストドライバを記号実行するステップ、
を有する方法。
【請求項２】
境界条件が決定されるまで、前に生成した記号テストドライバの記号実行に基づき、新しい記号テストドライバの生成を繰り返すステップ、
を更に有する請求項１に記載の方法。
【請求項３】
評価されるべきコンピューティング装置に対する命令を決定するステップは、オブジェクト指向プログラミングクラスのインスタンスを生成するステップであって、評価されるべき前記命令は前記クラスに含まれる、ステップを有する、請求項１に記載の方法。
【請求項４】
前記テストケース内で指定された値に基づき、新しい記号変数を選択するステップ、
を更に有する請求項１に記載の方法。
【請求項５】
前記オブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しは、前記オブジェクト指向プログラミングコンポーネントのインスタンスの生成を有する、請求項１に記載の方法。
【請求項６】
前記オブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しは、前記オブジェクト指向プログラミングコンポーネントの関数の呼び出しを有する、請求項１に記載の方法。
【請求項７】
前記オブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しは、前記オブジェクト指向プログラミングコンポーネントのデータ構造のアクセスを有する、請求項１に記載の方法。
【請求項８】
コンピュータ実行可能命令を有するコンピュータ可読媒体、
前記コンピュータ可読媒体に結合され、前記命令を読み出し実行するよう動作する１又は複数のプロセッサ、
を有し、前記１又は複数のプロセッサは、前記命令を実行すると、
評価されるべきコンピューティング装置に対する命令を決定するステップ、
評価されるべき１又は複数の前記命令及び該命令の一部に対応する記号変数の指示を有する第１の記号テストドライバを生成するステップ、
前記記号変数に関して前記命令を記号実行するステップ、
前記記号実行の結果から、前記記号変数の所与の値で前記命令を実行する１又は複数のコマンドを有するテストケースを決定するステップ、
前記コマンド内のオブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しを決定するステップ、
前記の決定した呼び出しに基づき、前記決定した呼び出しを有する新しい記号テストドライバを生成するステップ、
次に、前記新しい記号テストドライバを記号実行するステップ、
を実行する、システム。
【請求項９】
前記１又は複数のプロセッサは、境界条件が決定されるまで、前に生成した記号テストドライバの記号実行に基づき、新しい記号テストドライバの生成を繰り返すステップ、
を更に実行する、請求項８に記載のシステム。
【請求項１０】
評価されるべきコンピューティング装置に対する命令を決定するステップは、オブジェクト指向プログラミングクラスのインスタンスを生成するステップであって、評価されるべき前記命令は前記クラスに含まれる、ステップを有する、請求項８に記載のシステム。
【請求項１１】
前記１又は複数のプロセッサは、前記テストケース内で指定された値に基づき、新しい記号変数を選択するステップ、を更に実行する、請求項８に記載のシステム。
【請求項１２】
前記オブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しは、前記オブジェクト指向プログラミングコンポーネントのインスタンスの生成を有する、請求項８に記載のシステム。
【請求項１３】
前記オブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しは、前記オブジェクト指向プログラミングコンポーネントの関数の呼び出しを有する、請求項８に記載のシステム。
【請求項１４】
前記オブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しは、前記オブジェクト指向プログラミングコンポーネントのデータ構造のアクセスを有する、請求項８に記載のシステム。
【請求項１５】
コンピュータ可読媒体、
前記コンピュータ可読媒体に保持されるコンピュータ実行可能命令、
を有し、前記命令はプロセッサにより読み出し可能であり、前記命令は読み出され実行されると、前記プロセッサに、
評価されるべきコンピューティング装置に対する命令を決定するステップ、
評価されるべき１又は複数の前記命令及び該命令の一部に対応する記号変数の指示を有する第１の記号テストドライバを生成するステップ、
前記記号変数に関して前記命令を記号実行するステップ、
前記記号実行の結果から、前記記号変数の所与の値で前記命令を実行する１又は複数のコマンドを有するテストケースを決定するステップ、
前記コマンド内のオブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しを決定するステップ、
前記の決定した呼び出しに基づき、前記決定した呼び出しを有する新しい記号テストドライバを生成するステップ、
次に、前記新しい記号テストドライバを記号実行するステップ、
を実行させる、製品。
【請求項１６】
前記プロセッサに、境界条件が決定されるまで、前に生成した記号テストドライバの記号実行に基づき、新しい記号テストドライバの生成を繰り返すステップ、
を更に実行させる、請求項１５に記載の製品。
【請求項１７】
評価されるべきコンピューティング装置に対する命令を決定するステップは、オブジェクト指向プログラミングクラスのインスタンスを生成するステップであって、評価されるべき前記命令は前記クラスに含まれる、ステップを有する、請求項１５に記載の製品。
【請求項１８】
前記プロセッサに、前記テストケース内で指定された値に基づき、新しい記号変数を選択するステップ、を更に実行させる、請求項１５に記載の製品。
【請求項１９】
前記オブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しは、前記オブジェクト指向プログラミングコンポーネントのインスタンスの生成を有する、請求項１５に記載の製品。
【請求項２０】
前記オブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しは、前記オブジェクト指向プログラミングコンポーネントの関数の呼び出しを有する、請求項１５に記載の製品。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概してソフトウェア検証に関し、より詳細には、オブジェクト指向言語のための記号（symbolic）テストドライバの反復生成に関する。
【背景技術】
【０００２】
ソフトウェアアプリケーションは、任意の数のモジュール（例えば、クラス、関数、プロシジャ、サブルーチン、又はコードブロック）を有し、各モジュールは個別にテスト又は検証され得る。ソフトウェアモジュールは、手動で又は自動的にテスト又は検証され得る。前者の場合、人（例えば、ソフトウェア検査技術者）が、モジュールの設計仕様に基づき、ソフトウェアモジュールのテストケースを手動で設計し、テストケースの下でモジュールを実行し、テストケースと一致しないモジュールの動作又は出力を調べる。後者の場合、コンピュータソフトウェア又はハードウェアとして実装されたソフトウェア検査ツールが、被検査ソフトウェアモジュールのテストケースを生成し、テストケースをシミュレートしながら被検査モジュールを実行し、テストケースと一致しないモジュールの動作又は出力を調べる。近年のソフトウェアの純粋な複雑性は、テストケースの手動生成又は設計を、ソフトウェアを完全に検査するのに不適切にしてしまう場合が多い。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
本発明は、記号テストドライバを反復生成する方法及びシステムを提供する。
【課題を解決するための手段】
【０００４】
１又は複数のコンピューティング装置により、評価されるべきコンピューティング装置に対する命令を決定するステップ、評価されるべき１又は複数の前記命令及び該命令の一部に対応する記号変数の指示を有する第１の記号テストドライバを生成するステップ、前記記号変数に関して前記命令を記号実行するステップ、前記記号実行の結果から、前記記号変数の所与の値で前記命令を実行する１又は複数のコマンドを有するテストケースを決定するステップ、前記コマンド内のオブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しを決定するステップ、前記の決定した呼び出しに基づき前記呼び出しを有する新しい記号テストドライバを生成するステップ、次に、前記新しい記号テストドライバを記号実行するステップ、を有する方法。
【０００５】
別の実施形態では、システムは、コンピュータ実行可能命令を含むコンピュータ可読媒体、前記コンピュータ可読媒体に結合され前記命令を読み出し実行するよう動作する１又は複数のプロセッサ、を有する。１又は複数のプロセッサは、前記命令を実行すると、評価されるべきコンピューティング装置に対する命令を決定するステップ、評価されるべき１又は複数の前記命令及び該命令の一部に対応する記号変数の指示を有する第１の記号テストドライバを生成するステップ、前記記号変数に関して前記命令を記号実行するステップ、前記記号実行の結果から、前記記号変数の所与の値で前記命令を実行する１又は複数のコマンドを有するテストケースを決定するステップ、前記コマンド内のオブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しを決定するステップ、前記の決定した呼び出しに基づき前記呼び出しを有する新しい記号テストドライバを生成するステップ、次に、前記新しい記号テストドライバを記号実行するステップ、を実行する。
【０００６】
更に別の実施形態では、製品は、コンピュータ可読媒体、前記コンピュータ可読媒体に保持されたコンピュータ実行可能命令を有する。前記命令はプロセッサにより読み出し可能である。前記命令は、読み出され実行されると、プロセッサに、評価されるべきコンピューティング装置に対する命令を決定するステップ、評価されるべき１又は複数の前記命令及び該命令の一部に対応する記号変数の指示を有する第１の記号テストドライバを生成するステップ、前記記号変数に関して前記命令を記号実行するステップ、前記記号実行の結果から、前記記号変数の所与の値で前記命令を実行する１又は複数のコマンドを有するテストケースを決定するステップ、前記コマンド内のオブジェクト指向プログラミングコンポーネントの１又は複数の呼び出しを決定するステップ、前記の決定した呼び出しに基づき前記呼び出しを有する新しい記号テストドライバを生成するステップ、次に、前記新しい記号テストドライバを記号実行するステップ、を実行させる。
【図面の簡単な説明】
【０００７】
本発明並びにその特徴及び利点のより完全な理解のため、添付の図と共に以下の説明を参照する。
【図１】オブジェクト指向言語のための記号テストドライバの反復生成のためのシステムの例示的な実施形態である。
【図２】例示的な実施形態及びテストモジュールの生成の更に詳細な図である。
【図３】新しいテストドライバが生成されるオブジェクト、クラス、データ構造又は関数の呼び出し又はインスタンスの説明である。
【図４】記号テストドライバを反復生成させる被検査コードの例である。
【図５】システムの動作例の説明である。
【図６】新しい記号テストドライバを生成するためのシステムの更なる動作例を示す。
【図７】オブジェクト指向言語のための記号テストドライバの反復生成のための例示的な方法の説明である。
【発明を実施するための形態】
【０００８】
図１は、オブジェクト指向言語のための記号テストドライバの反復生成のためのシステム１００の例示的な実施形態である。システム１００は、被検査コード１０４を検証し、有効化し又は検査し、該検査からの結果１０８を生成するよう構成されても良い。検査中、システム１００は、被検査コード１０４を検査するために記号テストドライバを反復生成するよう構成されても良い。一実施形態では、このような記号テストドライバは、システム１００又は別のエンティティにより用いられ、被検査コード１０４の検査の一部として被検査コード１０４を記号実行しても良い。別の実施形態では、システム１００は、被検査コード１０４のオブジェクト指向プログラミングの特徴に基づき、記号テストドライバを反復生成するよう構成されても良い。このような特徴は、例えば、オブジェクト、クラス、データ構造又はオブジェクト内の関数の呼び出し又はインスタンスを含み得る。
【０００９】
システム１００は、被検査コード１０４のために記号テストドライバを反復生成するよう構成される電子装置１０２を有しても良い。電子装置１０２は、このような記号テストドライバを用いて被検査コード１０４を記号実行し、又は被検査コード１０４を検査するよう更に構成されても良い。一実施形態では、電子装置１０２は、被検査コード１０４のオブジェクト指向プログラミングの特徴に基づく記号テストドライバの反復生成に基づいても良い。電子装置１０２は、被検査コード１０４の検査結果を反映する結果１０８を生成するよう構成されても良い。
【００１０】
電子装置１０２は、任意の適切な方法で、例えばネットワークを介して、ユーザによるロード若しくは入力を通じて、又はローカル若しくはリモート記憶装置にアクセスして電子的に、被検査コード１０４を受信するよう構成されても良い。電子装置１０２は、任意の適切な方法で、例えばネットワークを介して結果１０８を送信し、ユーザに表示し、又はローカル若しくはリモート記憶装置に格納して、結果１０８を提供するよう構成されても良い。
【００１１】
電子装置１０２は、被検査コード１０４のために記号テストドライバを反復生成するよう構成されるテストモジュール１０６を有しても良い。さらに、テストモジュール１０６は、電子装置１０２又はシステム１００のために任意の態様の被検査コード１０４実行するよう構成されても良い。テストモジュール１０６は、プログラム、ソフトウェア、サービスとしてのソフトウェア、アナログ若しくはデジタル回路、又はこれらの任意の組合せのような任意の適切なメカニズムにより実装されても良い。テストモジュール１０６は、電子装置１０２に常駐しても良い。テストモジュール１０６は、完全なモジュールとして、又はより大きなシステムの一部のようなサブモジュールとして実装されても良い。ソフトウェア形式では、テストモジュール１０６の一部又は全部は、例えば、ロジック、命令、バイナリ、オブジェクトコード、ライブラリ、関数、プログラム、アプリケーション、スクリプト、実行ファイル、又は他の適切なデジタルエンティティにより実装されても良い。
【００１２】
電子装置１０２は、プログラム命令を解釈し及び／又は実行し、及び／又はデータを処理するよう構成可能な、コンピュータ、デスクトップ、サーバ、ラップトップ、パーソナルデータアシスタント又はスマートフォンを含むがこれらに限定されない任意の装置を有しても良い。電子装置１０２は、メモリ１１２に結合されるプロセッサ１１０を有しても良い。テストモジュール１０６の一部又は全部は、プロセッサ１１０による実行のために、メモリ１１２内に常駐するロジック若しくは命令で実施されても良い。プロセッサ１１０は、例えば、マイクロプロセッサ、マイクロコントローラ、デジタ・シグナルプロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、又はプログラム命令を解釈し及び／若しくは実行し並びに／又はデータを処理するよう構成された任意の他のデジタル若しくはアナログ回路を有してもよいが、これらに限定されない。プロセッサ１１０は、プログラム命令を解釈及び／又は実行し、及び／又はメモリ１１２格納されたデータを処理しても良い。メモリ１１２は、プログラム命令及び／又はデータをある期間の間保持するよう構成される任意のシステム、装置又は機器を有してもよい（例えば、コンピュータ可読媒体）。
【００１３】
被検査コード１０４は、例えば、ソフトウェア、ソフトウェアコード、ライブラリ、アプリケーション、スクリプト、アクティブ若しくはパッシブウェブコンテンツ、又は電子装置で実行される他のロジック若しくは命令を有しても良い。一実施形態では、被検査コード１０４は、このようなソフトウェアの完全なインスタンスを有しても良い。別の実施形態では、被検査コード１０４は、このようなソフトウェアの一部を有しても良い。
【００１４】
結果１０８は、データ、ファイル、又はテストモジュール１０６の動作結果を表現し、格納し若しくは示す任意の他の適切なメカニズムにより実施されても良い。結果１０８は、例えば、テストモジュール１０６により反復生成される記号テストドライバ、又は記号実行を通じて決定された被検査コード１０４内のエラーの指標を有しても良い。
【００１５】
実際に、テストモジュール１０６は、電子装置１０２で実行中であっても良い。テストモジュール１０６は、ローカル又はリモートユーザからアクセス可能であっても良い。被検査コード１０４は、電子装置１０２及びテストモジュール１０６に供給されても良い。テストモジュール１０６は、被検査コード１０４を分析し、被検査コード１０４がエラーを含むか否かを決定しても良い。テストモジュール１０６は、任意の適切なプロセスを通じて被検査コード１０４を分析しても良い。一実施形態では、テストモジュール１０６は、被検査コード１０４のために記号テストドライバを反復生成しても良い。更なる実施形態では、テストモジュール１０６は、被検査コード１０４のオブジェクト指向プログラミングの特徴に基づき、このような生成を行っても良い。別の実施形態では、テストモジュール１０６は、被検査コード１０４を記号実行しても良い。このような記号実行は、反復生成した記号テストドライバを用いて行われても良い。テストモジュール１０６は、例えば、反復生成された記号テストドライバ又は生成された記号テストドライバで被検査コード１０４を記号実行した結果を含む結果１０８を生成しても良い。結果１０８は、ユーザに供給され、格納され、又は被検査コード１０４を評価するために用いられても良い。
【００１６】
図２は、例示的な実施形態及びテストモジュール２００の生成の更に詳細な図である。テストモジュール２００は、図１のテストモジュール１０６の全部又は一部を実施しても良い。
【００１７】
テストモジュール２００は、テストドライバ生成部２０４、記号テストドライバ生成部１０６、記号実行エンジン２０８、及びテストエンジン２１０を有しても良い。テストドライバ２０４は、ソースファイル２０２、記号テストドライバ生成部２０６、及び記号実行エンジン２０８に通信可能に結合されても良い。記号テストドライバ生成部２０６は、記号実行エンジン２０８に更に通信可能に結合されても良い。記号実行エンジン２０８は、結果２１４を生成するよう構成されても良いテストエンジン２１０に更に通信可能に結合されても良い。
【００１８】
ソースファイル２０２は、評価され、テストされ又は有効化されるコードを有しても良い。ソースファイル２０２は、例えば、ファイル、レコード、データベース又は任意の他の適切なエンティティで実装されても良い。ソースファイル２０２は、図１の被検査コード１０４を有し、格納し又は実施しても良い。結果２１４は、任意の適切な方法で実装されても良く、図１の結果１０８を有しても良い。
【００１９】
テストドライバ生成部２０４、記号テストドライバ生成部２０６、記号実行エンジン２０８及びテストエンジン２１０の各々は、プログラム、ソフトウェア、ライブラリ、関数、モジュール、アプリケーション、スクリプト、サービスとしてのソフトウェア、アナログ若しくはデジタル回路、又はこれらの任意の組合せのような任意の適切な方法で実装されても良い。テストドライバ生成部２０４、記号テストドライバ生成部２０６、記号実行エンジン２０８及びテストエンジン２１０の各々は別個のコンポーネントとして示されるが、これらのうちのいずれも、図示された若しくは図示されない別のコンポーネントと組み合わせられ、依然として本願明細書に記載した機能を実行しても良い。テストドライバ生成部２０４、記号テストドライバ生成部２０６、記号実行エンジン２０８、及びテストエンジン２１０の各々は、図１のテストモジュール１０６の一部又は全部を実施しても良い。テストドライバ生成部２０４、記号テストドライバ生成部２０６、記号実行エンジン２０８及びテストエンジン２１０の各々は、共通若しくは別個のモジュール内に実装されても良く、このようなモジュールは、完全なモジュールとして又はより大きなシステムの一部としてのサブモジュールとして実装されても良い。ソフトウェア形式では、テストドライバ生成部２０４、記号テストドライバ生成部２０６、記号実行エンジン２０８、及びテストエンジン２１０の一部又は全部は、例えば、ロジック、命令、バイナリ、オブジェクトコード、ライブラリ、関数、プログラム、アプリケーション、スクリプト、実行ファイル、又は他の適切なデジタルエンティティにより実装されても良い。
【００２０】
テストドライバ生成部２０４は、ソースファイル２０２から被検査コードを受信するよう構成されても良い。このような被検査コードは、テストモジュール２００により分析中のより大きなエンティティの一部を反映しても良い。さらに、テストドライバ生成部２０４は、記号実行エンジン２０８から被検査コードの特定部分を受信するよう構成されても良い。特定部分は、オブジェクト、クラス、データ構造又はオブジェクト内の関数の呼び出しのような被検査コードのオブジェクト指向プログミングに関連する特徴の確認された呼び出し又はインスタンスを有しても良い。テストドライバ生成部２０４は、例えば、ソースファイル２０２又は記号実行エンジン２０８から受信した特定部分により定められる被検査コードの一部を反映する一連の命令を生成するよう構成されても良い。
【００２１】
テストドライバ生成部２０４は、生成した一連の命令をテストドライバとして記号テストドライバ生成部２０６に渡すよう構成されても良い。記号テストドライバ生成部２０６は、被検査コード内の変数に対応する、テストドライバ内の所与の変数を変更し、ドライバが所与の変数に関して記号実行されるべきであることを示すよう構成されても良い。結果は、記号テストドライバを有しても良い。記号テストドライバ生成部２０６は、記号テストドライバを記号実行エンジン２０８に渡すよう構成されても良い。
【００２２】
記号実行エンジン２０８は、記号テストドライバを記号実行するよう構成されても良い。記号実行は、プログラム内の異なるパスを体系的に探索するプログラム検証技術を有しても良い。このような体系的探索には、所与のパスを形成する特定の関数呼び出しのシーケンスが含まれ得る。記号実行エンジン２０８は、記号テストドライバを記号実行するよう構成されても良い。記号テストドライバは、命令シーケンス内の条件分岐点を分析することを含む任意の適切な方法で被検査コードの部分を反映する。記号テストドライバを記号実行した結果は、テストエンジン２１０により実行されるべきテストケースを有しても良い。テストケースは、特定の入力変数と共に、被検査コードを並列化する命令シーケンスを有しても良い。テストケースは、特定のパスを形成する、関数呼び出し及び入力ベクトルのシーケンス、又は変数の値を有しても良い。
【００２３】
複数のこのようなテストケースは、条件分岐点を前提に生成されても良い。あるテストケースは、条件分岐の１つの可能な出力を仮定した実行を示し、別のテストケースは、条件分岐の異なる可能な出力を仮定した実行を示す。条件分岐演算は、例えば、if-then-else文又は条件ループを有しても良い。
【００２４】
さらに、複数のこのようなテストケースは、変数の異なる可能な値を用いて生成されても良い。変数は、例えば、被検査コードの設計により特定された又は記号実行を通じて得られた制約により制限されても良い。制約は、式又は論理条件を有しても良い。テストケースの実行は、このような制約下で可能であっても可能でなくても良い。制約は、テストケースに含まれ、テストエンジン２１０に供給されても良い。
【００２５】
テストエンジン２１０は、テストケースを実行し、制約の観点から、結果が被検査コード内のエラーを示すか否かを評価するよう構成されても良い。テストケースの実行結果が制約に違反する場合、テストエンジン２１０は、テストケースにより提示された被検査コード内にエラーが存在すると決定するよう構成されても良い。テストケースの実行結果が制約に違反しない場合、テストエンジン２１０は、少なくとも存在する制約の下で、テストケースにより提示された被検査コード有効化するよう構成されても良い。テストエンジン２１０は、新しい制約が例えば記号実行エンジン２０８により決定されるとき、新しい制約の観点で被検査コードを提示するテストケースを再検査するよう構成されても良い。テストケースを評価した後、テストエンジン２１０は、被検査コードの記号実行を継続するか否かを、記号実行エンジン２０８に通知するよう構成されても良い。テストエンジン２１０は、特定量の検査範囲が実行されたか又は特定限度のリソース（反復又は時間のような）が消費されているか否かを決定するような任意の適切なメカニズムを通じて、このような決定を行うよう構成されても良い。テスト又はリソース境界が満たされるか否かを決定した後、テストエンジン２１０は、被検査コードの評価を停止するか又は継続するかを、記号実行エンジン２０８に通知するよう構成されても良い。テストエンジン２１０は、結果２１４を生成するよう構成されても良い。
【００２６】
幾つかの例では、テストエンジン２１０は、任意の所与の関数呼び出しが、初期化又は無認可エンティティによるクラスの使用のようなソフトウェア設計原則に違反するか否かを決定するために、関数呼び出しのシーケンスを評価するよう構成されても良い。他の例では、テストエンジン２１０は、マルウェア攻撃を示し得る関数呼び出しシーケンスを評価するよう構成されても良い。更に別の例では、テストエンジン２１０は、関数呼び出しが決して実行できないような、関数呼び出しシーケンスが実行中に達し得ないか否かを評価するよう構成されても良い。
【００２７】
記号実行は、記号実行エンジン２０８により、記号実行ドライバ内で被検査コード中の変数に適用されても良い。所与の変数、分岐又は記号実行されるべき他の点に達するために、特定の命令シーケンスが実行される必要があっても良い。記号実行エンジン２０８は、このような命令シーケンス内の基本データ型に対して効率的且つ効果的に記号実行を実行しても良い。基本データ型は、整数、文字、浮動小数点、又はブールのような固有の及びプログラミング言語により定められたデータ型を有しても良い。
【００２８】
しかしながら、幾つかの例では、記号実行エンジン２０８は、このような命令シーケンス内のオブジェクト指向プログラミングコンポーネントの呼び出し又はインスタンスに対して容易又は効率的に記号実行を実行することができない。コンポーネントは、ユーザ定義オブジェクト、構造、クラス、又は該オブジェクト、構造若しくはクラスの関数を有しても良い。このようなコンポーネントは、プログラマにより定義され、固有ではなく、任意の数のサブコンポーネント若しくは隠れ分岐演算を含んでも良い。さらに、命令シーケンス内のオブジェクト指向プログラミングコンポーネントの可能な実行範囲の完全な理解は、その実際のデータ型がオブジェクト、クラス又は構造内で不明確な場合、直ちに明らかにならなくても良い。これは、例えば、記号実行エンジン２０８に直ちに明らかなブール又は整数の範囲又はデータ型と対照的である。
【００２９】
したがって、このようなコンポーネントの直接的な記号実行は予測できない。オブジェクトの呼び出し又はインスタンスに適用されるテストケース内の所定値の選択は、命令シーケンスを完全に探索しなくても良い。さらに、オブジェクト指向プログラミングコンポーネントの全ての可能な値のための完全の範囲のテストケースを単に生成することは、記号実行エンジンがオブジェクト指向プログラミングコンポーネントの内部動作を評価するメカニズムを有しないために、不可能であり得る。さらに、全ての可能な値について完全な範囲のテストケースを生成することは、プログラムの適法な実行の範囲内で不可能なオブジェクト値を探索する可能性がある。つまり、幾つかの値は、プログラムが生成され得る実際のケースを表現しない。このような値の探索は、検査技術者により結果として生じたテストスーツから手動で除去されなければならない偽陽性バグをトリガし得る。
【００３０】
したがって、記号実行エンジン２０８は、例えば、記号テストドライバ又はテストケースの内容を分析することにより、追加テストドライバを生成するか否かを決定するよう構成されても良い。一実施形態では、記号実行エンジン２０８は、出力されるテストケースを分析して、テストケースが、オブジェクト指向プログラミングコンポーネントの呼び出し又はインスタンスを有するシーケンスを含むか否かを決定するよう構成されても良い。含む場合、記号実行エンジン２０８は、テストドライバ生成部２０４により生成される新しいテストドライバのためのテストケース内のシーケンスを識別するよう構成されても良い。新しいテストドライバは、オブジェクト指向プログラミングコンポーネントの呼び出し又はインスタンスを含む命令シーケンスを記号実行するよう構成される。記号実行エンジン２０８は、例えばクラス又は関数呼び出しを含むこのような検出したシーケンスを、テストドライバ生成部２０４に伝達しても良い。
【００３１】
記号テストドライバ内の所与の分岐点に対し、記号実行エンジン２０８は、各分岐の実行を反映する２以上のテストケースを生成するよう構成されても良い。記号実行エンジン２０８は、新しいテストドライバを生成するのに可能な候補として、各々の結果として生じたテストケース内の演算シーケンスを評価しても良い。
【００３２】
オブジェクト指向プログラミングコンポーネントの呼び出し又はインスタンスに用いられる記号テストドライバ内の所与の変数に対して、テストケースは、該変数に割り当てられた値を有しても良い。記号実行エンジン２０８は、記号テストドライバ内のこのような変数又はテストケース内の割り当てられた値を識別するよう構成されても良い。このような識別に基づき、記号実行エンジン２０８は、テストドライバ生成部２０４に、変数が新しいテストドライバ内で記号実行されるべきであると指示するよう構成されても良い。一実施形態では、テストドライバ生成部２０４は、記号実行エンジン２０８から受信したテストケースに基づいて分析を実行しても良い。
【００３３】
オブジェクト指向プログラミングコンポーネントの呼び出し又はインスタンスのシーケンスに対して追加テストドライバを生成することにより、記号実行エンジン２０８は、該オブジェクト指向プログラミングコンポーネントの実行を完全に探索しても良い。
【００３４】
テストドライバ生成部２０４は、記号実行エンジン２０８により送信された決定に基づき又は自身の同様の分析に基づき、追加テストドライバを生成するよう構成されても良い。記号テストドライバ生成部２０６は、テストドライバを記号テストドライバに変換し、それらを記号実行エンジン２０８に送信するよう構成されても良い。記号実行エンジン２０８は、新しい記号テストドライバを順々に記号実行しても良い。
【００３５】
図３は、新しいテストドライバが生成されるオブジェクト、クラス、データ構造又は関数の呼び出し又はインスタンスの説明である。コードシーケンス３０２は、オブジェクト指向プログラミングコンポーネント３０４の任意の数又は種類の呼び出し又はインスタンスを有しても良い。一実施形態では、コードシーケンス３０２は、オブジェクトに含まれても良い。別の実施形態では、コンポーネント３０４は、オブジェクトにより実施されても良い。したがって、呼び出しは、オブジェクト間で行われても良い。コードシーケンス３０２及びコンポーネント３０４を含むオブジェクトは、例えば、ソフトウェアモジュールの異なる部分に又は異なるソフトウェアモジュールに含まれても良い。
【００３６】
オブジェクト指向プログラミングコンポーネントの任意の適切な種類又は数の呼び出し又はインスタンスが、新しいテストドライバを生成するために用いられても良い。例えば、コードシーケンス３０２は、Ｂがクラスwidgetのオブジェクトの新しく生成されるインスタンスであるとすると「B=new  widget()」のような命令で、コンポーネント３０４のインスタンスを生成する演算を有しても良い。別の例では、コードシーケンス３０２は、「function１()」がクラスwidgetの関数であり、Ｂがクラスwidgetのインスタンスであるとすると「B.function１())」のような命令で、コンポーネント３０４の関数にアクセスする演算を有しても良い。更に別の例では、コードシーケンス３０２は、「dynamic_structure」がクラスwidgetの整数配列であり、Ｂがインスタンスであり、配列が集合［０，１，２］を有するとすると、「x=B.dynamic_structure[０]」のような命令で、コンポーネント３０４のデータ構造にアクセスする演算を有しても良い。
【００３７】
任意のこのような呼び出しは、コンポーネント３０４に属すると識別されると、コンポーネント３０４を記号実行するためにテストドライバを生成するために用いられても良い。このようなテストドライバは、他の命令と共に、コードシーケンス３０４からの命令を有しても良い。他の命令は、例えば、固有型演算、コンポーネント３０４の他の呼び出し、又は他のオブジェクト指向プログラミングコンポーネントの呼び出しを有しても良い。
【００３８】
図４は、システム２００内で記号テストドライバを反復生成させる被検査コードの一例である。NetworkSetupと称されるクラス４０２、及びRouterと称される構造４０４は、被検査コードと共に含まれても良い。クラス４０２及び構造４０４は、両方ともオブジェクト指向プログラミングコンポーネントであっても良い。クラス４０２は、（「if(b)」のような）固有データ型演算、（「Routerr１()」、「r１.addConnection(con１)」又は「“r１.addConnection(con２)”」のような）構造４０４の呼び出し、及び（「Router  r１()」のような）Routerのインスタンスの生成を含む種々の命令を有しても良い。クラス４０２は、構造４０４のこのような複数の呼び出しを有しても良い。
【００３９】
図５は、システム２００の動作例の説明である。例示目的のために、システム２００は、図４のクラス４０２を用いても良い。
【００４０】
クラス４０２は、テストドライバ生成部２０４により受信されても良い。クラス４０２を評価するために、テストドライバ生成部２０４は、初期テストドライバ５１６を生成しても良い。テストドライバ５１６は、クラス４０２のNetworkSetupを呼び出すインスタンス及びNetworkSetupに渡すべきブール変数を生成するインスタンスを有しても良い。テストドライバ生成部４０２は、テストドライバ５１６を記号テストドライバ生成部２０６へ送信しても良い。
【００４１】
記号テストドライバ生成部２０６は、テストドライバ５１６を記号テストドライバ５１８に変換しても良い。記号テストドライバ５１８は、変数ｘが記号テストされるべきであると示す命令「make_symbolic(x)」を有しても良い。記号テストドライバ生成部２０６は、記号テストドライバ５１８を記号実行エンジン２０８へ送信しても良い。
【００４２】
記号実行エンジン２０８は、記号テストドライバ５１８を記号実行しても良い。このような記号実行は、記号テストドライバ５１８内で指定された変数ｘに基づき実行されても良い。
【００４３】
記号実行エンジン２０８は、NetworkSetup関数の呼び出しを通じて、クラス４０２のインスタンスの生成を評価しても良い。NetworkSetupのコードでは、「if(b)」は条件付き演算である。ここで、ｂは、ブールであり、記号実行されるべき変数ｘに対応する。次に、記号実行エンジン２０８は、ブールから、１つはｂが真であり、１つはｂが偽である２つの可能な分岐が存在すると決定しても良い。したがって、記号実行エンジン２０８は、可能な分岐の各々を反映する２つの命令シーケンスを生成しても良い。記号実行エンジン２０８は、「偽」命令シーケンスをテストケース５２０に置き、「真」命令シーケンスをテストケース５２２に置いても良い。さらに、記号実行エンジン２０８は、命令シーケンスのパラメータにテスト変数値を設けても良い。例えば、２つのテストケース５２０、５２２の中で「Router  r１」の呼び出しは、１のパラメータを有しても良い。記号実行エンジン２０８は、テストケース５２０、５２２を実行のためにテストエンジン２１０へ送信しても良い。
【００４４】
記号実行エンジン２０８は、テストケース５２０、５２２を評価し、その中に含まれる命令シーケンスに基づきテストドライバを生成するか否かを決定しても良い。テストケース５２０、５２２のこのような評価は、直列に又は別個に行われても良い。記号実行エンジン２０８は、各テストケース５２０、５２２の中で、クラス４０２から構造４０４への呼び出しが行われていると決定しても良い。さらに、記号実行エンジン２０８は、各テストケース５２０、５２２の中で、関数呼び出し「Router  r１(１)」に対して１の変数値が設定されたと決定しても良い。したがって、記号実行エンジン２０８は、テストケース５２０、５２２を実行のためにテストドライバ生成部２０４へ送信させても良い。さらに、「Router  r１()」のパラメータのための変数は、記号実行されるよう設計されても良い。
【００４５】
図６は、新しいシンボルテストドライバを生成するためのシステム２００の更なる動作例を示す。テストドライバ生成部２０４及び記号テスト生成部２０６は、テストケース５２０、５２２に基づき、新しいテストドライバ及び記号テストドライバを生成しても良い。
【００４６】
テストドライバ生成部２０４は、テストケース５２０、５２２、クラス４０２及び構造４０４を用いて、記号テストドライバ生成部２０６へ送信されるべきテストドライバを生成しても良い。記号を生成すべき変数を決定するために、記号テストドライバ生成部２０６は、例えば、記号実行エンジン２０８により監視される情報を当てにして、アクセスされた構造４０４内の分岐を決定し、又はテストケース５２０、５２２内で用いる変数を決定しても良い。記号テストドライバ生成部２０６は、１又は複数の変数を記号実行し及び（テストケース５２０に基づき）記号テストドライバ６２４を生成し（テストケース５２０に基づき）記号テストドライバ６２６を生成するようテストドライバを変更しても良い。記号テストドライバ６２４、６２６の各々は、テストケース５２０、５２２の各々に含まれる命令シーケンスに加えて、可変整数のインスタンス及び該可変整数記号を生成する命令を有しても良い。
【００４７】
記号実行エンジン２０８は、記号テストドライバ６２４、６２６の各々を記号実行しても良い。記号実行エンジン２０８は、記号テストドライバ６２４、６２６の各々について１又は複数のテストケースを生成しても良い。このようなテストケースは、例えば、記号変数のために選択された可能な値を反映しても良い。例えば、記号実行エンジン２０８は、テストドライバ６２６に基づきテストケース６２８、６３０を生成しても良い。テストケース６２８は、記号実行される整数変数が１に等しいと仮定する命令シーケンスを有しても良い。テストケース６３０は、記号実行される整数変数が２に等しいと仮定する命令シーケンスを有しても良い。同様に、記号実行エンジン２０８は、記号テストドライバ６２４に基づきテストケース（図示しない）を生成しても良い。
【００４８】
テストケース６２８、６３０は、実行及び評価のためにテストエンジン２１０へ送信されても良い。境界条件に達しない場合、記号実行エンジン２０８は、テストケース６２８、６３０のような新たに生成したテストケースを検査し、それらの内容が記号テストドライバの追加生成の基礎を提供するか否かを決定しても良い。追加生成の基礎を提供する場合、テストケースは、テストドライバ生成部２０４へ送信されても良い。
【００４９】
システム２００は、被検査コード１０４が完全に記号実行されるまで、又は実行境界条件が検出されるまで、この処理を繰り返しても良い。
【００５０】
図７は、オブジェクト指向言語のためのシンボルテストドライバの反復生成のための例示的な方法７００の説明である。ステップ７０５で、被検査コードが決定されても良い。被検査コードは、評価されるべきソフトウェアの全部又は一部を有しても良い。さらに、被検査コードは、オブジェクトのインスタンスの初期化として生成されても良い。被検査コードは、方法７００の別のインスタンスの実行から受信される命令シーケンスを有しても良い。
【００５１】
ステップ７１０で、テストドライバが、被検査コードから生成されても良い。テストドライバは、被検査コードにより実行されるべき及び評価されるべきシーケンス又は演算を有しても良い。テストドライバは、評価のために被検査コードを初期化しても良い。
【００５２】
ステップ７１５で、記号テストドライバは、テストドライバから生成されても良い。記号テストドライバは、被検査コードが記号実行されるべき変数の指標を有しても良い。ステップ７２０で、被検査コードは、識別された変数に関して記号実行されても良い。記号実行は、被検査コードの制約、分岐点、又は他の抽象概念を識別しても良い。ステップ７２５で、記号実行の結果は、１又は複数のテストケースの生成を有しても良い。テストケースの数は、例えば、被検査コード内の分岐数、又は識別した変数の値の決定した可能な範囲を有しても良い。テストケースは、このような分岐の各々及びこのような可能な値の各々について生成されても良い。
【００５３】
ステップ７３０で、テストケースが実行されても良く、テストケースは任意の制約に違反するか否かが決定されても良い。違反する場合、ステップ７４０で、被検査コードは、エラーを有すると決定されても良い。違反しない場合、ステップ７３５で、被検査コードは、少なくともここまではテストケースに関して、有効化されても良い。
【００５４】
ステップ７４５で、境界条件に達したか否かが決定されても良い。このような境界条件は、例えば、テストケースの範囲又は数及び検査範囲、反復数、記号実行の深さ、又は時間により定められても良い。境界条件に達した場合、ステップ７５０で、方法は終了しても良い。
【００５５】
境界条件に達しない場合、ステップ７５５で、テストケースは別のオブジェクト又は同様のコンポーネントの呼び出しのシーケンスを有するか否かが決定されても良い。このようは呼び出しは、オブジェクトのインスタンス、オブジェクトの関数のアクセス、又はオブジェクトのデータ構造へのアクセスを有しても良い。有する場合、該呼び出しに基づき、追加テストドライバが生成されても良い。追加テストドライバは、オブジェクトを呼び出す命令シーケンスを有しても良い。次に、方法７００は、ステップ７１５で開始する繰り返しに進み、テストドライバを評価する。有しない場合、方法７００はステップ７３０に戻り、記号テストドライバの記号実行を継続しても良い。
【００５６】
図７は、例示的な方法７００に関して行われる特定数のステップを示すが、方法７００は、図７に示したステップより多くの又は少ないステップで実行されても良い。さらに、図７は、方法７００に関して行われる特定順序のステップを示すが、方法７００を構成するステップは、任意の適切な順序で達成されても良い。さらに、７００の種々のステップは、互いに並列に実行されても良い。例えば、ステップ７５５でテストケースはオブジェクトの呼び出しシーケンスを有すると決定した後、方法７００は、ステップ７６０に進み、並行してステップ７２０の実行に戻っても良い。
【００５７】
方法７００は、図１−６のシステム又は任意の他のシステム、ネットワーク又は方法７００を実施するよう動作可能な装置を用いて実装されても良い。特定の実施形態では、方法７００は、部分的に又は全部をコンピュータ可読媒体に具現化されるソフトウェアで実施されてもよい。本開示の目的のために、コンピュータ可読媒体は、データ及び／又は命令をある期間の間保持し得る任意の手段又は手段の集合を包含する。コンピュータ可読媒体は、直接アクセス記憶装置（例えば、ハードディスクドライブ又はフロッピー(登録商標)ディスク）、順次アクセス記憶装置（例えば、テープディスクドライブ）、コンパクトディスク、ＣＤ−ＲＯＭ、ＤＶＤ、ＲＡＭ（random  access  memory）、ＲＯＭ（read-only  memory）、ＥＥＰＲＯＭ（electrically  erasable  programmable  read-only  memory）、及び／又はフラッシュメモリのような記憶媒体、並びに有線、光ファイバ及び他の有形、非一時的媒体のような通信媒体、及び／又はこれらの任意の組合せを有してもよいが、これらに限定されない。
【００５８】
本開示は詳細に記載されたが、種々の変更、置換及び修正が本開示の精神及び範囲から逸脱することなく行われうることが理解されるべきである。
【符号の説明】
【００５９】
１００  システム
１０２  電子装置
１０４  被検査コード
１０６  テストモジュール
１０８  結果
１１０  プロセッサ
１１２  メモリ
２００  テストモジュール
２０２  ソースファイル
２０４  テストドライバ生成部
２０６  記号テストドライバ生成部
２０８  記号実行エンジン
２１０  テストエンジン
２１４  結果
５２０、５２２  テストケース
【図１】
2014021982.tif 000003
【図２】
2014021982.tif 000004
【図３】
2014021982.tif 000005
【図４】
2014021982.tif 000006
【図５】
2014021982.tif 000007
【図６】
2014021982.tif 000008
【図７】
2014021982.tif 000009