(57)【特許請求の範囲】
【請求項１】
１以上のコンピュータ装置が実行する方法であって、
ソフトウェアモジュールに関連する１以上の第一の数値に関する制約と１以上の第一の文字列に関する制約とを分析するステップであって、前記ソフトウェアモジュールは、１以上の数値の変数と、１以上の文字列の変数と、前記１以上の数値の変数のうちの特定の変数に適用され、数値又は文字列の結果を生成する１以上の第一の演算と、前記１以上の文字列の変数のうちの特定の変数に適用され、数値又は文字列の変数の結果を生成する１以上の第二の演算とを利用し、前記第一の数値に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、前記第一の文字列に関する制約は、前記１以上の文字列の変数のうちの特定の変数に適用される、ステップと、
前記１以上の文字列の変数のうちの特定の変数に適用される１以上の第二の数値に関する制約を推定するステップと、
前記１以上の数値の変数のうちの特定の変数に適用される１以上の第二の文字列に関する制約を推定するステップと、
前記第一の数値に関する制約と前記第二の数値に関する制約のそれぞれを式で表現するステップと、
前記第一の文字列に関する制約と前記第二の文字列に関する制約のそれぞれを有限状態マシンで表現するステップと、
全ての前記第一及び第二の数値に関する制約と全ての前記第一及び第二の文字列に関する制約とを満足する前記１以上の数値の変数と前記１以上の文字列の変数とのうちの特定の変数についての１以上の値を含む解を発見することを試みることで、１以上の可能性のあるエラーについて前記ソフトウェアモジュールを検査するステップと
を含むことを特徴とする方法。
【請求項２】
前記１以上の数値の変数は、１以上の入力の数値の変数と１以上の中間の数値の変数とを含み、
前記１以上の文字列の変数は、１以上の入力の文字列の変数と１以上の中間の文字列の変数とを含み、
前記１以上の入力の数値の変数のうちの特定の変数に適用される前記第一の数値に関する制約と、前記１以上の入力の文字列の変数のうちの特定の変数に適用される前記第一の文字列に関する制約とは、前記ソフトウェアモジュールの仕様に基づいて決定され、
前記１以上の中間の数値の変数のうちの特定の変数に適用される前記第一の数値に関する制約と、前記１以上の中間の文字列に変数のうちの特定の変数に適用される前記第一の文字列に関する制約とは、前記ソフトウェアモジュールの記号的実行を行うことで決定される、請求項１記載の方法。
【請求項３】
前記第二の数値に関する制約は、前記第一の文字列に関する制約と前記第二の演算とに基づいて推定され、
前記第二の文字列に関する制約は、前記第一の数値に関する制約と前記第一の演算とに基づいて推定される、請求項１記載の方法。
【請求項４】
前記第二の数値に関する制約と前記第二の文字列に関する制約は、ソフトウェアモジュールを実現するプログラミング言語と、前記ソフトウェアモジュールが実行されるランタイム環境との仕様に基づいて更に推定される、請求項３記載の方法。
【請求項５】
前記ソフトウェアモジュールを検査するステップは、
前記１以上の数値の変数と前記１以上の文字列の変数とについて異なる可能性のある値を繰返し試み、ある解が発見されるか、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約とが満たされないと判定されるか、又は前記の繰返し試みた回数が閾値に到達するまで、前記異なる可能性のある値が、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約との全てを満たす解をもたらしたか否かを検査するステップと、
前記解が発見された場合、前記１以上の数値の変数と前記１以上の文字列の変数の値を出力するステップと
を含む請求項１記載の方法。
【請求項６】
前記ソフトウェアモジュールは、１以上の条件分岐点と前記１以上の条件分岐点から得られる前記１以上の実行経路とを含み、
前記１以上の条件分岐点のそれぞれは、前記１以上の数値の変数と前記１以上の文字列の変数とにより特定される分岐条件に関連付けられ、
前記ソフトウェアモジュールの実行中に、前記１以上の条件分岐点のそれぞれにおいて、前記ソフトウェアモジュールは、前記１以上の条件分岐点に関連する分岐条件が満たされるか否かに依存して、前記１以上の実行経路のうちの別の実行経路に進む、請求項１記載の方法。
【請求項７】
前記１以上の可能性のあるエラーについて前記ソフトウェアモジュールを検査するステップが、
前記ソフトウェアモジュールの前記１以上の数値の変数と前記１以上の文字列の変数のうちの特定の変数に適用される１以上の制約のセットを決定するステップであって、前記制約のセットのそれぞれは、前記ソフトウェアモジュールの前記１以上の実行経路のうちの特定の実行経路に対応し、前記制約が満たされた場合、前記ソフトウェアモジュールを、対応する実行経路の終わりに到達させる、ステップと、
前記制約のセットそれぞれを満たす１以上の解を発見するステップと、
前記解に基づいて前記ソフトウェアモジュールについて１以上のテスト入力値のセットを生成するステップと、
それぞれのテスト入力値のセットを前記ソフトウェアモジュールに適用することで、増加したテスト範囲で前記ソフトウェアモジュールを検査するステップと
を含む請求項６記載の方法。
【請求項８】
前記それぞれの制約のセットは、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約とに基づいて決定される、請求項７記載の方法。
【請求項９】
前記１つ以上の可能性のある値について前記ソフトウェアモジュールを検査するステップが、前記ソフトウェアモジュールに記号的実行を行い、制約のセットを取得するステップを更に含む、請求項７記載の方法。
【請求項１０】
１以上のプロセッサにより実行可能な命令を含むメモリと、
前記メモリに結合され、前記命令を実行する１以上のプロセッサと
を備えるシステムであって、前記１以上のプロセッサは、前記命令を実行する場合に方法を実行し、前記方法は、
ソフトウェアモジュールに関連する１以上の第一の数値に関する制約と１以上の第一の文字列に関する制約とを分析するステップであって、前記ソフトウェアモジュールは、１以上の数値の変数と、１以上の文字列の変数と、前記１以上の数値の変数のうちの特定の変数に適用され、数値又は文字列の結果を生成する１以上の第一の演算と、前記１以上の文字列の変数のうちの特定の変数に適用され、数値又は文字列の変数の結果を生成する１以上の第二の演算とを利用し、前記第一の数値に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、前記第一の文字列に関する制約は、前記１以上の文字列の変数のうちの特定の変数に適用される、ステップと、
前記１以上の文字列の変数のうちの特定の変数に適用される１以上の第二の数値に関する制約を推定するステップと、
前記１以上の数値の変数のうちの特定の変数に適用される１以上の第二の文字列に関する制約を推定するステップと、
前記第一の数値に関する制約と前記第二の数値に関する制約のそれぞれを式で表現するステップと、
前記第一の文字列に関する制約と前記第二の文字列に関する制約のそれぞれを有限状態マシンで表現するステップと、
全ての前記第一及び第二の数値に関する制約と全ての前記第一及び第二の文字列に関する制約とを満足する前記１以上の数値の変数と前記１以上の文字列の変数とのうちの特定の変数についての１以上の値を含む解を発見することを試みることで、１以上の可能性のあるエラーについて前記ソフトウェアモジュールを検査するステップと
を有する、ことを特徴とするシステム。
【請求項１１】
前記１以上の数値の変数は、１以上の入力の数値の変数と１以上の中間の数値の変数とを含み、
前記１以上の文字列の変数は、１以上の入力の文字列の変数と１以上の中間の文字列の変数とを含み、
前記１以上の入力の数値の変数のうちの特定の変数に適用される前記第一の数値に関する制約と、前記１以上の入力の文字列の変数のうちの特定の変数に適用される前記第一の文字列に関する制約とは、前記ソフトウェアモジュールの仕様に基づいて決定され、
前記１以上の中間の数値の変数のうちの特定の変数に適用される前記第一の数値に関する制約と、前記１以上の中間の文字列に変数のうちの特定の変数に適用される前記第一の文字列に関する制約とは、前記ソフトウェアモジュールの記号的実行を行うことで決定される、
請求項１０記載のシステム。
【請求項１２】
前記第二の数値に関する制約は、前記第一の文字列に関する制約と前記第二の演算とに基づいて推定され、
前記第二の文字列に関する制約は、前記第一の数値に関する制約と前記第一の演算とに基づいて推定される、
請求項１０記載のシステム。
【請求項１３】
前記第二の数値に関する制約と前記第二の文字列に関する制約は、ソフトウェアモジュールを実現するプログラミング言語と、前記ソフトウェアモジュールが実行されるランタイム環境との仕様に基づいて更に推定される、
請求項１２記載のシステム。
【請求項１４】
前記ソフトウェアモジュールを検査するステップは、
前記１以上の数値の変数と前記１以上の文字列の変数とについて異なる可能性のある値を繰返し試み、ある解が発見されるか、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約とが満たされないと判定されるか、又は前記の繰返し試みた回数が閾値に到達するまで、前記異なる可能性のある値が、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約との全てを満たす解をもたらしたか否かを検査するステップと、
前記解が発見された場合、前記１以上の数値の変数と前記１以上の文字列の変数の値を出力するステップと
を含む請求項１０記載のシステム。
【請求項１５】
前記ソフトウェアモジュールは、１以上の条件分岐点と前記１以上の条件分岐点から得られる前記１以上の実行経路とを含み、
前記１以上の条件分岐点のそれぞれは、前記１以上の数値の変数と前記１以上の文字列の変数とにより特定される分岐条件に関連付けられ、
前記ソフトウェアモジュールの実行中に、前記１以上の条件分岐点のそれぞれにおいて、前記ソフトウェアモジュールは、前記１以上の条件分岐点に関連する分岐条件が満たされるか否かに依存して、前記１以上の実行経路のうちの別の実行経路に進む、請求項１０記載のシステム。
【請求項１６】
前記１以上の可能性のあるエラーについて前記ソフトウェアモジュールを検査するステップが、
前記ソフトウェアモジュールの前記１以上の数値の変数と前記１以上の文字列の変数のうちの特定の変数に適用される１以上の制約のセットを決定するステップであって、前記制約のセットのそれぞれは、前記ソフトウェアモジュールの前記１以上の実行経路のうちの特定の実行経路に対応し、前記制約が満たされた場合、前記ソフトウェアモジュールに、対応する実行経路の終わりに到達させる、ステップと、
前記制約のセットそれぞれを満たす１以上の解を発見するステップと、
前記解に基づいて前記ソフトウェアモジュールについて１以上のテスト入力値のセットを生成するステップと、
それぞれのテスト入力値のセットを前記ソフトウェアモジュールに適用することで、増加したテスト範囲で前記ソフトウェアモジュールを検査するステップと
を含む請求項１５記載のシステム。
【請求項１７】
前記それぞれの制約のセットは、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約とに基づいて決定される、
請求項１６記載のシステム。
【請求項１８】
前記１つ以上の可能性のある値について前記ソフトウェアモジュールを検査するステップが、前記ソフトウェアモジュールに記号的実行を行い、制約のセットを取得するステップを更に含む、請求項１６記載のシステム。
【請求項１９】
１以上のコンピュータ装置に方法を実行させるプログラムを記録した記録媒体であって、前記方法は、
ソフトウェアモジュールに関連する１以上の第一の数値に関する制約と１以上の第一の文字列に関する制約とを分析するステップであって、前記ソフトウェアモジュールは、１以上の数値の変数と、１以上の文字列の変数と、前記１以上の数値の変数のうちの特定の変数に適用され、数値又は文字列の結果を生成する１以上の第一の演算と、前記１以上の文字列の変数のうちの特定の変数に適用され、数値又は文字列の変数の結果を生成する１以上の第二の演算とを利用し、前記第一の数値に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、前記第一の文字列に関する制約は、前記１以上の文字列の変数のうちの特定の変数に適用される、ステップと、
前記１以上の文字列の変数のうちの特定の変数に適用される１以上の第二の数値に関する制約を推定するステップと、
前記１以上の数値の変数のうちの特定の変数に適用される１以上の第二の文字列に関する制約を推定するステップと、
前記第一の数値に関する制約と前記第二の数値に関する制約のそれぞれを式で表現するステップと、
前記第一の文字列に関する制約と前記第二の文字列に関する制約のそれぞれを有限状態マシンで表現するステップと、
全ての前記第一及び第二の数値に関する制約と全ての前記第一及び第二の文字列に関する制約とを満足する前記１以上の数値の変数と前記１以上の文字列の変数とのうちの特定の変数についての１以上の値を含む解を発見することを試みることで、１以上の可能性のあるエラーについて前記ソフトウェアモジュールを検査するステップと、
を含む、コンピュータ読み取り可能な記録媒体。
【請求項２０】
ソフトウェアモジュールに関連する１以上の第一の数値に関する制約と１以上の第一の文字列に関する制約とを分析する手段であって、前記ソフトウェアモジュールは、１以上の数値の変数と、１以上の文字列の変数と、前記１以上の数値の変数のうちの特定の変数に適用され、数値又は文字列の結果を生成する１以上の第一の演算と、前記１以上の文字列の変数のうちの特定の変数に適用され、数値又は文字列の変数の結果を生成する１以上の第二の演算とを利用し、前記第一の数値に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、前記第一の文字列に関する制約は、前記１以上の文字列の変数のうちの特定の変数に適用される、手段と、
前記１以上の文字列の変数のうちの特定の変数に適用される１以上の第二の数値に関する制約を推定する手段と、
前記１以上の数値の変数のうちの特定の変数に適用される１以上の第二の文字列に関する制約を推定する手段と、
前記第一の数値に関する制約と前記第二の数値に関する制約のそれぞれを式で表現する手段と、
前記第一の文字列に関する制約と前記第二の文字列に関する制約のそれぞれを有限状態マシンで表現する手段と、
全ての前記第一及び第二の数値に関する制約と全ての前記第一及び第二の文字列に関する制約とを満足する前記１以上の数値の変数と前記１以上の文字列の変数とのうちの特定の変数についての１以上の値を含む解を発見することを試みることで、１以上の可能性のあるエラーについて前記ソフトウェアモジュールを検査する手段と
を備えることを特徴とするシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアモジュールの検査及び認証に関する。
【背景技術】
【０００２】
ソフトウェアアプリケーションは、（たとえばクラス、機能、手順、サブルーチン又はコードブロックといった）多数のモジュールを含む場合があり、それぞれのモジュールは、個別に検査又は認証される場合がある。ソフトウェアモジュールは、手動的に又は自動的に検査又は認証される場合がある。前者の場合、（たとえばソフトウェアの検査エンジニアといった）人物は、そのモジュールの設計仕様に基づいてソフトウェアモジュールについてテストケースを手動で設計し、テストケース下でそのモジュールを実行し、テストケースに一致しないモジュールの挙動又は出力をチェックする場合がある。後者の場合、コンピュータソフトウェア又はハードウェアとして実現されるソフトウェア検査ツールは、検査されるソフトウェアモジュールについてテストケースを自動的に生成し、テストケースをシミュレートする一方で検査されるモジュールを実行し、テストケースに一致しないモジュールの挙動又は出力をチェックする。
【発明の概要】
【課題を解決するための手段】
【０００３】
本発明の開示は、添付図面に例示される幾つかの実施の形態を参照して詳細に記載される。以下の記載では、本発明の開示の全体的な理解を提供するため、多数の特定の詳細が述べられる。しかし、本発明の開示は、これらの特定の詳細の一部又は全部なしに実施される場合があることは、当業者にとって明らかである。他の例では、公知のプロセスのステップ及び／又は構造は、本発明を不必要に不明瞭にしないように詳細に説明されていない。さらに、本発明の開示は特定の実施の形態と合わせて記載されるが、本発明の記載は、記載される実施の形態の本発明を制限することが意図されないことを理解されたい。それとは反対に、本発明の記載は、特許請求の範囲により定義される本発明の開示の精神及び範囲に含まれる場合があるような代替、変更及び等価な概念をカバーすることが意図される。
【０００４】
ソフトウェアアプリケーションは、多数のソフトウェアモジュールに編成されることがあり、それぞれのソフトウェアモジュールは、特定の機能を実行するコードを含む場合がある。典型的なシナリオでは、ソフトウェアモジュールは、任意の数の入力変数又は出力変数を有する場合がある。ソフトウェアモジュールが起動されたとき、実際の入力値は、ソフトウェアモジュールの入力変数に割り当てられた値として、（たとえばソフトウェアモジュールを起動するコードにより）ソフトウェアモジュールに通過される場合がある。ソフトウェアモジュールのコードは、実際の入力値に関連して実行される場合がある。最終的に、ソフトウェアモジュールの出力変数の実際の出力値は、ソフトウェアモジュールにより決定されリターンされる場合があり、その時点で、ソフトウェアモジュールは、その実行を完了する。さらに、ソフトウェアモジュールのコードにより決定される実際の出力値は、通常、その起動に応じてソフトウェアモジュールに通過された実際の入力値に依存する。さらに、ソフトウェアモジュールは、中間変数とも呼ばれる任意の数のローカル変数を有し、その値は、直接的又は間接的に、入力変数の値に依存する場合がある。ローカル変数は、ローカルスコープを有する。ローカル変数は、ローカル変数が宣言されたソフトウェアモジュールのコンテキストにおいて存在し、ローカル変数が宣言されたソフトウェアモジュールのコンテキストのみからアクセス可能である。対照的に、ソフトウェアモジュールが属するソフトウェアアプリケーションは、任意の数のグローバル変数を有する場合がある。グローバル変数は、ソフトウェアアプリケーション自身においてグローバルスコープを有し、ソフトウェアアプリケーションに属する全てのソフトウェアモジュールにアクセス可能である。ソフトウェアアプリケーションが起動されたとき、ソフトウェアアプリケーションは、グローバル変数の値をアクセス又は変更する場合があり、値の変更は、ソフトウェアモジュールがその実行を完了した後でさえ持続する。
【０００５】
特定の実施の形態では、第一の変数の値が第二の変数の値に基づいて決定されたとき（すなわち第一の変数の値は第二の変数の値に依存する）、第一の変数は、第二の変数に依存すると考えられる。ある変数は、入力であろうと出力であろうと、ローカルであろうとグローバルであろうと、たとえば限定されることなしに、文字、文字列、整数、浮動小数、倍精度浮動小数点数、ブール、ポインタ、アレイ及びエミュレーションのような特定のデータタイプを有する。ある変数のデータタイプは、どのようなタイプのデータ（たとえば実際の値）が変数に割り当てられる場合があるかを示す。たとえば、整数値のみがそのタイプが整数である変数に割り当てられるべきであり、真偽値のみが、そのタイプがブールである変数に割り当てられるべきである。異なるプログラム言語は、特定のデータタイプに適用される場合がある異なる動作と同様に、特定の言語で書かれたソフトウェアモジュール又はアプリケーションが有する場合がある異なるデータタイプを定義する場合がある。特定の実施の形態では、プログラミング言語は、データタイプは、文字列と数値といった２つのカテゴリに分割される場合がある。数値データのタイプは、たとえば限定されるものではないが、整数、浮動小数点数、整数、倍精度浮動小数点数、及びブールのような文字列でないデータタイプを含む場合がある。
【０００６】
文字列は、異なるプログラミング言語がタイプ「文字列“string”」を異なって定義する場合があるが、多くのプログラミング言語において利用可能なデータタイプである。たとえば、Javaプログラミング言語は、文字の不変のアレイとして文字列を表すJavaクラス“java.lang.String”としてタイプ「文字列“string”」を定義するものである。この場合、ひとたび文字列変数が宣言されて形成されると、その値は、その後に変化することができない。ある文字列の変数の値への変更は、宣言及び構築されている新たな文字列の変数となる。また、“java.lang.String”は、ある文字列の変数に適用される場合があるメソッド“method”と呼ばれる多くの演算を提供する。他方で、Cプログラミング言語により、ある文字列は、ヌル文字で終端される１次元の文字配列として定義される。あるC文字列は、その値がインプレースで変更される場合があるように、変更可能である。実際に、配列におけるそれぞれの文字は、個々に変更される場合がある。
【０００７】
それぞれのプログラム言語は、利用可能な特定の数値データのタイプが言語から言語に変化する場合があるが、幾つかの数値データのタイプを一般的に定義する。整数、浮動小数点数、倍精度浮動小数点数及びブールは、大部分のプログラミング言語により一般的に定義される数値データのタイプである。さらに、異なるプログラミング言語は、特定の数値データのタイプを異なって定義する場合がある。たとえば、Javaプログラミング言語は、プリミティブなデータのタイプ“int”として又はJavaクラス“java.lang.Integer”として特定の数値データのタイプを異なって定義する場合がある。クラス“java.lang.Integer”は、整数の変数に適用される動作（すなわちメソッド）を提供する。他方で、Cは、異なるデータのサイズを有する整数の変数を宣言するために使用される場合がある“short”、“int”及び“long”といった３つのプリミティブなデータのタイプを提供する。
【０００８】
あるソフトウェアモジュールの入力、出力又はローカル変数に課される任意の数の制約が存在する。特定の実施の形態では、変数に課される制約は、たとえば限定されるものではないが、どのような値がその変数に割り当てられるか、変数に割り当てられるデータ値のサイズ、又は変数に課される他の適用可能な条件又は制限を指定する場合がある。係る変数の制約は、ソフトウェアモジュールの設計仕様又は形式的な要件、ソフトウェアモジュールを実現するために使用されるプログラミング言語の仕様、ソフトウェアモジュールのプログラムロジックに含まれるコード、ソフトウェアモジュールが実行されるランタイム環境、又は他の適用可能な要素から特定される場合がある。たとえば、制約は、整数の変数“ａ”のみが“0xFFFFFFFF”以下である整数値に割り当てられることを指定する整数値“ａ”に課される。これは、ソフトウェアモジュールは、４バイトを使用したそれぞれの整数を表すランタイム環境で実行されるからである。整数の変数“ａ”に課される制約は、式“ａ＜0xFFFFFFFF”として表される場合がある。別の例として、制約は、文字列の変数“ｓ”の長さ（すなわち文字数）が８でなければならないことを指定する文字列変数“ｓ”に課される場合がある。この場合、文字列の変数“ｓ”に課される制約は、例としてJavaプログラミング言語のシンタックスを使用して、別の式“s.length()  =  8”として表される場合がある。あるソフトウェアモジュールの１つの変数に課される制約は、直接的に又は間接的に、ソフトウェアモジュールの別の変数の値に課される制約に依存する場合がある。たとえば、（１）整数の変数“ｂ”が-10以上である整数の値にのみ割り当てられる、及び（２）整数の変数“ｂ”が変数“ａ”の値未満である整数の値にのみ割り当てられる、ことを指定する２つの制約が、整数の変数“ｂ”に一緒に課される場合がある。この場合、一緒に整数の変数“ｂ”に課される２つの制約は、“(b>=  -10)  &&  (b<a)”として表される場合があり、それぞれの制約は、この別の式として表される。
【０００９】
特定の実施の形態では、あるソフトウェアモジュールは、任意の数の数値又は文字列の変数を有する場合があり、これらの変数は、ソフトウェアモジュールの入力変数又はローカル変数（すなわち中間変数）である場合がある。特定の実施の形態では、ある制約のセットは、ソフトウェアモジュールの特定の数値又は文字列の変数に課される場合がある。なお、ある制約のセットが、あるソフトウェアモジュールのありとあらゆる変数に課される必要はない。特定の実施の形態では、数値の変数が与えられた場合、任意の数の数値の制約又は文字列の制約を有する場合がある。たとえば、整数の変数“ｂ”は、その値が-10以上でなければならないことを指定する数値の制約（たとえば制約“ｂ”>=  -10）を有する場合がある。整数の変数“ｂ”は、その値のテキスト（すなわち文字列）の表現は文字列“182”に等しくなければならないことを指定する文字列の制約（たとえば制約“b.toString()  =  “182””）を有する場合もある。この場合、整数の変数“ｂ”に課される制約のセットは、数値の制約と文字列の制約の両者、従って制約が混成されたセットである（たとえば“(b  >=  -10)  &&  (b.toString()  =  “182”)”）を含む。同様に、特定の実施の形態では、文字列の変数が与えられると、任意の数の文字列の制約又は数値の制約を有する場合がある。たとえば、文字列の変数“ｓ”がその値がサブの文字列“ｃａ”で開始しなければならないことを指定する文字列の制約（たとえば制約“s.substring(0,1)  =  “ca””又は“s.startsWith(“ca”)”）を有する場合がある。文字列の変数“ｓ”は、その値が８の文字の長さを有しなければならないことを指定する数値の制約（たとえば制約“s.length()  =  8”）を有する場合もある。この場合、文字列の変数“ｓ”に課される制約のセットは、数値の制約と文字列の制約の両者、従って制約が混成されたセットである（たとえば“(s.substring(0,1)  =  “ca”)  &&  (s.length()  =  8)”）を含む。
【００１０】
特定の実施の形態では、あるソフトウェアモジュールに課される制約は、入力、出力及びローカル変数を含めて、その変数に課される全ての制約を組み合わせて含む場合がある。たとえば、整数の変数“ｂ”と文字列の変数“ｓ”の両者があるソフトウェアモジュール“m”に属するとする。この場合、ソフトウェアモジュール“m”自身に課される制約のセットは、変数“ｂ”及び“ｓ”のそれぞれに課される２つの制約のセットの論理結合を含み、これは、“(b  >=  -10)  &&  (b.toString()  =  “182”)  &&  (s.substring(0,1)  =  “ca”)  &&  (s.length()  =  8)”に等しい。これも、数値の制約と文字列の制約の両者を含むために、制約が混成されたセットである。
【図面の簡単な説明】
【００１１】
【図１】ソフトウェアモジュール又はその変数に配置される制約を決定及び解決する例示的な方法を示すフローチャートである。
【図２】ソフトウェアモジュール又はその変数に配置される制約を決定及び解決する例示的なシステムを示すブロック図である。
【図３】異なる文字列を表すために使用される幾つかの例示的な有限の状態を示す図である。
【図４】文字列及びそのサブ文字列を表すために使用される例示的な有限の状態マシンを示す図である。
【図５】文字列の領域に配置される文字列の制約と数値の領域に配置される数値の制約とをもつ例示的な制約のセットを示す図である。
【図６】複数レベルの入れ子構造にされた条件付き分岐を有する例示的なソフトウェアモジュールの実行経路を示すフローチャートである。
【図７】ソフトウェアモジュールを検査する例示的な方法を示すフローチャートである。
【図８】例示的なソフトウェアモジュールでの記号的実行を実行するステップを表す例示的な実行を示すフローチャートである。
【図９Ａ】異なるアプリケーションの結果を生成するために実行及び配置される記号的実行の間に、例示的なソフトウェアモジュールについて取得される例示的な制約のセットを示す図である。
【図９Ｂ】異なるアプリケーションの結果を生成するために実行及び配置される記号的実行の間に、例示的なソフトウェアモジュールについて取得される例示的な制約のセットを示す図である。
【図９Ｃ】異なるアプリケーションの結果を生成するために実行及び配置される記号的実行の間に、例示的なソフトウェアモジュールについて取得される例示的な制約のセットを示す図である。
【図１０】その入力及び出力に配置される要件に関連してソフトウェアモジュールを認証する例示的な方法を示すフローチャートである。
【図１１】インジェクション攻撃を検出するために設計されたセキュリティソフトウェアモジュールを認証する例示的な方法を示すフローチャートである。
【図１２】例示的なネットワーク環境を示すブロック図である。
【図１３】例示的なコンピュータシステムを例示する図である。
【発明を実施するための形態】
【００１２】
特定の実施の形態では、任意の数の数値の変数又は文字列の変数を有するソフトウェアモジュールに課される制約が混成されたセットを決定及び解決するために有益である。また、あるソフトウェアモジュールの特定の変数に課される制約が混成されたセットを決定及び解決するために有益である。特定の実施の形態では、制約のセットを解決することは、そのセットに含まれる全ての制約を満足する１以上の解を発見するのを試みることを意味する。図１は、あるソフトウェアモジュール又はあるソフトウェアモジュールのある変数に課される制約を決定及び解決する例示的な方法を示す。図２は、あるソフトウェアモジュール又はあるソフトウェアモジュールの変数に課される制約を決定及び解決する例示的なシステム２００を示す。特定の実施の形態では、図２に示されるシステム２００の構成要素は、コンピュータハードウェア又はソフトウェア或いはその組み合わせとして実現される。図１及び図２は、互いに関連して記載される。
【００１３】
特定の実施の形態では、あるソフトウェアモジュールは、任意の数の数値の変数又は文字列の変数を有する場合がある。たとえばソフトウェアモジュール“m”は、整数の変数“vi”、ブール変数“vb”及び文字列の変数“vs”を有する場合がある。この場合、変数“vi”及び“vb”は、数値の変数である。特定の実施の形態では、これらの変数は、ソフトウェアモジュールの入力、出力又はローカル変数である場合がある。
【００１４】
特定の実施の形態では、はじめに、ソフトウェアモジュールの特定の数値の変数に課される任意の数の数値の制約、及びソフトウェアモジュールの特定の文字列の制約に課される任意の数の文字列の制約が存在する場合がある。より詳細には、数値の制約のセットが、特定の数値の変数について指定されて、特定の数値の変数に課されるか、又は、文字列の制約のセットが、特定の文字列の変数について指定されて、特定の文字列の変数に課される場合がある。それぞれの制約のセットは、１以上の特定の制約を含む場合がある。たとえば、数値の制約のセット“nc1-vi”が、整数の変数“vi”について指定され、整数の変数“vi”に課され、数値の制約のセット“nc1-vb”が、ブール変数“vb”について指定され、ブール変数“vb”に課され、文字列の制約のセット“sc1-vs”が、文字列の変数“vs”について指定され、文字列の変数“vs”に課される。特定の実施の形態では、これらの制約の最初のセット（たとえば“nc1-vi”、“nc1-vb”及び“sc1-vs”）が、ソフトウェアモジュールの設計仕様又は形式的な要件に基づいて指定される。
【００１５】
特定の実施の形態では、ソフトウェアモジュールにおいて、ソフトウェアモジュールの特定の数値の変数に適用される任意の数の演算が存在し、この演算は、数値の入力を必要とするか、又は数値の出力を生成する。たとえば、整数の変数“vi”に適用される演算は、“ri  =  vi  +  10”であり、この演算は、入力として“vi”及び“10”の値である２つの数値を要し、出力として“ri”の値である数値を生成する。
【００１６】
特定の実施の形態では、ソフトウェアモジュールにおいて、ソフトウェアモジュールの特定の数値の変数に適用される任意の数の動作が存在し、この演算は、文字列の入力を要するか又は文字列の出力を生成する。たとえば、ブール変数“vb”に適用される演算は、“vb.toString()”であり、この演算は、その出力として、ブールの変数“vb”の値の文字列の表現（たとえば文字列“true”）である、文字列の値を生成する。
【００１７】
特定の実施の形態では、ソフトウェアモジュールにおいて、ソフトウェアモジュールの特定の文字列の変数に適用される任意の数の演算が存在し、この演算は、文字列の入力を要するか又は文字列の出力を生成する。たとえば、文字列の変数“vs”に適用される演算は、“rs  =  vs.contact(“abc”)”であり、この演算は、入力として“vs”及び“abc”の値である２つの文字列の値を要し、出力として“rs”の値である文字列の値を生成する。
【００１８】
特定の実施の形態では、ソフトウェアモジュールにおいて、ソフトウェアモジュールの特定の文字列の変数に適用される任意の数の演算が存在し、この演算は、数値の入力を要するか又は数値の出力を生成する。たとえば、文字列の変数“vs”に適用される演算は、“vs.length()”であり、この演算は、文字列の変数“vs”の値に含まれる文字数を示す数値をその出力として生成する。文字列の変数“vs”に適用される別の演算は、“vs.substring(5,7)”であり、この演算は、入力として２つの数値を要する。
【００１９】
特定の実施の形態は、図１のステップ１０２に示されるように、（たとえばソフトウェアモジュール“m”といった）ソフトウェアモジュール、ソフトウェアモジュールの（たとえば整数の変数“vi”に課される数値の制約“nc1-vi”及びブール変数“vb”に課される数値の制約“nc1-vb”といった）特定の数値の変数について最初に指定され、課される数値の制約のセット、及び、ソフトウェアモジュールの（たとえば文字列の変数“vs”に課される文字列の制約“sc1-vs”といった）特定の文字列の変数について最初に指定され、課される文字列の制約のセットを分析する。特定の実施の形態では、数値及び文字列の制約は、ソフトウェアモジュールの入力又は中間の変数（すなわちローカル変数）の何れかに課される。勿論、特定の実施の形態では、数値の制約のセットがソフトウェアモジュールのありとあらゆる数値の変数に最初に課される必要はなく、また、文字列の制約のセットがソフトウェアモジュールのありとあらゆる文字列の変数に最初に課される必要はない。特定の数値の変数のみが関連される数値の制約を最初に有し、また、特定の文字列の変数のみが関連される文字列の制約を最初に有することもできる。
【００２０】
特定の実施の形態では、ソフトウェアモジュールの入力変数に最初に課される数値又は文字列の制約について、ソフトウェアモジュールの設計仕様又は形式的な要件に従って制約が決定される場合がある。ソフトウェアモジュールの中間の変数に最初に課される数値又は文字列の制約について、ソフトウェアモジュールで記号的実行を行うことで制約が決定される場合がある。記号的実行は、図８と共に以下に詳細に記載される。要するに、特定の実施の形態は、ソフトウェアモジュールの入力変数のそれぞれに記号の値を割り当てる一方で、ソフトウェアモジュールでの記号的実行を行う。ソフトウェアモジュールの中間の変数は、直接的又は間接的に、ソフトウェアモジュールの１以上の入力変数に依存するので、ソフトウェアモジュールで記号的実行を行うことで、中間変数について、それが特定の入力変数に有する依存度を示す記号の表現のセットが得られる。特定の実施の形態は、中間の変数について得られる記号的表現のセットに基づいて中間の変数に課される制約と、中間の変数が依存する特定の入力の変数に課される制約のセットを決定する。たとえば、ソフトウェアモジュール“m”により、“vi”は入力変数、“ri”は中間変数、及び“ri  =  vi  +  10”とする。この場合、ソフトウェアモジュール“m”に記号的実行を行うことで、中間の変数“ri”が入力の変数“vi”に依存することを判定する。さらに、“vi  >  0”であるように、数値の制約が入力の変数“vi”に課されているとする。記号的実行の結果と入力の変数“vi”に課された数値の制約とに基づいて、数値の制約は、“ri  >  10”となるように中間変数“ri”について決定される。
【００２１】
図１のステップ１０２に示される分析から、特定の実施の形態は、図１のステップ１０４に示されるように、ソフトウェアモジュールの特定の数値の変数に課された文字列の制約のセット、及びソフトウェアモジュールの特定の文字列の制約に課された数値の制約のセットを推定する。特定の実施の形態では、図１のステップ１０２及び１０４は、図２に示されるシステム２００の構成要素２０２により実行される場合がある。特定の実施の形態では、構成要素２０２は、ソフトウェアモジュール２１２及びソフトウェアモジュール２１２の変数に最初に課された制約２１４を入力として受け、この制約は、ソフトウェアモジュールの数値の変数について最初に指定され、課された数値の制約と、ソフトウェアモジュールの文字列の変数について最初に指定され、課された文字列の制約を含む。構成要素２０２は、適用可能な分析を行い、ソフトウェアモジュール２１２の数値の変数に課された文字列の制約と、ソフトウェアモジュール２１２の文字列の変数に課された数値の制約とを推定する。構成要素２０２は、出力として、ソフトウェアモジュール２１２の変数に課された指定された制約であって、推定された制約の両者含む数値の制約と文字列の制約とが混成されたセットを提供する。
【００２２】
特定の実施の形態では、ソフトウェアモジュールの変数の制約は、様々な要素に基づいて推定される場合があり、本発明の開示は、適用可能な要素を含んでいる。たとえば限定することなしに、特定の変数に適用される演算、ソフトウェアモジュールを実現するために使用されるプログラミング言語の仕様、ソフトウェアモジュールが実行されるランタイム環境及びこれらの複数の要素の組み合わせに基づいて、数値の制約は、数値の変数と文字列の変数との両者について推定され、文字列の制約は、数値の変数と文字列の変数の両者について推定される。
【００２３】
特定の実施の形態では、数値の変数が与えられると、数値の変数に適用される演算に基づいて文字列の制約が推定され、これにより、文字列の結果が生成される。たとえば、(vi.toString()),split(“0”)”という２つの演算がソフトウェアモジュール“m”における整数の変数“vi”に適用されるとする。この演算の最初の手順は、整数の変数“vi”の値の文字列の表現（たとえば数182は、文字列“182”として表現される）を生成し、次の手順で、この文字列を文字“0”の位置で新たな文字列に分割する。第二の演算（すなわち文字列の分割演算）を成功させるため（たとえばヌル文字列とならないため）、整数の変数“vi”の値の文字列の表現が少なくとも１つの文字“0”を含まなければならないという、文字列の制約が演算から推定される。
【００２４】
特定の実施の形態では、数値の変数が与えられると、数値の制約は、数値の変数に適用される演算に基づいて推定され、これにより数値の結果が生成される。たとえば、“Math.sqrt(vi)”という演算がソフトウェアモジュール“m”における整数の変数“vi”に適用されるとする。この演算は、整数の変数“vi”の値の平方根を与える。この演算をエラーに遭遇することなしに実行するため、整数の変数“vi”の値が0以上でなければならないことを指定する数値の制約が演算から推定される。
【００２５】
特定の実施の形態では、文字列の変数が与えられると、文字列の変数に適用される演算に基づいて文字列の制約が推定され、これにより文字列の結果が生成される。たとえば、“s.repalceAll(“abc”,  “xyz”)”という演算がソフトウェアモジュール“m”における文字列の変数“s”に適用されるとする。この演算は、文字列の変数“s”で発見される全てのサブ文字列“abc”を“xyz”で置き換える。この演算が文字列の変数“s”の値に実際の影響を及ぼすため、文字列の変数“s”の値が少なくとも１つのサブ文字列“abc”の発生を含まなければならないという、文字列の制約が演算から推定される。
【００２６】
特定の実施の形態では、文字列の変数が与えられると、数値の制約は、数値の結果を生成することになる文字列の変数に適用される演算に基づいて推定されるか、１以上の数値の入力を受けることになる文字列の変数に適用される演算に基づいて推定される。たとえば、“s.startsWith(“abc”)”という演算がソフトウェアモジュール“m”における文字列の変数“s”に適用され、この演算は、文字列の変数“s”の値がサブ文字列“abc”で開始するかを示す真又は偽としてブールの結果を生成する。この演算を上手く実行するため、文字列の変数“s”の値は、少なくとも３つの文字を有さなければならない。従って、文字列の変数“s”の長さが３以上でなければならないことを指定する数値の制約がこの演算から推定される。別の例として、“s.substring(6)”という演算がソフトウェアモジュール“m”における文字列の変数“m”に適用されるとする。この演算は、入力として数値を受ける。この演算を上手く実行するため（たとえばヌル文字列とならないため）、文字列の変数“s”の値は、少なくとも６つの文字を有さなければならない。従って、文字列の変数“s”の長さが６以上でなければならないことを指定する数値の制約がこの演算から推定される。
【００２７】
先の例では、ソフトウェアモジュールにおいて、文字列の結果を生成する演算が数値の変数に適用されるか、又は、数値の入力を受けるか又は数値の結果を生成する演算が文字列の変数に適用される。特定の実施の形態では、これらの演算から、数値の制約が推定されて、特定の文字列の変数に課され、文字列の制約が推定されて、特定の数値の変数に課される。特定の実施の形態では、数値又は文字列である変数が与えられると、変数に課される完全な制約のセットは、もしあれば変数について最初に指定された制約と、もしあれば変数について推定される制約との両者を含む。この制約のセットは、数値の制約又は文字列の制約、或いはその両者を含む。変数に課される制約のセットは、変数に適用される個々の演算に基づいて変数について推定されるため、特定の実施の形態は、このように取得された制約のセットを相互作用するハイブリッドな制約のセットと呼ぶ。特定の実施の形態では、任意の数の数値又は文字列の変数を有するソフトウェアモジュールが与えられると、ソフトウェアモジュール自身に課される制約のセットは、ソフトウェアモジュールの個々の変数に課される全ての制約を含む。
【００２８】
あるソフトウェアモジュールの変数に課されるハイブリッドな制約のセットが与えられると、特定の実施の形態は、図１のステップ１０６に示されるように、数式（たとえば“vi  >=  0”，“vb  =  true”又は“s.length()  >=  6”）でセットにおけるそれぞれの数値の制約を表し、セットにおけるそれぞれの文字列の制約を有限状態マシン（FSM）で表す。
【００２９】
一般に、FSMは、有限の状態、これら状態間の遷移及びアクションの数から構成される挙動のモデルである。特定の実施の形態では、FSMは、文字列を表現するために使用される。図３は、文字列を表現するために使用される幾つかのFSMを示す。図３において、それぞれのFSMにより、中間の状態は、１つの円により表現され、許可状態は、二重の円により表現され、ある状態への入力は、円につながる矢印により表現される。
【００３０】
たとえば、FSM３１０は、ある文字列“s”を表し、この文字列は、任意の文字を有し、任意の長さからなる。FSM３２０は、ある文字列を表し、この文字列は、少なくとも１つの文字を有しており、文字列の最後の文字は、“Z”であり、制約“S.endsWidth(“z”)  =  true”を表現するために使用される。FSM３３０は、ある文字列を表し、この文字列は、３以上の文字を有しており、“S.length()  >=  3”を表現するために使用される。
【００３１】
FSM３４０は、ある文字列“S”を表し、この文字列は、少なくとも１つの文字を有し、少なくとも１つの“Z”を含み、“Z”の遷移は、文字列における最後の“Z”を意味する。FSM３５０は、文字列“S”を表し、この文字列は、“Z”である任意の文字を有さない。制約“(a  =  S.lastIndexOf(“z”))”を考える。この制約から、“a  >=  0”である場合に、“(S.substring(a,  a+1)  =  “Z”)”であることを推定することができる。FSM３４０は、先の制約が満足された場合、すなわち文字列“S”が少なくとも１つの“Z”の文字を含み、“S”に生じる最後の“Z”は、“a”の値に等しいインデックスである場合を表す。他方で、FSM３５０は、制約のセットが満たされない場合、すなわち文字列“S”が任意の文字“Z”を含まない、従って“a  =  -1”である場合を表す。従って、制約“a  =  S.lastIndexOf(“Z”)”により、記号的実行ツリーにおける分岐となり、一方のブランチで、更なる数値の制約“a  >=  0”をもつFSM３４０の場合が想定され、他方のブランチで、更なる制約“a  =  -1”をもつFSM３５０の場合が想定される。
【００３２】
図４は、文字列“S”とそのサブ文字列の１つ“S.substring(2,4)”を表すために使用される別の例示的なFSM４００を示す。この例では、状態４０２は、文字列“S”の開始ポイントであり、状態４０４は、文字列“S”の許可状態（すなわち終了ポイント）である。サブ文字列“S.substring(2,4)”は、第３の文字で開始し、第五の文字で終了する“S”のサブ文字列である。なお、Javaプログラミング言語によれば、インデックスは、0で開始し、すなわち最初のエレメントのインデックス番号は、0である。従って、インデックス番号2は、第三のエレメントを示し、インデックス番号4は、第五のエレメントを示す。サブ文字列“S.substring(2,4)”について、開始ポイントは、文字列“S”の第三の文字に対応する文字列“S”の開始状態４０２から第三の状態であり、文字列“S”の第三の文字に対応する。図４では、３つの状態４１２Ａ，４１２Ｂ及び４１２Ｃが存在し、それぞれの状態は、開始状態４０２からの第三の状態であり、それらの１つは、サブ文字列“S.substring(2,4)”について可能性のある開始状態４１２である。サブ文字列“S.substring(2,4)”について、終了ポイント（すなわち許可状態）は、文字列“S”の開始状態４０２から第五の状態であり、文字列“S”の第五の文字に対応する。図４では、３つの状態４１４Ａ，４１４Ｂ及び４１４Ｃが存在し、これらの状態は、開始状態４０２から第五の状態である、それらのうちの１つは、サブ文字列“S.substring(2,4)”について可能性のある許可状態４１４である。なお、図４において、“ε”は、ゼロ入力の状態を示す。
【００３３】
特定の実施の形態では、制約のセットが与えられると、セットからのそれぞれの数値の制約は、適用可能な数式を使用して表現され、セットからのそれぞれの文字列の制約は、適用可能なFSMを使用して表される。さらに、このように表現された制約のセットが与えられると、特定の実施の形態は、図１のステップ１０８に示されるように、同時にセットにおける全ての制約を満たす１以上の解を発見するために制約を解くことを試みる。特定の実施の形態では、図１のステップ１０８は、図２に示されるシステム２００の構成要素２０４により実行される。特定の実施の形態では、構成要素２０４は、SMT（Satisfactory  Modulo  Theories）に部分的に基づいて実現される制約の解決手段である。特定の実施の形態では、構成要素２０４は、数式を使用して表現される数値の制約と、FSMを使用して表現される文字列の制約の一方又は両方を含む制約のセットを入力として受け、セットから全ての制約を満たす１以上の解を発見することを試みる。何れかの解が発見された場合、構成要素２０４は、その出力として解を与える。勿論、制約のセットがセットからの全ての制約を満たす何れかの解を有さない可能性がある。たとえば、制約のセット“(s.equals(q))  &&  (s.startsWith(“uvw”))  &&  (q.endsWith(“xyz”))  &&  (s.length()  <  a)  &&  ((a  +  b)  <  6)  &&  (b  >  0)”を考える。この場合、“s”及び“q”は文字列であり、“a”及び“b”は整数である。同時にこのセットからの全ての制約を満たす“s”、“q”、“a”及び“b”の値の組み合わせは存在しない。従って、この特定の制約のセットは満足されない。
【００３４】
特定の実施の形態は、反復アルゴリズムを使用して制約が混成されたセットを解く。特定の実施の形態は、FSMを使用して表現された、セットからの全ての文字列の制約を文字列の領域でグループ化し、数式を使用して表現された、セットからの全ての数値の制約を数値の領域でグループ化する。特定の実施の形態は、次いで、（１）セットにおける全ての制約を満たす１以上の解が発見されるまで、（２）セットにおける全ての制約を満たす解がないと判定されるまで、又は（３）実行される繰返しの回数が予め決定された閾値に到達するまで（（１）〜（３）の何れか早いほう）、数値領域又は文字列領域の何れかで１以上の解（すなわちセットにおける全ての数値の制約又はセットにおける全ての文字列の制約の何れかを満足させる解）を発見する試みを繰返し、一方の領域で発見された解を他方の領域に供給する。特定の実施の形態は、SMT（Satisfactory  Modulo  Theory）解法を使用して数値の領域において数値の制約を解き、正規表現ユニオンアルゴリズム、交差アルゴリズム、補完アルゴリズム、Kleene  starアルゴリズム及び他の適用可能なアルゴリズムを使用して、文字列領域において文字列の制約を解く。さらに、特定の実施の形態は、制約が混成されたセットについて１以上の解を発見するのを試みるとき、以下を考慮する。はじめに、数値領域のみにおける数値の制約が満足のいくものではない場合（すなわち、セットにおける数値の制約を満たす解が存在しない場合）、全体の制約のセットが満足のいくものではない。文字列領域のみにおける文字列の制約の解がヌル文字列（すなわち空の文字列）である場合、セットにおいて数値の制約が全くない場合、そのセットは満足のいくものではなく、さもなければ、そのセットにおける数値のセットは、ヌル文字列により更に制約される。
【００３５】
繰返しの手順を更に説明するため、例示的な制約のセット“s.startsWith(“uvw”)  &&  s.endsWith(“xyz”)  &&  (a  =  s.lastIndexOf(“t”)  &&  (s.length()  <=  b)  &&  (b  +  c  <=  8)  &&  ((a  +  d)  >=  4  &&  (c  >  0)  &&  (d  <  0))”を考える。この場合、“s”は文字列であり、“a”，“b”，“c”及び“d”は整数である。この制約のセットを満たす解は、セットにおける全ての個々の制約が同時に満たす、文字列“s”及び整数“a”，“b”，“c”及び“d”のそれぞれについて５つの値の組み合わせが存在することを意味する。より詳細には、制約“s.startWith(“uvw”)”を満足させるため、“s”の最初の３つの文字は“uvw”となる必要がある。制約“s.endsWith(“xyz”)を満たすため、“s”の最後の３つの文字は、“xyz”となる必要がある。制約“a  =  s.lastIndexOf(“t”)”を満たすため、“s”における文字“t”の最後の発生は、“a”の値に等しいインデックス番号である。制約“s.length()  <=  b”を満たすため、“s”における文字の数は、“b”の値以下でなければならない。制約“b  +  c  <=  8”を満たすため、“b”及び“c”の値の合計は、８以下でなければならない。制約“(a  +  d)  >=  4”を満たすため、“a”及び“d”の値の合計は、４以上でなければならない。制約“c  >  0”を満たすため、“c”の値は、０よりも大きくなければならない。制約“d  <  0”を満たすため、“d”の値は、０未満でなければならない。
【００３６】
図５は、文字列領域５１０における先の例示的な制約のセットにおける文字列の制約５１２、及び数値領域５２０における先の例示的な制約のセットにおける数値の制約５２２を課すことを示す。最初の繰返し５３１の間、特定の実施の形態は、文字列領域５１０のみにおいて解を発見するのを試みる。３つの文字列の制約５１２は、以下の点を必要とする。（１）文字列“s”の最初の３つの文字が“uvw”でなければならないこと。（２）文字列“s”の最後の３つの文字は、“xyz”でなければならないこと。（３）文字列“s”における少なくとも１つの“t”の発生がなければならないこと。（４）“t”は“uvw”の後であって、“xyz”の前にある必要がある。従って、全ての４つの要件を満たす最短の文字列は、“uvwtxyz”である。全ての４つの要件を満たす他の可能な長い文字列（たとえば“uvwabtthxyz”又は“uvwt3fkxyz”）が存在する。しかし、特定の実施の形態は、最も簡単な可能な解（すなわち、文字列又は数値の制約により指示される全ての要件を満たす最短の文字列又は最小の値）を常に最初に選択する。この場合、全ての４つの要件を満たす最短の文字列は、“uvwtxyz”である。文字列領域５１０で発見された、この文字列の解“uvwtxyz”は、“a”、“b”、“c”及び“d”について解を発見するために数値領域５２０に供給される。
【００３７】
第二の繰返し５３２の間、特定の実施の形態は、前の繰返しの間に“s”について発見された解（すなわち“uvwtxyz”）から整数“a”、“b”、“c”及び“d”に課される更なる制約５２４を導出する。たとえば、制約“s.length()  <=  b”は、“s”における文字の数が“b”の値以下でなければならないことを必要とする。文字列領域５１０で発見された“s”の最短の文字列の解は７つの文字のうちの最小を有さなければならないので、これは、“b  >=  7”であることを意味する。制約“a  =  s.lastIndexOf(“t”)”は、“s”における文字“t”の最後の発生は、“a”の値に等しいインデックス番号を有さなければならない。“t”は“s”における最後の文字ではないので、これは、“a  <  b”であることを意味する。さらに、“t”は、“s”における最初の３つの文字の何れかではないので、これは、“a  >=  3”であることを意味する。特定の実施の形態は、“s”の解から導出される、“a”、“b”及び“c”に課される３つの更なる数値の制約５２４を、セットからの４つの数値の制約５２２に追加し、文字列“s”の解から導出されたものと同様に、セットからのものを含めて、全ての数値の制約５２２，５２４を満たす“a”、“b”、“c”及び“d”の値を発見するのを試みる。さらに、全ての数値の制約を満たす整数“a”、“b”、“c”及び“d”の多数の値が存在する場合、特定の実施の形態は、最小の値を最初に選択する。セットからの４つのオリジナルの数値の制約５２２と、３つの更なる導出された数値の制約５２４とから、特定の実施の形態は、“a”、“b”、“c”及び“d”について可能な解を“a  =  5”、“b  =  7”、“c  =  1”及び“d  =  -1”として決定する。実際に、“a”について、5，6である2つの可能な値が存在する。値５は、最小であり、従って“a”について最初に選択される。これらの４つの値は、文字列の制約に対して検証されるため、文字列領域５１０にフィードバックされる。
【００３８】
第三の繰返し５３３の間、第二の繰返し５３２の間に数値領域５２０で発見される“a”、“b”、“c”及び“d”の解は、文字列領域５１０において文字列の制約に対して確認される。“s”が“uvwtxyz”である場合、“t”のインデックスは３であり且つ“a”の値に等しいはずであるので、“a”は５に等しくすることはできない。この“a”に関する新たな制約５２６（すなわち“a  !  =  5”）は、数値領域５２０にフィードバックされる。
【００３９】
第四の繰返し５３４の間、制約５２６である“a  !  =  5”は、他の既存の数値の制約５２２，５２４に追加される。全ての現在存在する数値の制約５２２，５２４及び５２６を満たす“a”、“b”、“c”及び“d”の次の可能性のある解は、“a  =  6”、“b  =  7”、“c  =  1”及び“d  =  -1”である。この解は、文字列領域５１０にフィードバックされる。
【００４０】
第五の繰返し５３５の間、前の繰返しの間に数値領域５２０において“a”、“b”、“c”及び“d”について発見された解（すなわち、“a  =  6”、“b  =  7”、“c  =  1”及び“d  =  -1”）は、文字列領域５１０において文字列の制約に対して同様に確認される。さらに、“s”が“uvwtxyz”である場合、“a”を６に等しくすることはできない。これにより、“a”に関して新たな制約５２８である“a  !  =  6”が得られ、数値領域５２０にフィードバックされる。
【００４１】
第六の繰返し５３６の間、制約５２８である“a  !  =  6”は、他の既存の数値の制約５２２，５２４，５２６に追加される。全ての数値の制約５２２，５２４，５２６，５２８をい満たす解を発見する試みが行われる。しかし、全ての現在の既存の数値の制約５２２，５２４，５２６及び５２８を満たす“a”、“b”、“c”及び“d”の値が存在しない。従って、“s”が“uvwtxyz”に等しい場合、全ての数値の制約を満たす“a”、“b”、“c”及び“d”の発見することができる解が存在しない。なお、この場合、“s”は７を超える文字を有することはできない。これは、３つの制約“s.length()  <=  b”，“b  +  c  <=  8”及び“c  >  0”のためである。より詳細には、“c  >  0”であるので、“c”が有する最小の値は１である。“b  +  c  <=  8”であるので、“c”が有する最小の値が１である場合、“b”が有する最長の値は７である。これは、“s.length()  <=  b”であるので、“s”が有する最長の長さは７文字であることを意味する。現段階で、この制約のセットは満足のいくものではないことが判定される。従って、プロセスは終了する。
【００４２】
図１に示される例示的なプロセスは、ソフトウェアモジュールに課される制約が混成されたセット（すなわち数値の制約及び文字列の制約の両者を含む制約のセット）又はソフトウェアモジュールの特定の変数を決定し、このセットから全ての制約を満たす解を発見するのを試みるために使用される。係るプロセスについて様々な実用的な応用が存在する。
【００４３】
特定の実施の形態では、図１に示されるようなプロセスは、ソフトウェアモジュールのテストデータを自動的に生成するために使用される。次いで、テストデータは、ソフトウェアモジュールにおけるエラーを検出するために使用される。しばしば、ソフトウェアモジュールは、（たとえば“if-else”命令文のような）任意の数の条件分岐点を含み、それぞれの条件分岐点は、ソフトウェアモジュールの１以上の変数（たとえば入力変数又はローカル変数）により指定される分岐条件を有する。分岐条件が満たされるか否かに依存して、ソフトウェアモジュールは、条件分岐点で異なる実行経路に進む。条件分岐点を更に説明するため、例示的なソフトウェアモジュールの以下の例示的なコードセグメントを考える。
【表１】
0005786513.tif 000002
【００４４】
先の例において、“m”，“n”及び“k”は、例示的なソフトウェアモジュールの変数である。ライン１で、条件分岐点が存在し、分岐条件は、“m  >  n  &&  k  <=  10”である。なお、分岐条件は、多数のサブ条件（たとえば“m  >  n”及び“k  <=  10”）を含む場合がある。ライン１での分岐条件が満足されるため（すなわち当てはまるため）、変数“m”の値は、変数“n”の値よりも大きい必要があり、変数“k”の値が１０以下である必要がある。ライン１での分岐条件が満たされた場合、ライン２〜１１の間のコードが実行される。さもなければ（すなわちライン１での分岐条件が満たされない場合）、ライン１３でのコードが実行される。ライン３で、別の条件分岐点が存在し、分岐条件は、“k  >  2”である。ライン３での分岐条件が満たされるため、変数“k”の値は、２を超える必要がある。同様に、ライン３での分岐条件が満たされる場合、ライン４でのコードが実行される。さもなければ、ライン６〜１１の間のコードが実行される。ライン６には、第三の条件分岐点が存在し、分岐条件は、“n  ==  k  ||  n  ==  m”であり、複数のサブ条件（たとえば“n  ==  k”及び“n  ==  m”）を含む。ライン６での分岐条件が満たされるため、変数“n”の値は、変数“k”の値又は変数“m”の値の何れかに等しい必要がある。ライン６での分岐条件が満たされる場合、ライン７でのコードが実行される。さもなければ、ライン９でのコードが実行される。
【００４５】
さらに、ライン３での条件分岐点は、ライン１での条件分岐点で入れ子構造にされ、ライン６での条件分岐点は、ライン３での条件分岐点で更に入れ子構造にされる。ライン１での条件分岐点に関連される分岐条件が満たされない場合、ライン３での条件分岐点は、コードの実行の間に到達されない。しかし、ライン３での条件分岐点に関連する分岐条件が満たされない場合、ライン６での条件分岐点は、コードの実行の間に到達される。実際に、ライン６での条件分岐点に到達するため、ライン１での分岐条件は、満たされる必要があるが、ライン３での分岐条件は、満たされない。
【００４６】
従って、ソフトウェアモジュールにおけるそれぞれの条件分岐点で、条件分岐点に関連する分岐条件が満たされたかに依存して、ソフトウェアモジュールは、異なる実行経路に沿って進む。図６は、複数レベルの入れ子構造にされた条件分岐を有する例示的なソフトウェアモジュールの実行経路を示す。条件分岐点６０２で、“CONDITION  1”が満たされた場合、実行経路は処理ステップ６１２に進み、“CONDITION  1”が満たされない場合、実行経路は、処理ステップ６１４に進む。条件分岐点６０２において入れ子構造にされた条件分岐点６０４で、“CONDITION  2”が満たされた場合、実行経路は、処理ステップ６１６に進み、“CONDITION  2”が満たされない場合、実行経路は終了する。条件分岐点６０２において入れ子構造にされる条件分岐点６０６で、“CONDITION  3”が満たされた場合、実行経路は終了し、“CONDITION  3”が満たされない場合、実行経路は、条件分岐点６０８に進む。条件分岐点６０６において更に入れ子構造にされた条件分岐点６０８で、“CONDITION  6”が満たされた場合、実行経路は処理ステップ６０８に進み、“CONDITION  6”が満たされない場合、実行経路は、処理ステップ６２２に進む。図６において、５つの可能性のある実行経路が存在し、ソフトウェアモジュールは、個々の条件分岐点６０２，６０４，６０６及び６０８で分岐条件が満たされたかに依存して、５つの可能性のある実行経路の何れか１つに沿って進む。
【００４７】
特定の実施の形態は、分岐条件を表す変数に課される数値又は文字列の制約として分岐条件を考える。たとえば、SAMPLE  CODE  1のライン１で、分岐条件は“m  >  n  &&  k  <=  10”である。分岐条件が満たされた場合、“m”の値は、“n”の値よりも大きく、“k”の値は、１０以下でなければならない。これは、“m”、“n”及び“k”に課される制約のセット“(m  >  n)  &&  (k  <=  10)”として表される。この制約のセットを満たす“m”、“n”及び“k”の解により、分岐条件は満たされ（すなわち、当てはまり）、ソフトウェアモジュールに１つの実行経路（すなわち、コードの“if”部分）に沿って進行させる。分岐条件が満たされない場合、“m”の値は、“n”の値以下であるか、又は“k”の値は、１０よりも大きい。これは、“m”、“n”及び“k”に課される別の制約のセット“(m  <=  n)  ||  (k  >  10)”として表現される。この第二の制約のセットを満たす“m”、“n”及び“k”の解により、分岐条件が満たされず（すなわち、当てはまらず）、ソフトウェアモジュールに別の実行経路（すなわち、コードの“else”部分）に沿って進行させる。
【００４８】
結果的に、特定の実施の形態は、ソフトウェアモジュールにおけるそれぞれの可能性のある実行経路に対応する制約のセットを決定し、検査の入力として解を使用してソフトウェアモジュールを検査する。図７は、１以上の条件分岐点から得られる複数の可能性のある実行経路を含むソフトウェアモジュールを検査する例示的な方法を示す。特定の実施の形態では、ソフトウェアモジュールは、任意の数の変数（たとえば入力又はローカルの変数）及び任意の数の条件分岐点（たとえば、“if-else”命令文）を有する。それぞれの条件分岐点は、１以上の変数により指定された分岐条件に関連される。特定の実施の形態では、分岐条件は、任意の数のサブ条件を含む。条件分岐点に関連する分岐条件が満たされるかに依存して、ソフトウェアモジュールは、異なる実行経路に沿って進む。
【００４９】
特定の実施の形態は、ソフトウェアモジュールのそれぞれの可能性のある実行経路について、図７のステップ７０２で示されるように、ソフトウェアモジュールにそれに沿って進行させ、その実行経路の終わりに到達させる記号的表現のセットを決定するため、ソフトウェアモジュールで記号的実行を行う。それぞれの記号的表現のセットを決定するとき、もしあれば、（たとえば、図１のステップ１０４に関連して記載されるように）ソフトウェアモジュールの特定の変数について推定される数値及び文字列の制約と同様に、もしあれば、（たとえば図１のステップ１０２に関連して記載されるように）ソフトウェアモジュールの特定の変数に最初に課された数値及び文字列の制約を組み入れる。特定の実施の形態では、図７のステップ７０２は、図２に示されるシステム２００の構成要素２０６により実行され、このシステムは、ソフトウェアモジュール２１２を入力として受け、ソフトウェアモジュール２１２で記号的実行を行い、ソフトウェアモジュール２１２の実行経路に対応する記号的表現の出力のセットを与える。
【００５０】
コンピュータ科学の分野では、記号的実行は、抽象解釈の場合として、実際の値ではなく記号を追跡することによる、ソフトウェアプログラムの分析を示す。この分析は、記号の変数としてソフトウェアモジュールへの入力を扱う明示的でない状態モデルのチェック技術である。この技術は、記号変数をもつソフトウェアモジュールにおいて全ての有限の経路を実行することで複雑な数学的な式又は表現を作り出し、次いで、複雑な式を（決定手順として典型的に知られる）解法により解いて、もしあればエラーのシナリオを得る。明示的な状態モデルのチェックとは対照的に、記号的実行は、全ての可能性のある入力値と、分析下にあるソフトウェアモジュールにおける全ての入力変数の全ての可能性のある使用のケースを解明することができる。記号的実行を更に説明するため、“foo”と名付けられた例示的なソフトウェアモジュールを考える。
【表２】
0005786513.tif 000003
【００５１】
ソフトウェアモジュール“foo”は、２つの入力変数“a”及び“b”を有し、２つのローカル変数“c”及び“d”を有する。特定の実施の形態では、ローカル変数の値は、直接的又は間接的に、ソフトウェアモジュールの１以上の入力変数の値に依存する。たとえば、モジュール“foo”により、ローカル変数“c”の値は、コードのライン3により示されるように、入力変数“a”及び“b”の値に直接的に依存し、ローカル変数“d”の値は、コードのライン５により示されるように、ローカル変数“c”を通して、入力変数“a”及び“b”の値に間接的に依存する。さらに、モジュール“foo”は、“if-else”命令文により生じる、コードのライン４での条件分岐点を含む。ライン４での条件分岐点は、分岐条件“!  (c.equals(“qrs”))”に関連される。この分岐条件が満たされるか又は当てはまるかに依存して、すなわち、ローカル変数“c”が“qrs”に等しいかに依存して、モジュール“foo”は、異なる実行経路に進み、モジュール“foo”のコードの異なる部分が実際に実行される。より詳細には、ローカル変数“c”が“qrs”に等しい場合、コードのライン５及び６に示されるように、ローカル変数“d”の値が計算されてリターンされる。他方で、ローカル変数“c”が“qrs”に等しい場合、コードのライン８により示されるように、ローカル変数“c”の値がリターンされる。
【００５２】
記号的実行がモジュール“foo”で実行されたとき、その入力及びローカル変数には、それぞれ、実際の値の代わりに記号の値が割り当てられる。図８は、モジュール“foo”での記号的実行を実行するステップを表す例示的な実行フロー８００を示す。この例では、入力変数“a”には、記号値“x”が割り当てられ、入力変数“b”には、記号値“y”が割り当てられ、ローカル変数“c”には、記号値“z”が割り当てられ、ローカル変数“d”には、記号値“w”が割り当てられる。変数“a”、“b”、“c”及び“d”は、“string”のタイプからなるので、記号値“x”、“y”、“z”及び“w”は、任意の文字列をそれぞれ表す。
【００５３】
さらに、“Φ”は、実行経路に沿った様々なポイントでの記号的実行の結果を表す記号的表現である。より詳細には、モジュール“foo”のコードのライン２に対応する８０２で、変数“a”、“b”、“c”及び“d”には、それぞれの記号の値“x”、“y”、“z”及び“w”が割り当てられ、“Φ”は、空又はゼロの表現を最初に有する。実行が更に進行するとき、コードが実行されているかに依存して式が“Φ”に追加される。モジュール“foo”のコードのライン３に対応する８０４で、“Φ”は、式“z  =  concat(x,  y)”を有する。これは、コードのライン３が“c  =  a.concat(b)”であり、“x”、“y”及び“z”が変数“a”、“b”及び“c”にそれぞれ割り当てられた記号値であるからである。つぎに、モジュール“foo”のコードのライン４は、条件分岐点であり、実行が進行する２つの可能性のある実行経路が存在する。従って、記号的実行は、２つの異なる経路に進行し、第一の経路PATH1は、コードのライン５，６に対応する８０６及び８０８を含み、第二の経路PATH2は、コードのライン８に対応する８１０を含む。
【００５４】
PATH1に進むため、変数“c”は、“qrs”に等しくなく、このことは、記号値“z”が“qrs”等しくないことを意味する。従って、式“z  !  =  “qrs””は、８０６で“Φ”に追加される。逆に、PATH2に進むため、変数“c”は、“qrs”に等しく、このことは、記号値“z”が“qrs”に等しいことを意味する。従って、式“z  =  “qrs””は、８１０で“Φ”に追加される。PATH1に沿って、変数“d”の値は、８０８に対応するコードのライン５で決定される。従って、式“w  =  concat(z,  “t”)”は、８０８で“Φ”に追加される。“z  =  concat(x,  y)”であるので、“w”の式は、“z  =  concat(concat(x,  y),  “t”)”として書き換えられる。８０８は、PATH1の終わりであり、従って８０８での“Φ”の式は、PATH1の実行の終わりに到達するために満たされる必要がある、記号の形式での条件を表す。同様に、８１０は、PATH2の実行の終わりであり、従って８０１での“Φ”の式は、PATH2の終わりに到達するために満たされる必要がある、記号の形式での条件を表す。
【００５５】
モジュール“foo”は2つの可能性のある実行経路を有するので、モジュール“foo”を記号的に実行することで、２つの式のセットが得られ、２つの式のセットのそれぞれは、それぞれの実行経路に対応する。特定の実施の形態では、８０８で“Φ”の式を解くことで、モジュール“foo”にPATH1の終わりに到達させる入力変数“a”及び“b”の実際の値が与えられ、８１０で“Φ”の式を解くことで、モジュール“foo”にPATH2の終わりに到達させる入力変数“a”及び“b”の実際の値が与えられる。
【００５６】
ソフトウェアモジュールで記号的実行を行うことから得られる式のセットを解くため、特定の実施の形態は、図７のステップ７０４に示されるように、ソフトウェアモジュールの変数に課される制約のセットとして、しれぞれの式のセットを表現する。たとえば、モジュール“foo”により、８０８での式のセットは、“a”、“b”、“c”及び“d”に課される制約のセット“(d  =  concat(cancat(a,  b),  “t”))  &&  (c  =  concat(a,  b))  &&  (c  !  =  “qrs”)”として表現される。８１０での式のセットは、“a”、“b”、“c”及び“d”に課される制約のセット“(c  =  concat(a,  b))  &&  (c  =  “qrs”)”として表現される。
【００５７】
ソフトウェアモジュールでの記号的実行を行うことから得られるそれぞれの制約のセットについて、特定の実施の形態は、適用可能な数式としてセットからのそれぞれの数値の制約と、アプリケーションFSMとしてセットからのそれぞれの文字列の制約とを表現する。図９Ａは、ソフトウェアモジュールの３つの対応する実行経路９１２，９１４，９１６と共に、例示的なソフトウェアモジュールについて決定された３つの例示的な制約のセット９０２，９０４及び９０６を示し、この場合、数値の制約は、数式として表現され、文字列の制約は、FSMとして表現される。この例示的なソフトウェアモジュールを検査するため、それぞれの経路９１２，９１４及び９１６の終わりで、それぞれの対応する制約のセット９０２，９０４及び９０６は、テストケースについて解かれる。
【００５８】
特定の実施の形態は、図１に示されるプロセスを使用して、図７のステップ７０６に示されるように、それぞれの制約のセットについて１以上の解を発見するのを試み、次いで、図７のステップ７０８に示されるように、テストの入力として発見された解を使用して、ソフトウェアモジュールを検査する。特定の実施の形態では、制約のセットの解は、セットにおける全ての制約を満たす制約が課される変数について実際の値を含む。ソフトウェアモジュールを検査するとき、これらの実際の解の値は、テストの入力としてソフトウェアモジュールの変数に割り当てられる。制約のセットについて発見された解が与えられると、解の値は対応する制約のセットからの全ての制約を共に満たし、且つ、ソフトウェアモジュールへのテスト入力として実際の値（すなわち、制約のセットについて発見された解からの値）の特定の組み合わせを適用することで、特定の実行経路に沿って進行して、特定の実行経路の終わりに到達するときに、制約のセットはソフトウェアモジュールの状態を表す（たとえば、記号的実行から取得された）式のセットに対応するので、ソフトウェアモジュールが特定の実行経路に沿って進行して、特定の実行経路の終わりに到達することが保証される。結果として、これら特定の解の値がテスト入力としてソフトウェアモジュールの対応する変数に割り当てられた場合に、特定の実行経路は、完全に検査される。さらに、ある解がソフトウェアモジュールのありとあらゆる実行経路について得られたありとあらゆる式のセットに対応するありとあらゆる制約のセットについて発見され、且つ解の値が（たとえば、同時に１つの解の実際の値を適用することで）テスト入力としてソフトウェアモジュールに適用された場合、ソフトウェアモジュールの全ての可能性のある実行経路は、十分にテストされる。ソフトウェアモジュールの実行経路の何れかにおいてエラーが存在する場合、係るシステマチックな検査は、エラーを最終的に見つけることができる。
【００５９】
特定の実施の形態では、図１に示されるようなプロセスは、ソフトウェアモジュールの設計又は仕様の要件が満たされるかを検証するために使用される。典型的に、所与のソフトウェアモジュールに関連する正式な設計又は仕様の要件が存在する。これらの形式的な要件の幾つかは、ソフトウェアモジュールの入力又は出力に課される。特定の実施の形態では、ソフトウェアモジュールの入力に課される仕様の要件は、ソフトウェアモジュールに関連する前提条件と呼ばれ、ソフトウェアモジュールの出力に課される仕様の要件は、ソフトウェアモジュールに関連する事後条件と呼ばれる。この事後条件は、ソフトウェアモジュールに関連する前提条件に依存する。
【００６０】
先に説明されたように、ソフトウェアモジュールは、（たとえば“if-else命令文”といった）任意の数の条件分岐点を含み、それぞれの条件分岐点は、ソフトウェアモジュールの（たとえば入力変数又はローカル変数といった）１以上の変数により指定される分岐条件を有する。分岐条件が満たされたかに依存して、ソフトウェアモジュールは、異なる実行経路に進む。従って、ソフトウェアモジュールが実行されたとき、ソフトウェアモジュールに含まれる条件分岐点から得られる可能性のある実行経路のうちの何れか１つに進む。結果的に、特定の実施の形態では、ソフトウェアモジュールがその入力と出力に課された形式的な仕様の要件（すなわち、ソフトウェアモジュールに関連する前提条件及び事後条件）を満たすかを検証するとき、ソフトウェアモジュールの全ての可能性のある実行経路について、ソフトウェアモジュールに関連する前提条件及び事後条件が当てはまる場合且つその場合に限り、ソフトウェアモジュールは、検証テストを通過した（すなわち、仕様の要件を満たした）と見なされる。
【００６１】
図１０は、（たとえば形式的な設計又は仕様の要件といった）ソフトウェアモジュールの入力と出力に課される要件（すなわち、ソフトウェアモジュールに関連する前提条件及び事後条件）に関連して、ソフトウェアモジュールを検証する例示的な方法を示す。特定の実施の形態は、図１０のステップ１０２で示されるように、ソフトウェアモジュールの（たとえば、入力変数に課される要件といった）それぞれの前提条件、及び（たとえば出力変数に課される要件といった）それぞれの事後条件を、ソフトウェアモジュールの入力又は出力変数に課される制約として表現する。たとえば、文字列のタイプからなる２つの入力変数“a”及び“b”を有する例示的なソフトウェアモジュール“foo”を考える。先に例示されたように、“foo”のコードに基づいて、“foo”は、文字列のタイプからなる１つの出力値をリターンすることが判定される。すなわち、“foo”は、文字列のタイプからなる１つの出力変数を有する。“p”を“foo”の出力変数を表すものとする。ソフトウェア“foo”の使用により指定され、且つ“a”、“b”及び“p”に課される制約として表現されたとき、“a”、“b”及び“p”に課される前提条件及び事後条件は、以下の通りであるとする。
【表３】
0005786513.tif 000004
【００６２】
次いで、特定の実施の形態は、図１０のステップ１００４に示されるように、ソフトウェアモジュールの事後条件を否定する。先の例におけるように、ソフトウェアモジュールは、１つの事後条件“p.endsWith(“t”)”を有する。この事後条件を論理的に否定することで、“!  (p.endsWith(“t”))”が得られる。
【００６３】
特定の実施の形態は、図１０のステップ１００６に示されるように、ソフトウェアモジュールのそれぞれの可能性のある実行経路に対応する制約のセットを取得し、次いで、それぞれの制約のセットに前提条件及び否定された事後条件を組み入れるため、ソフトウェアモジュールでの記号的実行を行う。記号的実行は、図７のステップ７０２と共に上述されており、ここでは同様に実行される。それぞれの制約のセットを決定するとき、特定の実施の形態は、もしあれば（たとえば図１のステップ１０４と共に記載される）ソフトウェアモジュールの特定の変数について推定された数値及び文字列の制約と同様に、もしあれば（図１のステップ１０２と共に記載される）ソフトウェアモジュールの特定の変数に最初に課された数値及び文字列の制約を組み入れる。たとえば、ソフトウェアモジュール“foo”は、図８に示されたような、２つの可能性のある実行経路を有する。従って、ソフトウェアモジュール“foo”で記号的実行を行うことで、２つの式のセットが得られる。
【００６４】
第一の経路PATH1について、“foo”に記号的実行を行うことから得られた式のセットは、図８の８０８により示されるように、“(p  =  concat(concat(a,  b),  “t”))  &&  (concat(a,  b)  !  =  "qrs")”として書き換えられる。なお、“d”はPATH1の終わりで“foo”によりリターンされる値（すなわち“foo”の出力）であり、“w”は“d”に割り当てられた記号値であるので、“p”はPATH1について“d”の値を有する。さらに、“x”は“a”に割り当てられた記号値であり、“b”は“y”に等価であり、且つ“z”は“c”に等価であるので、“a”は“x”に等価であり、これは、“foo”のソースコードに従って“concat(a,  b)”に等しい。次いで、前提条件及び否定された事後条件は、この制約のセットに追加される。従ってPATH1の最終的な制約のセットは、“(p  =  concat(concat(a,  b),  “t”)))  &&  (concat(a,  b)  !  =  "qrs")  &&  (b.endsWith(“s”)  &&  !  (p.endsWith(“t”))”となる。
【００６５】
第二の経路PATH2について、“foo”で記号的実行を行うことから得られた式のセットは、図８の８１０により示されるように、“(p  =  concat(a,  b))  &&  (concat(a,  b)  =  "qrs")”として書き換えられる。なお、“c”はPATH2の終わりで“foo”によりリターンされた値（すなわち、“foo”の出力）であり、“z”は“c”に割り当てられた記号値であるため、“p”はPATH2について“c”の値を有し、これは、“foo”のソースコードに従って“concat(a,  b)”に等しい。次いで、前提条件及び否定された事後条件は、この制約のセットに同様に追加される。PATH2について最終的な制約のセットは、“(p  =  concat(a,  b)  &&  (concat(a,  b)  =  "qrs")  &&  (b.endsWith(“s”)  &&  !  (p.endsWith(“t”))”となる。
【００６６】
次いで、特定の実施の形態は、図１に示されたプロセスを使用して、図１０のステップ１００８に示されるように、ソフトウェアモジュールのそれぞれの可能性のある実行経路に対応するそれぞれの制約のセットについて１以上の解を発見するのを試みる。それぞれの制約のセットは、ソフトウェアモジュールに関連する前提条件と否定された事後条件と同様に、ソフトウェアモジュールで記号的実行を行うことから得られた制約を含む。特定の実施の形態では、ソフトウェアモジュールの特定の実行経路に対応するそれぞれの制約のセットについて、そのセットからの全ての制約を満たす解が発見されない場合、この実行経路について、ソフトウェアモジュールは、前提条件及び事後条件により表されるように、その入力と出力に課される要件を満たす。図１０のステップ１００４及び１００６で説明されたように、ソフトウェアモジュールの出力で課された否定された事後条件をそれぞれの制約のセットが含むことを思い出されたい。従って、この制約のセットについて解が発見されない場合（すなわち、制約のセットが満足されない場合）、より詳細には、否定された事後条件を満たす解が発見されない場合、前提条件及び事後条件は、対応する実行経路について当てはまることを意味する。逆に、そのセットからの全ての制約を満たす解が発見された場合、対応する実行経路について、前提条件及び事後条件がその実行経路について当てはまらないため、ソフトウェアモジュールは、その入力と出力で課される要件を満たさない。逆に、図１０のステップ１００６で得られた制約のセットについて解が発見された場合、ソフトウェアモジュールは、入力と出力に課される要件に関連して検証テストを通過しない。図１０のステップ１００６で得られたありとあらゆる制約のセットが満たされないときにのみ、ソフトウェアモジュールは、その入力と出力で課された要件に関して検証テストを通過する。
【００６７】
図９Ｂは、ソフトウェアモジュールの３つの対応する実行経路９１２，９１４及び９１６と共に、図９Ａに示されるように、例示的なソフトウェアモジュールについて決定される3つの例示的な制約のセット９０２，９０４及び９０６を示す。ソフトウェアモジュールの入力と出力に課される要件に関連して、この例示的なソフトウェアモジュールを検証するため、それぞれの経路９１２，９１４及び９１６の終わりで、それぞれの対応する制約のセット９０２，９０４及び９０６は、要件及びアサーションについて解かれる。
【００６８】
特定の実施の形態では、図１に示されたようなプロセスは、インジェクション攻撃を検出して捕捉するために設計されるソフトウェアモジュールを検証するために使用される。インサーション攻撃としても知られるインジェクション攻撃は、SQLデータベース及び他の脆弱なウェブサイトをしばしば標的にする悪意のあるソフトウェア攻撃の形態である。一般に、SQLインジェクションは、ソフトウェアアプリケーションのデータベースレイヤで生じるセキュリティの脆弱性を利用する符号注入技術である。脆弱性は、あるプログラミング言語又はスクリプト言語が別のプログラミング言語又はスクリプト言語内に埋め込まれるときは何時でも生じる。より詳細には、SQLステートメントに埋め込まれた文字列の文字列リテラルのエスケープ文字についてユーザ入力が誤ってフィルタリングされたとき、又はユーザ入力が強くタイプされず、これにより突然に実行されたときに、脆弱性が存在する。たとえば、インジェクション攻撃は、“qk%$d1shutdownsq&^d”として（たとえばランダムな文字のセットといった）別の文字列に文字列“shutdown”を埋め込み、この文字列を入力コマンド（たとえばSQL命令文）としてデータベースに送出する。データベースソフトウェアが、一見したところランダムな入力文字列に埋め込まれた“shutdown”文字列を捕捉して、それを実行しない場合、“shutdown”文字列は、データベースに不注意にシャットダウンさせる場合がある。結果として、大部分のデータベースは、係るインジェクション攻撃を検出して捕捉するために設計されたソフトウェアモジュールを有する。特定の実施の形態では、図１に示されたプロセスは、係るセキュリティソフトウェアモジュールがインジェクション攻撃として入力に埋め込まれた多くの異なる形式の悪意のある文字列を検出することができるかを検証するために使用される。たとえば、セキュリティソフトウェアモジュールを検査する１つの方法は、悪意のある文字列を考えるか、（たとえば、悪意のある文字列が無害であると信じるようにセキュリティソフトウェアモジュールをだますといった）セキュリティソフトウェアモジュールがそれを検出できないように、悪意のある文字列を埋め込むことである。
【００６９】
図１１は、インジェクション攻撃を検出するために設計されたセキュリティソフトウェアモジュールを検証する例示的な方法を示す。特定の実施の形態では、セキュリティソフトウェアモジュールは、任意の悪意のある文字列を入力文字列が含むかを検証するため、セキュリティソフトウェアモジュールに通過される（たとえば、入力文字列といった）入力値に様々なセキュリティチェックを実行する。それぞれのセキュリティチェックポイントで、入力値がセキュリティチェックを通過した場合、セキュリティソフトウェアモジュールは、次のセキュリティチェックポイントに進む。さもなければ、セキュリティソフトウェアモジュールは、（たとえばFALSEをリターンするといった）入力値が特定のセキュリティチェック失敗したことの指示をリターンする。入力文字列がセキュリティソフトウェアモジュールに含まれる全てのセキュリティチェックを通過したときにのみ、セキュリティソフトウェアモジュールは、入力値が無害であることの指示をリターンする（たとえばTRUEをリターンする）。
【００７０】
特定の実施の形態は、図１１のステップ１１０２に示されるように、インジェクション攻撃に関連して使用される可能性がある“shutdown”のような悪意のある文字列のセットを選択する。“m”を特定の悪意のある文字列を表すとする。特定の実施の形態は、図１１のステップ１１０４に示されるように、“s”により表される別の文字列に、セットからのそれぞれの悪意のある文字列を埋め込む。“s”において、悪意のある文字列の前に幾つかの文字（すなわちサブ文字列）があり、悪意のある文字列の後の幾つかの文字（すなわち、別のサブ文字列）がある場合がある。従って、“s”は、“s  =  concat(concat(x,  m),  y)”として表現され、この場合、“x”は、“s”における、悪意のある文字列“m”の前にあるサブ文字列を表し、“y”は、悪意のある文字列“m”の後にあるサブ文字列を表す。なお、“x”又は“y”の何れかは、空の文字列であり、“m”は、“s”の別のサブ文字列となる。文字列“s”は、入力値としてセキュリティソフトウェアモジュールに適用される。
【００７１】
特定の実施の形態は、図１１のステップ１１０６に示されるように、制約が満足される場合、セキュリティソフトウェアモジュールにその終わりにまで実行させ、入力値がモジュールに含まれる全てのセキュリティチェックを上手く通過したことの指示をリターンさせる制約のセットを取得するため、セキュリティソフトウェアモジュールで記号的実行を行う。記号的実行は、図７のステップ７０２と関連して上述され、本実施の形態で同様に実行される。制約のセットを決定するとき、特定の実施の形態は、もしあれば、（図１のステップ１０４に関連して記載されるように）ソフトウェアモジュールの特定の変数について推定された数値及び文字列の制約と同様に、もしあれば、（たとえば図１のステップ１０２に関連して記載されるように）ソフトウェアモジュールの特定の変数に最初に課される数値及び文字列の制約を組み入れる。特定の実施の形態では、このように得られた制約のセットは、入力値が無害であることを示す出力値をソフトウェアモジュールがリターンするように、セキュリティソフトウェアモジュールに含まれる全てのセキュリティチェックを上手く通過するため、セキュリティソフトウェアモジュールの入力変数に割り当てられた入力値について満たされる必要がある全ての制約を表す。
【００７２】
特定の実施の形態は、図１に示されるプロセスを使用して、図１１のステップ１１０８に示されるように、“s”が全ての制約を満たすように、それぞれの悪意のある文字列が埋め込まれているとき、“s”について１以上の解を発見しようと試みる。任意の解が制約のセットを満たす“s”について発見された場合、セキュリティソフトウェアモジュールに含まれる全てのセキュリティチェックを通過するのを間違えた“s”に埋め込まれた少なくとも１つの悪意のある文字列が存在することを意味する。結果的に、セキュリティソフトウェアモジュールは、インジェクション攻撃に対して脆弱性がある。
【００７３】
例として悪意のある文字列“shutdown”を使用する。この文字列を“s”に埋め込むことで、“s  =  concat(concat(x,  “shutdown”),  y)”が得られる。図１に示されるプロセスを使用して、特定の実施の形態は、埋め込まれた“shutdown”をもつ“s”がセキュリティソフトウェアモジュールで記号的実行を行うことから得られる制約のセットからの全ての制約を満たすように、サブ文字列“x”及び“y”の値を与える“s”の解が存在するかを発見するのを試みる。“x”及び“y”の解が存在する場合、セキュリティソフトウェアモジュールに含まれる全てのセキュリティチェックを文字列“s”が上手く通過するように（すなわち、セキュリティソフトウェアモジュールが悪意のある文字列“shutdown”が埋め込まれたこの特定のインジェクション攻撃を検出することができないように）、値“concat(concat(x,  “shutdown”),  y)”を有する文字列“s”に悪意のある文字列“shutdown”を埋め込む少なくとも１つの方法が存在することを意味する。
【００７４】
特定の実施の形態では、それぞれの悪意のある文字列は、文字列“s”に埋め込まれたとき、異なるデータタイプを使用して表現される。たとえば、16進数として表現される文字列“shutdown”は、“0x73687574646f776e”として表現される。従って、“s”について１つの可能性のある値は、文字列のデータタイプにおける悪意のある文字列を表現する“exec  shutdown”であり、“s”について別の可能性のある値は、整数のデータ対応で悪意のある文字列を表現する“declare  @a  char(20)  select  @a=0x73687574646f776e  exec(@a)”である。特定の実施の形態は、“s”について解を発見することを試み、この場合、埋め込まれた悪意のある文字列は、異なるデータタイプを使用して表現される。結果として、セキュリティソフトウェアモジュールは、従来の文字列データで表される悪意のある文字列で検査されるだけでなく、（たとえば整数又は浮動小数点数として表される）予期しないデータタイプで表される悪意のある文字列でも検査される。
【００７５】
特定の実施の形態は、“s”が文字列全体として（すなわち“x”、“m”及び“y”を含めて）図１１のステップ１１０６から得られる制約のセットを満たすように“s”において悪意のある文字列のセットからそれぞれの悪意のある文字列“m”を埋め込み、次いで“x”及び“y”の特定の値を提供する“s”の解を発見するのを試みる。“s”に埋め込まれた悪意のある文字列“m”をもつ“s”について解が発見された場合、セキュリティソフトウェアモジュールは、対応するインジェクション攻撃を検出することができず、従って脆弱であることを意味する。さらに、“s”に埋め込まれた悪意のある文字列“m”をもつ“s”について解が発見されない場合、特定の実施の形態は、図１１のステップ１１０６から得られた制約のセットを満たす解を発見しようと試みる。解が発見された場合、特定の実施の形態は、解それ自身が実際に悪意のある文字列であるかを検証する。このセキュリティソフトウェアモジュールに関する検証は、悪意のある文字列が、それ自身において別の文字列に埋め込まれることなしに、セキュリティソフトウェアモジュールに含まれる全てのセキュリティチェックを上手く通過することができるか（すなわち、セキュリティソフトウェアモジュールが悪意のある文字列を検出することができないこと）を判定することを試みる。
【００７６】
図９Ｃは、ソフトウェアモジュールの３つの対応する実行経路９１２，９１４及び９１６と共に、図９Ａに示されるように、例示的なソフトウェアモジュールについて決定された３つの例示的な制約のセット９０２，９０４及び９０６を示す。例示的なソフトウェアモジュールが例示的なセキュリティソフトウェアモジュールである場合、この例示的なセキュリティソフトウェアモジュールを検証するため、それぞれの経路９１２，９１４及び９１６の終わりで、それぞれ対応する制約のセット９０２，９０４及び９０６は、ソフトウェアの内部チェックを通過した全ての可能性のある文字列を表すホットスポットFSMと、悪意のあるFSMとの交点について解かれる。交点がゼロである場合、可能性のあるインジェクション攻撃が発見されない。ゼロでない交点は、可能性のあるインジェクション攻撃の文字列を即座に示す。
【００７７】
特定の実施の形態は、ネットワーク環境で実現される。図１２は、サービスとしてソフトウェア検証を提供するのに適した例示的なネットワーク環境を示す。ネットワーク環境１２００は、１以上のサーバ１２２０と１以上のクライアント１２３０を互いに結合するネットワーク１２１０を含む。特定の実施の形態では、ネットワーク１２１０は、イントラネット、エクストラネット、VPN（Virtual  Private  Network）、LAN（Local  Area  Network）、無線LAN、WAN（Wide  Area  Network）、MAN（Metropolitan  Area  Network）、インターネットの一部、又は別のネットワーク１２１０、又は２以上の係るネットワーク１２１０の組み合わせである。本発明は、適切なネットワーク１２１０を含んでいる。
【００７８】
１以上のリンク１２５０は、サーバ１２２０又はクライアント１２３０をネットワーク１２１０に結合する。特定の実施の形態では、１以上のリンク１２５０は、１以上の有線、無線又は光リンク１２５０をそれぞれ含む。特定の実施の形態では、１以上のリンク１２５０は、イントラネット、エクストラネット、VPN、LAN、WLAN、WAN、MAN、インターネットの一部、又は別のリンク１２５０、或いは２以上の係るリンク１２５０の組み合わせを含む。本発明は、サーバ１２２０及びクライアント１２３０をネットワーク１２１０に結合する適切なリンク１２５０を含む。
【００７９】
特定の実施の形態では、それぞれのサーバ１２２０は、単一のサーバであるか、或いは、複数のコンピュータ又は複数のデータセンタに及ぶ分散サーバである。サーバ１２２０は、たとえば限定されるものではないが、ウェブサーバ、ニュースサーバ、メールサーバ、メッセージサーバ、広告サーバ、ファイルサーバ、アプリケーションサーバ、エクスチェンジサーバ、データベースサーバ又はプロキシサーバのような様々なタイプからなる場合がある。特定の実施の形態では、それぞれのサーバ１２２０は、ハードウェア、ソフトウェア、又は埋め込みロジックコンポーネント、或いは、サーバ１２２０により実現又はサポートされる適切な機能を実行する２以上の係るコンポーネントの組み合わせを含む場合がある。たとえば、ウェブサーバは、ウェブページ又はウェブページの特定のエレメントを含むウェブサイトを主催することができる。より詳細には、ウェブサーバは、HTMLファイル又は他のファイルタイプを主催するか、要求に応じてファイルを動的に作成又は構成し、それらをHTTP又はクライアント１２３０からの他の要求に応答してクライアント１２３０に伝達する。メールサーバは、電子メールサービスを様々なクライアント１２３０に提供可能である。データベースサーバは、１以上のデータストアに記憶されるデータを管理するインタフェースを供給可能である。特定の実施の形態では、１以上のデータストレージ１２４０は、１以上のリンク１２５０を介して１以上のサーバ１２２０にリンクされる。特定の実施の形態では、データストレージ１２４０は、様々な情報のタイプを記憶するために使用される。特定の実施の形態では、データストレージ１２４０に記憶される情報は、特定のデータ構造に従って編成される。特定の実施の形態では、それぞれのデータストレージ１２４０は、リレーショナルデータベースである。特定の実施の形態は、サーバ１２２０又はクライアント１２３０が、たとえばデータストレージ１２４０に記憶される情報を検索、修正、追加又は削除といった、情報を管理するのを可能にするインタフェースを提供する。
【００８０】
特定の実施の形態では、それぞれのクライアント１２３０は、ハードウェア、ソフトウェア、又は埋め込みロジックコンポーネント、或いはクライアント１２３０により実現又はサポートされる適切な機能を実行可能な２以上の係るコンポーネントの組み合わせを含む電子装置である。たとえば限定されることなしに、クライアント１２３０は、デスクトップコンピュータシステム、ノートブックコンピュータシステム、ネットブックコンピュータシステム、ハンドヘルド電子装置、又は移動電話である場合がある。本発明は、適切なクライアント１２３０を含む。クライアント１２３０は、クライアント１２３０でのネットワークユーザがネットワーク１２３０にアクセスするのを可能にする。クライアント１２３０は、そのユーザが他のクライアント１２３０で他のユーザと通信するのを可能にする。
【００８１】
クライアント１２３０は、MICROSOFT  INTERNET  EXPLORER、GOOGLE  CHROME又はMOZILLA  FIREFOXのようなウェブブラウザ１２３２を有し、１以上のアッドオン、プラグイン又はTOOLBAR又はYAHOO  TOOLBARのような他の拡張を有する。クライアント１２３０でのユーザは、URL（Uniform  Resource  Locator）、又はウェブブラウザ１２３２をサーバ１２２０に向ける他のアドレスを入力し、ウェブブラウザ１２３２は、HTTP（Hyper  Text  Transfer  Protocol）要求を生成し、HTTP要求をサーバ１２２０に伝達する。サーバ１２２０は、HTTP要求を受けて、HTTP要求に応じて、１以上のHTML（Hyper  Text  Markup  Language）ファイルをクライアント１２３０に伝達する。クライアント１２３０は、ユーザへの提示のため、サーバ１２２０からのHTMLファイルに基づいてウェブページをレンダリングする。本発明は、適切なウェブページのファイルを含む。例として、限定されるものではないが、ウェブページは、特定の必要に応じて、HTMLファイル、XHTML（Extensible  Hyper  Text  Markup  Language）ファイル、又はXML（Extensible  Markup  Language）ファイルからレンダリングされる。また、係るページは、たとえば限定されるものではないが、JAVASCRIPT、JAVA、MICROSOFT  SILVERLIGHT、AJAX（Asynchronous  JAVASCRIPT及びXML）のようなマークアップ言語とスクリプト言語の組み合わせ等で書かれたもののようなスクリプトを実行する。ここで、あるウェブページの参照は、（ブラウザがウェブページをレンダリングするために使用する）１以上の対応するウェブページファイルを包含し、逆に、１以上の対応するウェブページファイルは、ウェブページを包含する。
【００８２】
特定の実施の形態は、１以上のコンピュータシステムで実現される。図１３は、例示的なコンピュータシステム１３００を示す。特定の実施の形態では、１以上のコンピュータシステム１３００は、本実施の形態で記載される１以上の方法の１以上のステップを実行する。特定の実施の形態では、１以上のコンピュータシステム１３００は、本実施の形態で記載又は図示される機能を提供する。特定の実施の形態では、１以上のコンピュータシステム１３００で実行されているソフトウェアは、本実施の形態で記載又は図示される１以上の方法の１以上のステップを実行するか、又は本実施の形態で記載又は図示される機能を提供する。特定の実施の形態は、１以上のコンピュータシステム１３００の１以上の部分を含む。
【００８３】
本発明の開示は、適切な数のコンピュータシステム１３００を含む。本発明の開示は、適切な物理的な形態を取るコンピュータシステム１３００を含む。例として限定されるものではないが、コンピュータシステム１３００は、埋め込みコンピュータシステム、システムオンチップ（SOC）、（たとえばコンピュータオンモジュール（COM）、システムオンモジュール（SOM）のような）シングルボードコンピュータシステム（SBC）、デスクトップコンピュータシステム、ラップトップ又はノートブックコンピュータシステム、インタラクティブキオスク、メインフレーム、コンピュータシステムのメッシュ、モバイルフォン、パーソナルデジタルアシスタント（PDA）、サーバ、又はこれらの２以上の組み合わせである場合がある。必要に応じて、コンピュータシステム１３００は、単一であるか又は分散であるか、複数の位置に及ぶか、複数のコンピュータに及ぶか、或いは、１以上のネットワークにおいて１以上のクラウドコンポーネントを含むクラウドにある１以上のコンピュータシステム１３００を含む。必要に応じて、１以上のコンピュータシステム１３００は、実質的な空間又は時間的な制限なしに、本実施の形態で記載又は図示された１以上の方法の１以上のステップを実行する。例として限定されるものではないが、１以上のコンピュータシステム１３００は、本実施の形態で記載又は図示された１以上の方法の１以上のステップをリアルタイムで実行するか、バッチモードで実行する。１以上のコンピュータシステム１３００は、必要に応じて、本実施の形態で記載又は図示される１以上の方法の１以上のステップを異なる時間又は異なる位置で行う。
【００８４】
特定の実施の形態では、コンピュータシステム１３００は、プロセッサ１３０２、メモリ１３０４、ストレージ１３０６、入力／出力（I/O）インタフェース１３０８、通信インタフェース１３１０及びバス１３１２を含む。本発明の開示は、特定の配置において特定の数の特定の構成要素を有する特定のコンピュータシステムを記載及び図示しているが、本発明の開示は、適切な配置における適切な数の構成要素を有する適切なコンピュータシステムを含む。
【００８５】
特定の実施の形態では、プロセッサ１３０２は、コンピュータプログラムを作成する命令のような命令を実行するハードウェアを含む。例として限定されるものではないが、命令を実行するため、プロセッサ１３０２は、内部レジスタ、内部キャッシュ、メモリ１３０４又はストレージ１３０６からの命令を検索（又はフェッチ）し、それらをデコード及び実行し、次いで、１以上の結果を内部レジスタ、内部キャッシュ、メモリ１３０４又はストレージ１３０６に書き込む。特定の実施の形態では、プロセッサ１３０２は、データ、命令又はアドレスのための１以上の内部キャッシュを含む。本発明の開示は、必要に応じて、適切な数の適切な内部キャッシュを含むプロセッサ１３０２を含む。例として限定されるものではないが、プロセッサ１３０２は、１以上の命令キャッシュ、１以上のデータキャッシュ、及び１以上のTLB（Translation  Lookaside  Buffers）を含む。命令キャッシュにおける命令は、メモリ１３０４又はストレージ１３０６における命令のコピーである、命令キャッシュは、プロセッサ１３０２により命令の検索を高速にする。データキャッシュにおけるデータは、プロセッサ１３０２で動作を実行させる命令のためのメモリ１３０４又はストレージ１３０６におけるデータのコピー、プロセッサ１３０２で実行するその後の命令によりアクセスするか又はメモリ１３０４又はストレージ１３０６への書き込みのためにプロセッサ１３０２で実行された前の命令の結果、その他の適切なデータである。データキャッシュは、プロセッサ１３０２による読み取り又は書き込み動作を高速にする。TLBは、プロセッサ１３０２について仮想的なアドレス変換を高速にする。特定の実施の形態では、プロセッサ１３０２は、データ、命令又はアドレスのために１以上の内部レジスタを含む。本発明の開示は、必要に応じて、任意の数の適切な内部レジスタを含むプロセッサ１３０２を含む。必要に応じて、プロセッサ１３０２は、マルチコアプロセッサである１以上のALU（Arithmetic  Logic  Unit）を含むか、又は１以上のプロセッサ１３０２を含む。本発明の開示は特定のプロセッサを記載及び図示しているが、本発明の開示は、適切なプロセッサを含んでいる。
【００８６】
特定の実施の形態では、メモリ１３０４は、プロセッサ１３０２が実行するための命令又はプロセッサ１３０２が動作するデータを記憶するメインメモリを含む。例示として限定されるものではないが、コンピュータシステム１３００は、ストレージ１３０６又は（たとえば別のコンピュータシステム１３００のような）別のソースからメモリ１３０４に命令をロードする。プロセッサ１３０２は、メモリ１３０４から内部レジスタ又は内部キャッシュに命令をロードする。命令を実行するため、プロセッサ１３０２は、内部レジスタ又は内部キャッシュからの命令を検索し、それらをデコードする。命令の実行の間又は実行の後、プロセッサ１３０２は、（中間又は最終的な結果である）１以上の結果を内部レジスタ又は内部キャッシュに書き込む。プロセッサ１３０２は、１以上の結果をメモリ１３０４に書き込む。特定の実施の形態では、プロセッサ１３０２は、（ストレージ１３０６又はその他とは対照的に）１以上の内部レジスタ又は内部キャッシュ或いはメモリ１３０４における命令のみを実行し、（ストレージ１３０６又はその他とは対照的に）１以上の内部レジスタ又は内部キャッシュ或いはメモリ１３０４におけるデータに関してのみ動作する。（アドレスバス及びデータバスをそれぞれ含む）１以上のメモリバスは、プロセッサ１３０２をメモリ１３０４に結合する。バス１３１２は、以下に記載されるように１以上のメモリバスを含む。特定の実施の形態では、１以上のメモリ管理ユニット（MMU）は、プロセッサ１３０２とメモリ１３０４との間にあり、プロセッサ１３０２により要求されたメモリ１３０４へのアクセスを容易にする。特定の実施の形態では、メモリ１３０４は、ランダムアクセスメモリ（RAM）を含む。このRAMは、必要に応じて、揮発性メモリである。必要に応じて、このRAMは、DRAM（Dynamic  RAM）又はSRAM（Static  RAM）である。さらに、必要に応じて、このRAMは、シングルポート又はマルチポートRAMである。本発明の開示は、適切なRAMを含んでいる。メモリ１３０４は、必要に応じて、１以上のメモリ１３０４を含む。本発明の開示は特定のメモリを記載及び図示しているが、本発明の開示は、適切なメモリを含んでいる。
【００８７】
特定の実施の形態では、ストレージ１３０６は、データ又は命令のための大容量ストレージを含む。例として限定されるものではないが、ストレージ１３０６は、HDD、フロッピー(登録商標)ディスクドライブ、フラッシュメモリ、光ディスク、光磁気ディスク、磁気テープ又はUSB（Universal  Serial  Bus）ドライブ又はこれらの２以上の組み合わせを含む。ストレージ１３０６は、必要に応じて、取り外し可能又は取り外し不可能（すなわち固定された）媒体を含む。ストレージ１３０６は、必要に応じて、コンピュータシステム１３００の内部又は外部にある。特定の実施の形態では、ストレージ１３０６は、不揮発性の固体メモリである。特定の実施の形態では、ストレージ１３０６は、リードオンリメモリ（ROM）を含む。必要に応じて、このROMは、マスクプログラムROM、プログラマブルROM、（PROM）、消去可能なROM（EPROM）、電子的に消去可能なPROM（EEPROM）、電子的に変更可能なROM（EAROM）、又はフラッシュメモリ或いはこれらの２以上の組み合わせである。本発明の開示は、適切な物理的な形式を取る大容量ストレージ１３０６を含む。ストレージ１３０６は、必要に応じて、プロセッサ１３０２とストレージ１３０６間の通信を容易にする１以上の記憶制御装置を含む。必要に応じて、ストレージ１３０６は、１以上のストレージ１３０６を含む。本発明の開示は、特定のストレージを記載及び図示しているが、本発明の開示は、適切なストレージを含む。特定の実施の形態では、I/Oインタフェース１３０８は、コンピュータシステム１３００と１以上のI/O装置との間の通信のための１以上のインタフェースを提供するハードウェア、ソフトウェア、又はその両者を含む。コンピュータシステム１３００は、必要に応じて、１以上のこれらI/O装置を含む。１以上のこれらI/O装置は、ある人物とコンピュータシステム１３００との間の通信を可能にする。例示として限定されるものではないが、I/O装置は、キーボード、キーパッド、マイクロフォン、モニタ、マウス、プリンタ、スキャナ、スピーカ、スチルカメラ、スタイラス、タブレット、タッチスクリーン、トラックボール、ビデオカメラ、別の適切なI/O装置、或いはこれらの２以上の組み合わせを含む場合がある。I/O装置は、１以上のセンサを含む。本発明の開示は、適切なI/O装置及びこれらI/O装置のために適切なI/Oインタフェースを含んでいる。必要に応じて、I/Oインタフェース１３０８は、プロセッサ１３０２が１以上のこれらのI/O装置を駆動するのを可能にする１以上のデバイス又はソフトウェアドライバを含む。I/Oインタフェース１３０８は、必要に応じて、１以上のI/Oインタフェース１３０８を含む。本発明の開示は特定のI/Oインタフェース１３０８を記載及び図示しているが、本発明の開示は、適切なI/Oインタフェースを含んでいる。
【００８８】
特定の実施の形態では、通信インタフェース１３１０は、コンピュータシステム１３００と１以上の他のコンピュータシステム１３００又は１以上のネットワークとの間で（たとえばパケットに基づく通信のような）通信のための１以上のインタフェースを提供するハードウェア、ソフトウェア又はこれらの両者を含む。例示として限定されるものではないが、通信インタフェース１３１０は、Eithernet又は他の有線に基づくネットワークと通信するネットワークインタフェースコントローラ（NIC）又はネットワークアダプタ、又は、WI-FIネットワークのような無線ネットワークと通信する無線NIC（WNIC）又は無線アダプタを含む。本発明の開示は、適切なネットワーク及び該ネットワークのための適切な通信インタフェース１３１０を含んでいる。例示として限定されるものではないが、コンピュータシステム１３００は、アドホックネットワーク、PAN（Personal  Area  Network）、LAN（Local  Area  Network）、WAN（Wide  Area  Network）、MAN（Metropolitan  Area  Network）又は１以上のインターネットの部分、或いはこれらの２以上の組み合わせと通信する。１以上のこれらのネットワークの１以上の部分は、有線又は無線である。例として、コンピュータシステム１３００は、（たとえばBLUETOOTH  WPANのような）無線PAN（WPAN）、WI-FIネットワーク、WI-MAXネットワーク、（たとえばGSM（Global  System  for  Mobile  Communication）ネットワークのような）携帯電話網、又は他の適切な無線ネットワーク、或いはこれらの２以上の組み合わせと通信する場合がある。コンピュータシステム１３００は、必要に応じて、これらのネットワークの何れかのために適切な通信インタフェース１３１０を含む。通信インタフェース１３１０は、必要に応じて、１以上の通死人タフェース１３１０を含む。本発明の開示は特定の通死人タフェースを記載及び図示しているが、本発明の開示は、適切な通信インタフェースを含んでいる。
【００８９】
特定の実施の形態では、バス１３１２は、コンピュータシステム１３００の構成要素を互いに結合するハードウェア、ソフトウェア又はこれらの両者を含む。例示として限定されるものではないが、バス１３１２は、AGP（Accelerated  Graphics  Port）又は他のグラフィックスバス、EISA（Enhanced  Industry  Standard  Architecture）バス、フロントサイドバス（FSB）、HYPERTRANSPORT（HT）インターコネクト、LPC（Low-Pin-Count）バス、メモリバス、MCA（Micro  Channel  Architecture）バス、PCI（Peripheral  Component  Interconnect）バス、PCI-EX（PCI-Express）バス、SATA（Serial  Advanced  Technology  Attachment）バス、VLB（Video  Electronics  Standards  Association  local）バス、又は別の適切なバス、或いはこれらの２以上の組み合わせを含む場合がある。バス１３１２は、必要に応じて、１以上のバス１３１２を含む。本発明の開示は特定のバスを記載及び図示するものであるが、本発明の開示は、適切なバス又はインターコネクトを含んでいる。
【００９０】
ここで、コンピュータ読み取り可能な記録媒体は、１以上の一時的でない、有形のコンピュータ読み取り可能な記録媒体の担持構造を包含する。例示として限定されるものではないが、コンピュータ読み取り可能な記憶媒体は、必要に応じて、（たとえばFPGA（Field-Programmable  Gate  Array）又はASIC（Application  Specific  IC）のような半導体に基づいた又は他の集積回路（IC）、ハードディスク、HDD、HHD（Hybrid  Hard  Drive）、光ディスク、ODD（Optical  Disc  Drive）、光磁気ディスク、光磁気ドライブ、フロプティカルディスク、フロプティカルディスクドライブ（FDD）、磁気テープ、ホログラフィック記憶媒体、SSD（Solid  State  Drive）、RAMドライブ、SECURE  DIGITALカード、SECURE  DIGITALドライブ、または別の適切なコンピュータ読み取り可能な記憶媒体、或いはこれらの２以上の組み合わせを含む場合がある。ここで、コンピュータ読み取り可能な記憶媒体に対する言及は、35U.S.C.§101の下での特許の保護のために適格でない媒体を排除する。ここで、コンピュータ読み取り可能な記憶媒体に対する言及は、35U.S.C.§101の下での特許の保護のために適格でないという点で、（いわば伝搬する電気又は電磁信号のような）信号伝達の一時的な形態を排除する。
【００９１】
本発明の開示は、適切な記憶を実現する１以上のコンピュータ読み取り可能な記憶媒体を含んでいる。特定の実施の形態では、コンピュータ読み取り可能な記憶媒体は、必要に応じて、（たとえば1以上の内部レジスタ又はキャッシュのような）１以上のプロセッサ１３０２の部分、１以上のメモリ１３０４の部分、１以上のストレージ１３０６の部分、又はこれらの組み合わせを実現する。特定の実施の形態では、コンピュータ読み取り可能な記憶媒体は、RAM又はROMを実現する。特定の実施の形態では、コンピュータ読み取り可能な記憶媒体は、揮発性又は持続性のメモリを実現する。特定の実施の形態では、１以上のコンピュータ読み取り可能な記憶媒体は、ソフトウェアを統合する。ここで、ソフトウェアに対する言及は、１以上のアプリケーション、バイトコード、１以上のコンピュータプログラム、１以上の実行ファイル、１以上の命令、ロジック、マシンコード、１以上のスクリプト、又はソースコードを包含する場合があり、逆に、これら１以上のアプリケーション、バイトコード、１以上のコンピュータプログラム、１以上の実行ファイル、１以上の命令、ロジック、マシンコード、１以上のスクリプト、又はソースコードがソフトウェアを示す場合がある。特定の実施の形態では、ソフトウェアは、１以上のアプリケーションプログラミングインタフェース（API）を含む。この開示は、適切なプログラミング言語又はプログラミング言語の組み合わせで書かれるか又は表現される適切なソフトウェアを含む。特定の実施の形態では、ソフトウェアは、ソースコード又はオブジェクトコードとして表現される。特定の実施の形態では、ソフトウェアは、たとえばC，Perlのような高水準プログラミング言語、又はその適切な拡張で表現される。特定の実施の形態では、ソフトウェアは、アセンブリ言語（又はマシンコード）のような低水準プログラミング言語で表現される。特定の実施の形態では、ソフトウェアは、JAVA(登録商標)で表現される。特定の実施の形態では、ソフトウェアは、HTML（Hyper  Text  Markup  Language）、XML（Extensible  Markup  Language）又は他の適切なマークアップ言語で表現される。
【００９２】
本発明の開示は、当業者が理解することができる例示的な実施の形態に対する全ての変形、置換、変更を包含するものである。同様に、必要に応じて、特許請求の範囲は、当業者が理解する例示的な実施の形態に対する全ての変形、置換及び変更を包含する。
【００９３】
以下、本願発明の特徴を付記として示す。
【００９４】
（付記１）
１以上のコンピュータ装置により、
ソフトウェアモジュールに関連する１以上の第一の数値に関する制約と１以上の第一の文字列に関する制約とを分析するステップと、前記ソフトウェアモジュールは、１以上の数値の変数、１以上の文字列の変数、前記１以上の数値の変数のうちの特定の変数に適用され、数値又は文字列に関する結果を生成１以上の第一の演算、及び前記１以上の文字列の変数のうつの特定の変数に適用され、数値又は文字列の変数を生成する１以上の第二の演算を備え、前記第一の数値に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、前記第一の文字列に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、
前記１以上の文字列の変数のうちの特定の変数に適用される１以上の第二の数値に関する制約を推定するステップと、
前記１以上の数値の変数のうちの特定の変数に適用される１以上の第二の文字列に関する制約を推定するステップと、
前記第一の数値に関する制約と前記第二の数値に関する制約のそれぞれを式で表現するステップと、
前記第一の文字列に関する制約と前記第二の文字列に関する制約のそれぞれを有限状態マシンで表現するステップと、
全ての前記第一及び第二の数値に関する制約と全ての前記第一及び第二の文字列に関する制約とを満足する前記１以上の数値の変数と前記１以上の文字列の変数とのうちの特定の変数の１以上の値を含む解を発見することを試みることで、１以上の可能性のあるエラーについて前記ソフトウェアモジュールを検査するステップと、
を含むことを特徴とする方法。
【００９５】
（付記２）
前記１以上の数値の変数は、１以上の入力の数値の変数と１以上の中間の数値の変数とを含み、
前記１以上の文字列の変数は、１以上の入力の文字列の変数と１以上の中間の文字列の変数とを含み、
前記１以上の入力の数値の変数のうちの特定の変数に適用される前記第一の数値に関する制約と、前記１以上の入力の文字列の変数のうちの特定の変数に適用される前記第一の文字列に関する制約とは、前記ソフトウェアモジュールの仕様に基づいて決定され、
前記１以上の中間の数値の変数のうちの特定の変数に適用される前記第一の数値に関する制約と、前記１以上の中間の文字列に変数のうちの特定の変数に適用される前記第一の文字列に関する制約とは、前記ソフトウェアモジュールの記号的実行を行うことで決定される、
付記１記載の方法。
【００９６】
（付記３）
前記第二の数値に関する制約は、前記第一の文字列に関する制約と前記第二の演算とに基づいて推定され、
前記第二の文字列に関する制約は、前記第一の数値に関する制約と前記第一の演算とに基づいて推定される、
付記１記載の方法。
【００９７】
（付記４）
前記第二の数値に関する制約と前記第二の文字列に関する制約は、ソフトウェアモジュールを実現するプログラミング言語と、前記ソフトウェアモジュールが実行されるランタイム環境との仕様に基づいて更に推定される、
付記３記載の方法。
【００９８】
（付記５）
全ての前記第一及び第二の数値に関する制約と全ての前記第一及び第二の文字列に関する制約とを満たす解を発見することを試みるステップは、
前記１以上の数値の変数と前記１以上の文字列の変数とについて異なる可能性のある値を繰返し試み、ある解が発見されるか、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約とが満たされないと判定されるか、又はある繰り返し回数が閾値に到達するまで、前記異なる可能性のある値が前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約の全てを満たす解を生成するかを検査するステップと、
前記解が発見された場合、前記１以上の数値の変数と前記１以上の文字列の変数の値を出力するステップと、
を含む付記１記載の方法。
【００９９】
（付記６）
前記ソフトウェアモジュールは、１以上の条件分岐点と前記１以上の条件分岐点から得られる前記１以上の実行経路とを含み、
前記１以上の条件分岐点のそれぞれは、前記１以上の数値の変数と前記１以上の文字列の変数とにより特定される分岐条件に関連され、
前記ソフトウェアモジュールの実行の間、前記１以上の条件分岐点のそれぞれで、前記ソフトウェアモジュールは、前記１以上の条件分岐点に関連する分岐条件が満たされるかに依存して、前記１以上の実行経路のうちの実行経路に進む、
付記１記載の方法。
【０１００】
（付記７）
前記可能性のあるエラーについて前記ソフトウェアモジュールを検査するステップと、
前記ソフトウェアモジュールの前記１以上の数値の変数と前記１以上の文字列の変数のうちの特定の変数に適用される１以上の制約のセットを決定するステップと、それぞれの制約のセットは、前記ソフトウェアモジュールの前記１以上の実行経路のうちの特定の実行経路に対応し、前記制約が満たされた場合、前記ソフトウェアモジュールに対応する実行経路の終わりに到達させ、
前記それぞれの制約のセットを満たす１以上の解を発見するステップと、
前記解に基づいて前記ソフトウェアモジュールについて１以上のテスト入力値のセットを生成するステップと、
それぞれのテスト入力値のセットを前記ソフトウェアモジュールに適用することで、増加されるテスト範囲で前記ソフトウェアモジュールを検査するステップと、
を含む付記６記載の方法。
【０１０１】
（付記８）
前記それぞれの制約のセットは、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約とに基づいて決定される、
付記７記載の方法。
【０１０２】
（付記９）
前記可能性のある値について前記ソフトウェアモジュールを検査するステップは、前記ソフトウェアモジュールに記号的実行を行い、制約のセットを取得するステップを更に含む、
付記７記載の方法。
【０１０３】
（付記１０）
１以上のプロセッサにより実行可能な命令を含むメモリと、
前記メモリに結合され、前記命令を実行する１以上のプロセッサとを備えるシステムであって、
前記１以上のプロセッサは、前記命令を実行したときに、
１以上の数値の変数、１以上の文字列の変数、前記１以上の数値の変数のうちの特定の変数に適用され、数値又は文字列に関する結果を生成１以上の第一の演算、及び前記１以上の文字列の変数のうちの特定の変数に適用され、数値又は文字列の変数を生成する１以上の第二の演算を有するソフトウェアモジュールに関連する１以上の第一の数値に関する制約と１以上の第一の文字列に関する制約とを分析するステップと、前記第一の数値に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、前記第一の文字列に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、
前記１以上の文字列の変数のうちの特定の変数に適用される１以上の第二の数値に関する制約を推定するステップと、
前記１以上の数値の変数のうちの特定の変数に適用される１以上の第二の文字列に関する制約を推定するステップと、
前記第一の数値に関する制約と前記第二の数値に関する制約のそれぞれを式で表現するステップと、
前記第一の文字列に関する制約と前記第二の文字列に関する制約のそれぞれを有限状態マシンで表現するステップと、
全ての前記第一及び第二の数値に関する制約と全ての前記第一及び第二の文字列に関する制約とを満足する前記１以上の数値の変数と前記１以上の文字列の変数とのうちの特定の変数の１以上の値を含む解を発見することを試みることで、１以上の可能性のあるエラーについて前記ソフトウェアモジュールを検査するステップと、
実行することを特徴とするシステム。
【０１０４】
（付記１１）
前記１以上の数値の変数は、１以上の入力の数値の変数と１以上の中間の数値の変数とを含み、
前記１以上の文字列の変数は、１以上の入力の文字列の変数と１以上の中間の文字列の変数とを含み、
前記１以上の入力の数値の変数のうちの特定の変数に適用される前記第一の数値に関する制約と、前記１以上の入力の文字列の変数のうちの特定の変数に適用される前記第一の文字列に関する制約とは、前記ソフトウェアモジュールの仕様に基づいて決定され、
前記１以上の中間の数値の変数のうちの特定の変数に適用される前記第一の数値に関する制約と、前記１以上の中間の文字列に変数のうちの特定の変数に適用される前記第一の文字列に関する制約とは、前記ソフトウェアモジュールの記号的実行を行うことで決定される、
付記１０記載のシステム。
【０１０５】
（付記１２）
前記第二の数値に関する制約は、前記第一の文字列に関する制約と前記第二の演算とに基づいて推定され、
前記第二の文字列に関する制約は、前記第一の数値に関する制約と前記第一の演算とに基づいて推定される、
付記１０記載のシステム。
【０１０６】
（付記１３）
前記第二の数値に関する制約と前記第二の文字列に関する制約は、ソフトウェアモジュールを実現するプログラミング言語と、前記ソフトウェアモジュールが実行されるランタイム環境との仕様に基づいて更に推定される、
付記１２記載のシステム。
【０１０７】
（付記１４）
全ての前記第一及び第二の数値に関する制約と全ての前記第一及び第二の文字列に関する制約とを満たす解を発見することを試みるステップは、
前記１以上の数値の変数と前記１以上の文字列の変数とについて異なる可能性のある値を繰返し試み、ある解が発見されるか、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約とが満たされないと判定されるか、又はある繰り返し回数が閾値に到達するまで、前記異なる可能性のある値が前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約の全てを満たす解を生成するかを検査するステップと、
前記解が発見された場合、前記１以上の数値の変数と前記１以上の文字列の変数の値を出力するステップと、
を含む付記１０記載のシステム。
【０１０８】
（付記１５）
前記ソフトウェアモジュールは、１以上の条件分岐点と前記１以上の条件分岐点から得られる前記１以上の実行経路とを含み、
前記１以上の条件分岐点のそれぞれは、前記１以上の数値の変数と前記１以上の文字列の変数とにより特定される分岐条件に関連され、
前記ソフトウェアモジュールの実行の間、前記１以上の条件分岐点のそれぞれで、前記ソフトウェアモジュールは、前記１以上の条件分岐点に関連する分岐条件が満たされるかに依存して、前記１以上の実行経路のうちの実行経路に進む、
付記１０記載のシステム。
【０１０９】
（付記１６）
前記可能性のあるエラーについて前記ソフトウェアモジュールを検査するステップは、
前記ソフトウェアモジュールの前記１以上の数値の変数と前記１以上の文字列の変数のうちの特定の変数に適用される１以上の制約のセットを決定するステップと、それぞれの制約のセットは、前記ソフトウェアモジュールの前記１以上の実行経路のうちの特定の実行経路に対応し、前記制約が満たされた場合、前記ソフトウェアモジュールに、対応する実行経路の終わりに到達させ、
前記それぞれの制約のセットを満たす１以上の解を発見するステップと、
前記解に基づいて前記ソフトウェアモジュールについて１以上のテスト入力値のセットを生成するステップと、
それぞれのテスト入力値のセットを前記ソフトウェアモジュールに適用することで、増加されるテスト範囲で前記ソフトウェアモジュールを検査するステップと、
を含む付記１５記載のシステム。
【０１１０】
（付記１７）
前記それぞれの制約のセットは、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約とに基づいて決定される、
付記１６記載のシステム。
【０１１１】
（付記１８）
前記可能性のある値について前記ソフトウェアモジュールを検査するステップは、前記ソフトウェアモジュールに記号的実行を行い、制約のセットを取得するステップを更に含む、
付記１６記載のシステム。
【０１１２】
（付記１９）
１以上のコンピュータ装置に、
ソフトウェアモジュールに関連する１以上の第一の数値に関する制約と１以上の第一の文字列に関する制約とを分析するステップと、前記ソフトウェアモジュールは、１以上の数値の変数、１以上の文字列の変数、前記１以上の数値の変数のうちの特定の変数に適用され、数値又は文字列に関する結果を生成１以上の第一の演算、及び前記１以上の文字列の変数のうつの特定の変数に適用され、数値又は文字列の変数を生成する１以上の第二の演算を備え、前記第一の数値に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、前記第一の文字列に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、
前記１以上の文字列の変数のうちの特定の変数に適用される１以上の第二の数値に関する制約を推定するステップと、
前記１以上の数値の変数のうちの特定の変数に適用される１以上の第二の文字列に関する制約を推定するステップと、
前記第一の数値に関する制約と前記第二の数値に関する制約のそれぞれを式で表現するステップと、
前記第一の文字列に関する制約と前記第二の文字列に関する制約のそれぞれを有限状態マシンで表現するステップと、
全ての前記第一及び第二の数値に関する制約と全ての前記第一及び第二の文字列に関する制約とを満足する前記１以上の数値の変数と前記１以上の文字列の変数とのうちの特定の変数の１以上の値を含む解を発見することを試みることで、１以上の可能性のあるエラーについて前記ソフトウェアモジュールを検査するステップと、
を実行させる命令を含むプログラムを記録したコンピュータ読み取り可能な記録媒体。
【０１１３】
（付記２０）
前記１以上の数値の変数は、１以上の入力の数値の変数と１以上の中間の数値の変数とを含み、
前記１以上の文字列の変数は、１以上の入力の文字列の変数と１以上の中間の文字列の変数とを含み、
前記１以上の入力の数値の変数のうちの特定の変数に適用される前記第一の数値に関する制約と、前記１以上の入力の文字列の変数のうちの特定の変数に適用される前記第一の文字列に関する制約とは、前記ソフトウェアモジュールの仕様に基づいて決定され、
前記１以上の中間の数値の変数のうちの特定の変数に適用される前記第一の数値に関する制約と、前記１以上の中間の文字列に変数のうちの特定の変数に適用される前記第一の文字列に関する制約とは、前記ソフトウェアモジュールの記号的実行を行うことで決定される、
付記１９記載のコンピュータ読み取り可能な記録媒体。
【０１１４】
（付記２１）
前記第二の数値に関する制約は、前記第一の文字列に関する制約と前記第二の演算とに基づいて推定され、
前記第二の文字列に関する制約は、前記第一の数値に関する制約と前記第一の演算とに基づいて推定される、
付記１９記載のコンピュータ読み取り可能な記録媒体。
【０１１５】
（付記２２）
前記第二の数値に関する制約と前記第二の文字列に関する制約は、ソフトウェアモジュールを実現するプログラミング言語と、前記ソフトウェアモジュールが実行されるランタイム環境との仕様に基づいて更に推定される、
付記２１記載のコンピュータ読み取り可能な記録媒体。
【０１１６】
（付記２３）
全ての前記第一及び第二の数値に関する制約と全ての前記第一及び第二の文字列に関する制約とを満たす解を発見することを試みるステップは、
前記１以上の数値の変数と前記１以上の文字列の変数とについて異なる可能性のある値を繰返し試み、ある解が発見されるか、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約とが満たされないと判定されるか、又はある繰り返し回数が閾値に到達するまで、前記異なる可能性のある値が前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約の全てを満たす解を生成するかを検査するステップと、
前記解が発見された場合、前記１以上の数値の変数と前記１以上の文字列の変数の値を出力するステップと、
を含む付記１９記載のコンピュータ読み取り可能な記録媒体。
【０１１７】
（付記２４）
前記ソフトウェアモジュールは、１以上の条件分岐点と前記１以上の条件分岐点から得られる前記１以上の実行経路とを含み、
前記１以上の条件分岐点のそれぞれは、前記１以上の数値の変数と前記１以上の文字列の変数とにより特定される分岐条件に関連され、
前記ソフトウェアモジュールの実行の間、前記１以上の条件分岐点のそれぞれで、前記ソフトウェアモジュールは、前記１以上の条件分岐点に関連する分岐条件が満たされるかに依存して、前記１以上の実行経路のうちの実行経路に進む、
付記１９記載のコンピュータ読み取り可能な記録媒体。
【０１１８】
（付記２５）
前記可能性のあるエラーについて前記ソフトウェアモジュールを検査するステップと、
前記ソフトウェアモジュールの前記１以上の数値の変数と前記１以上の文字列の変数のうちの特定の変数に適用される１以上の制約のセットを決定するステップと、それぞれの制約のセットは、前記ソフトウェアモジュールの前記１以上の実行経路のうちの特定の実行経路に対応し、前記制約が満たされた場合、前記ソフトウェアモジュールに対応する実行経路の終わりに到達させ、
前記それぞれの制約のセットを満たす１以上の解を発見するステップと、
前記解に基づいて前記ソフトウェアモジュールについて１以上のテスト入力値のセットを生成するステップと、
それぞれのテスト入力値のセットを前記ソフトウェアモジュールに適用することで、増加されるテスト範囲で前記ソフトウェアモジュールを検査するステップと、
を含む付記２４記載のコンピュータ読み取り可能な記録媒体。
【０１１９】
（付記２６）
前記それぞれの制約のセットは、前記第一及び第二の数値に関する制約と前記第一及び第二の文字列に関する制約とに基づいて決定される、
付記２５記載のコンピュータ読み取り可能な記録媒体。
【０１２０】
（付記２７）
前記可能性のある値について前記ソフトウェアモジュールを検査するステップは、前記ソフトウェアモジュールに記号的実行を行い、制約のセットを取得するステップを更に含む、
付記２５記載のコンピュータ読み取り可能な記録媒体。
【０１２１】
（付記２８）
ソフトウェアモジュールに関連する１以上の第一の数値に関する制約と１以上の第一の文字列に関する制約とを分析する手段と、前記ソフトウェアモジュールは、１以上の数値の変数、１以上の文字列の変数、前記１以上の数値の変数のうちの特定の変数に適用され、数値又は文字列に関する結果を生成１以上の第一の演算、及び前記１以上の文字列の変数のうつの特定の変数に適用され、数値又は文字列の変数を生成する１以上の第二の演算を備え、前記第一の数値に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、前記第一の文字列に関する制約は、前記１以上の数値の変数のうちの特定の変数に適用され、
前記１以上の文字列の変数のうちの特定の変数に適用される１以上の第二の数値に関する制約を推定する手段と、
前記１以上の数値の変数のうちの特定の変数に適用される１以上の第二の文字列に関する制約を推定する手段と、
前記第一の数値に関する制約と前記第二の数値に関する制約のそれぞれを式で表現する手段と、
前記第一の文字列に関する制約と前記第二の文字列に関する制約のそれぞれを有限状態マシンで表現する手段と、
全ての前記第一及び第二の数値に関する制約と全ての前記第一及び第二の文字列に関する制約とを満足する前記１以上の数値の変数と前記１以上の文字列の変数とのうちの特定の変数の１以上の値を含む解を発見することを試みることで、１以上の可能性のあるエラーについて前記ソフトウェアモジュールを検査する手段と、
を備えることを特徴とするシステム。
【符号の説明】
【０１２２】
２００：システム
２０２：交差制約発生器
２０４：制約解法手段
２０６：記号的実行
２１２：ソフトウェアモジュール
２１４：指定された制約
【図１】
0005786513.tif 000005
【図２】
0005786513.tif 000006
【図３】
0005786513.tif 000007
【図４】
0005786513.tif 000008
【図５】
0005786513.tif 000009
【図６】
0005786513.tif 000010
【図７】
0005786513.tif 000011
【図８】
0005786513.tif 000012
【図９Ａ】
0005786513.tif 000013
【図９Ｂ】
0005786513.tif 000014
【図９Ｃ】
0005786513.tif 000015
【図１０】
0005786513.tif 000016
【図１１】
0005786513.tif 000017
【図１２】
0005786513.tif 000018
【図１３】
0005786513.tif 000019