(57)【要約】【課題】自動化されたソフトウェアプログラム修復候補の選択のための方法等を提供する。【解決手段】実施形態の態様に従って、方法は、テストスイートを用いてテスト済みのソフトウェアプログラムにおいて欠陥の欠陥位置を特定し、欠陥のための修復候補を取得することを含んでよい。更に、方法は、修復候補の修復コードパターンを取得し、複数の既存のソフトウェアプログラムの既存のコードにおける修復コードパターンの発生回数を決定することを含んでよい。更には、方法は、修復コードパターンの発生回数に基づき、修復候補を、テスト済みソフトウェアプログラムの修復として優先順位付けすることを含んでよい。方法はまた、修復候補の優先順位付けに従って、テスト済みソフトウェアプログラムに対して修復動作を実行することを含んでよい。【選択図】図３
2019096292.tif 000002
【特許請求の範囲】
【請求項１】
テストスイートを用いてテスト済みのソフトウェアプログラムにおいて欠陥の欠陥位置を特定し、
前記欠陥のための修復候補を取得し、
前記修復候補の修復コードパターンを取得し、
複数の既存のソフトウェアプログラムの既存のコードにおける前記修復コードパターンの発生回数を決定し、
前記修復コードパターンの前記発生回数に基づき、前記修復候補を、前記テスト済みソフトウェアプログラムの修復として優先順位付けし、
前記修復候補の前記優先順位付けに従って、前記テスト済みソフトウェアプログラムに対して修復動作を実行する
ことを有する方法。
【請求項２】
複数の共通コードパターンを前記既存のコードから取得し、
前記既存のコードにおける前記複数の共通コードパターンの発生回数を決定し、
前記修復コードパターンが前記複数の共通コードパターンの中の特定の共通コードパターンと一致するとの決定に基づき、且つ、前記特定の共通コードパターンの決定された特定の発生回数に基づき、前記修復コードパターンの発生回数を決定する
ことを更に有する、請求項１に記載の方法。
【請求項３】
前記特定の共通コードパターンを取得することは、
特定の既存のソフトウェアプログラムの特定の既存のコードの部分を取得し、
前記特定の既存のコードの前記部分を正規化し、
前記正規化された部分において前記特定の共通コードパターンにバイアスをかける
ことを含む、請求項２に記載の方法。
【請求項４】
前記特定の既存のコードの前記部分を正規化することは、前記部分の特にラベルを付されたオブジェクトを、一般的にラベルを付されたオブジェクトへ変更することを含み、
前記特にラベルを付されたオブジェクト及び前記一般的にラベルを付されたオブジェクトは、同じオブジェクトタイプである、
請求項３に記載の方法。
【請求項５】
前記特定の既存のコードの前記部分を正規化することは、
前記部分の表現の複雑度が複雑度閾値を満足すると決定し、
前記複雑度が前記複雑度閾値を満足すると決定することをに応答して前記表現を簡約する
ことを含む、請求項３に記載の方法。
【請求項６】
前記正規化された部分において前記特定の共通コードパターンにバイアスをかけることは、前記正規化された部分を前記特定の共通コードパターンとして使用することを含む、
請求項３に記載の方法。
【請求項７】
前記正規化された部分において前記特定の共通コードパターンにバイアスをかけることは、
前記正規化された部分に対応するハッシュ値を得るようハッシュ関数を前記正規化された部分に適用し、
前記ハッシュ値を前記特定の共通コードパターンとして使用する
ことを含む、請求項３に記載の方法。
【請求項８】
前記修復候補の前記修復コードパターンを取得することは、
前記修復候補の修復コードを正規化し、
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかける
ことを含む、請求項１に記載の方法。
【請求項９】
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかけることは、前記正規化された修復コードを前記修復コードパターンとして使用することを含む、
請求項８に記載の方法。
【請求項１０】
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかけることは、
前記正規化された修復コードに対応するハッシュ値を得るようハッシュ関数を前記正規化された修復コードに適用し、
前記ハッシュ値を前記修復コードパターンとして使用する
ことを含む、請求項８に記載の方法。
【請求項１１】
実行されることに応答して、システムに、
テストスイートを用いてテスト済みのソフトウェアプログラムにおいて欠陥の欠陥位置を特定し、
前記欠陥のための修復候補を取得し、
前記修復候補の修復コードパターンを取得し、
複数の既存のソフトウェアプログラムの既存のコードにおける前記修復コードパターンの発生回数を決定し、
前記修復コードパターンの前記発生回数に基づき、前記修復候補を、前記テスト済みソフトウェアプログラムの修復として優先順位付けし、
前記修復候補の前記優先順位付けに従って、前記テスト済みソフトウェアプログラムに対して修復動作を実行する
ことを有する動作を実行させる命令を記憶するよう構成された非一時的なコンピュータ可読記憶媒体。
【請求項１２】
前記動作は、
複数の共通コードパターンを前記既存のコードから取得し、
前記既存のコードにおける前記複数の共通コードパターンの発生回数を決定し、
前記修復コードパターンが前記複数の共通コードパターンの中の特定の共通コードパターンと一致するとの決定に基づき、且つ、前記特定の共通コードパターンの決定された特定の発生回数に基づき、前記修復コードパターンの発生回数を決定する
ことを更に有する、請求項１１に記載のコンピュータ可読記憶媒体。
【請求項１３】
前記特定の共通コードパターンを取得することは、
特定の既存のソフトウェアプログラムの特定の既存のコードの部分を取得し、
前記特定の既存のコードの前記部分を正規化し、
前記正規化された部分において前記特定の共通コードパターンにバイアスをかける
ことを含む、請求項１２に記載のコンピュータ可読記憶媒体。
【請求項１４】
前記特定の既存のコードの前記部分を正規化することは、前記部分の特にラベルを付されたオブジェクトを、一般的にラベルを付されたオブジェクトへ変更することを含み、
前記特にラベルを付されたオブジェクト及び前記一般的にラベルを付されたオブジェクトは、同じオブジェクトタイプである、
請求項１３に記載のコンピュータ可読記憶媒体。
【請求項１５】
前記特定の既存のコードの前記部分を正規化することは、
前記部分の表現の複雑度が複雑度閾値を満足すると決定し、
前記複雑度が前記複雑度閾値を満足すると決定することをに応答して前記表現を簡約する
ことを含む、請求項１３に記載のコンピュータ可読記憶媒体。
【請求項１６】
前記正規化された部分において前記特定の共通コードパターンにバイアスをかけることは、前記正規化された部分を前記特定の共通コードパターンとして使用することを含む、
請求項１３に記載のコンピュータ可読記憶媒体。
【請求項１７】
前記正規化された部分において前記特定の共通コードパターンにバイアスをかけることは、
前記正規化された部分に対応するハッシュ値を得るようハッシュ関数を前記正規化された部分に適用し、
前記ハッシュ値を前記特定の共通コードパターンとして使用する
ことを含む、請求項１３に記載のコンピュータ可読記憶媒体。
【請求項１８】
前記修復候補の前記修復コードパターンを取得することは、
前記修復候補の修復コードを正規化し、
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかける
ことを含む、請求項１１に記載のコンピュータ可読記憶媒体。
【請求項１９】
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかけることは、前記正規化された修復コードを前記修復コードパターンとして使用することを含む、
請求項１８に記載のコンピュータ可読記憶媒体。
【請求項２０】
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかけることは、
前記正規化された修復コードに対応するハッシュ値を得るようハッシュ関数を前記正規化された修復コードに適用し、
前記ハッシュ値を前記修復コードパターンとして使用する
ことを含む、請求項１８に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示で説明される実施形態は、自動化されたソフトウェアプログラム修復候補の選択に関係がある。
【背景技術】
【０００２】
ソフトウェアプログラムは、それらの中にしばしば欠陥（“バグ”と広く呼ばれる。）を有している。その場合に、ソフトウェアプログラムは、意図されたように動作しないことがある。しばしば、自動化された修復システムが、ソフトウェアプログラム内の欠陥を特定及び修正しようとして使用される。
【０００３】
本開示で請求される主題は、上述されたもののような環境でしか動作しない実施形態又は如何なる欠点も解消する実施形態に制限されない。むしろ、この背景は、本開示で記載されるいくつかの実施形態が実施され得る技術分野の一例を説明するためにのみ与えられる。
【発明の概要】
【０００４】
実施形態の態様に従って、方法は、テストスイートを用いてテスト済みのソフトウェアプログラムにおいて欠陥の欠陥位置を特定し、欠陥のための修復候補を取得することを含んでよい。更に、方法は、修復候補の修復コードパターンを取得し、複数の既存のソフトウェアプログラムの既存のコードにおける修復コードパターンの発生回数を決定することを含んでよい。更には、方法は、修復コードパターンの発生回数に基づき、修復候補を、テスト済みソフトウェアプログラムの修復として優先順位付けすることを含んでよい。方法はまた、修復候補の優先順位付けに従って、テスト済みソフトウェアプログラムに対して修復動作を実行することを含んでよい。
【０００５】
実施形態の目的及び利点は、特許請求の範囲で特に指し示されている要素、特徴、及び組み合わせによって少なくとも実現及び達成されるだろう。
【０００６】
前述の概要及び以下の詳細な説明はいずれも例として与えられており、説明のためであって、請求される発明の限定ではない。
【図面の簡単な説明】
【０００７】
例となる実施形態は、添付の図面の使用を通じて、更なる特定及び詳細をもって記載及び説明されることになる。
【０００８】
【図１】ソフトウェアプログラムを修復することに関連した環境の例を表す図である。
【０００９】
【図２】ソフトウェアプログラムを修復するよう構成され得るコンピュータシステムの例を表す。
【００１０】
【図３】ソフトウェアプログラムを修復する方法の例のフローチャートである。
【００１１】
【図４】共通コードパターンデータベースにポピュレートする方法の例のフローチャートである。
【００１２】
【図５】コードパターンを取得する方法の例のフローチャートである。
【発明を実施するための形態】
【００１３】
本開示で記載されるいくつかの実施形態は、ソフトウェアプログラムを修復する方法及びシステムに関係がある。ソフトウェアプログラムは、ソフトウェアプログラムを意図されていない様態で動作させることがある欠陥（“バグ”とも広く呼ばれる。）をしばしば含む。その上、自動修復システム及び技術は、欠陥を検出及び修正してソフトウェアプログラムを修復するためにしばしば使用される。しかし、自動修復システム及び技術は、欠陥を修正するための修復を選択するときにしばしばうまく働かない。
【００１４】
本開示の１つ以上の実施形態に従って、テスト済みソフトウェアプログラムの修復候補は、既に存在しているコードに基づき、テスト済みソフトウェアプログラム内で欠陥を修正するよう、優先順位付けされて選択され得る。例えば、いくつかの実施形態では、既存のソフトウェアプログラムの１つ以上のリポジトリがアクセスされてよく、対応するコード内のパターンが取得され得る。本開示において、既存のソフトウェアプログラムから取得されるコードパターンは、“共通コードパターン”と呼ばれ得る。その上、既存のソフトウェアプログラムのリポジトリは、ある種類の共通コードパターンがどのくらいの頻度で比較的大規模に使用され得るかが決定され得るように、多数のソフトウェアプログラム（例えば、数千、数万、数十万、数百万、等といったソフトウェアプログラム）を含んでよい。本開示において、解析のために例えば１つ以上のリポジトリにおいて利用可能であり得るソフトウェアプログラム及びそれらの対応するコードは、“ビッグコード”と呼ばれ得る。
【００１５】
本開示のいくつかの実施形態では、共通コードパターンと、解析されたビッグコード内で各共通コードパターンが遭遇される回数とは、共通コードパターンデータベースに格納されてよい。その上、いくつかの実施形態では、特定の修復候補の特定のコードパターン（本開示では“修復コードパターン”と呼ばれる。）も取得されてよい。それら又は他の実施形態において、特定の修復コードパターンは、解析されたビッグコード内で特定の修復コードパターンが何回現れ得るかを決定するよう、共通コードパターンデータベースに含まれている共通コードパターンと比較されてよい。その上、以下で詳細に説明されるように、特定の修復候補は、解析されたビッグコードにおける特定の修復コードパターンの発生の回数に基づき、テスト済みソフトウェアプログラムの修復として優先順位付けされてよい。それら又は他の実施形態において、修復動作は、特定の修復候補の優先順位付け及び／又は１つ以上の他の修復候補の優先順位付けに従って、テスト済みソフトウェアプログラムに対して実行されてよい。記載される修復候補の解析及び優先順位付けは、既存のソフトウェアプログラムにおいて一般に使用されており、よって、一般に使用されていないような修復候補よりも有効である可能性が高いコードパターンを有している修復候補を選択することによって、自動ソフトウェアプログラム修復の効率を改善し得る。
【００１６】
本開示の実施形態は、添付の図面を参照して説明される。
【００１７】
図１は、本開示で記載される少なくとも１つの実施形態に従って配置される、ソフトウェアプログラムを修復することに関連した、例となる環境１００を表す図である。環境１００は、欠陥について被試験コード（code  under  test）１０４を解析するよう構成された修復モジュール１０６を含んでよい。修復モジュール１０６はまた、変更された被試験コード１０８を出力するよう構成されてよい。変更された被試験コード１０８は、修復モジュール１０６によって行われた修復動作により被試験コード１０４に対してなされた１つ以上の変更を含んでよい。
【００１８】
被試験コード１０４は、例えば、ソフトウェアプログラム、ソフトウェアプログラムのコード、ライブラリ、アプリケーション、スクリプト、若しくは他のロジック、又はプロセッシングデバイスによる実行のための命令のような、電子データを含んでよい。いくつかの実施形態では、被試験コード１０４は、ソフトウェアプログラムの完全なインスタンスを含んでよい。その上、又は代替的に、被試験コード１０４は、ソフトウェアプログラムの部分を含んでよい。被試験コード１０４は、ソフトウェアプログラムのために使用され得る如何なる適切なタイプのコンピュータ言語でも記述されてよい。
【００１９】
修復モジュール１０６は、変更された被試験コード１０８を生成するよう被試験コード１０４の１つ以上の変更を実行することをコンピュータデバイスに可能にするよう構成されたコード及びルーチンを含んでよい。その上、又は代替的に、修復モジュール１０６は、プロセッサ、マイクロプロセッサ（例えば、１つ以上の動作を実行するか又はその実行を制御するもの）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、又は特定用途向け集積回路（ＡＳＩＣ）を含むハードウェアを用いて実装されてよい。いくつかの他の例では、修復モジュール１０６は、ハードウェアとソフトウェアとの組み合わせを用いて実装されてよい。本開示では、修復モジュール１０６によって実行されるものとして記載される動作は、修復モジュール１０６が対応するシステムに実行するよう指示し得る動作を含んでよい。
【００２０】
修復モジュール１０６は、被試験コード１０４内の１つ以上の欠陥を修復（修正とも呼ばれる。）するために使用され得る一連の修復動作を被試験コード１０４に対して実行するよう構成されてよい。いくつかの実施形態では、修復モジュール１０６は、修復テンプレート１１２及び１つ以上のテストスイート１１１に基づき１つ以上の修復動作を実行するよう構成されてよい。
【００２１】
修復テンプレート１１２は、如何なる適切なタイプの命令又はルーチンも含んでよく、命令又はルーチンは、実行される場合に、被試験コード１０４における欠陥の存在に応答して１つ以上の変更を被試験コード１０４に対して実装するよう構成され得る。変更は、欠陥を修復するか又は修復しようと試みることができる変更点を被試験コードに含めてよい。本開示において、実行され得る変更は、“修復候補”又は“修復”と呼ばれ得る。
【００２２】
テストスイート１１１は、被試験コード１０４のためのテストケースとなり得る１つ以上のルーチンを含んでよい。テストスイート１１１は、被試験コード１０４が特定の様態で動くかどうかを判定するよう構成されてよい。テストスイート１１１は、如何なる適切な技術にも従って構成されてよい。
【００２３】
修復モジュール１０６は、１つ以上のテストスイート１１１を被試験コード１０４に対して適用して被試験コード１０４内で１つ以上の欠陥及び対応する欠陥位置を検出又は決定するよう構成されてよい。いくつかの実施形態では、修復モジュール１０６は、テストスイート１１１に含まれている１つ以上のテストを実行するよう構成されてよい。これは、テスト実行を実施するとも呼ばれ得る。通過するテスト実行は、“テスト実行合格”と呼ばれてよく、失敗するテスト実行は、“テスト実行落第”と呼ばれてよい。いくつかの実施形態では、被試験コード１０４の欠陥位置及び対応する欠陥は、テスト実行落第が欠陥位置で現れることに基づき特定されてよい。
【００２４】
いくつかの実施形態では、修復モジュール１０６は、検出された欠陥を修復するよう行われ得る潜在的な変更として、修復テンプレートから、修復候補を取得するよう構成されてよい。それら又は他の実施形態において、修復モジュール１０６は、修復候補のコードを正規化するよう構成されてよい。本開示において、修復候補のコードは“修復コード”と呼ばれ得る。その上、又は代替的に、いくつかの実施形態では、修復コードの部分が正規化されてよく、あるいは、修復コードの全体が正規化されてよい。
【００２５】
いくつかの実施形態では、修復コードは、図５に関して以下で記載される１つ以上の動作に従って正規化されてよい。
【００２６】
いくつかの実施形態では、修復モジュール１０６は、正規化された修復コードに基づき、修復コードパターンを取得してよい。例えば、いくつかの実施形態では、正規化された修復コードが修復コードパターンとして使用されてよい。その上、又は代替的に、ハッシュ関数が、修復コードの特定のパターンを示し得るハッシュ値を得るよう、正規化された修復コードに適用されてよい。それら又は他の実施形態において、得られたハッシュ値は、修復コードパターンとして使用されてよい。
【００２７】
いくつかの実施形態では、修復モジュール１０６は、共通コードパターンデータベース１１４にアクセスするよう構成されてよい。共通コードパターンデータベース１１４は、ビッグコードから導出され得る共通コードパターンを含んでよい。例えば、共通コードパターンは、既存のソフトウェアプログラムの１つ以上のリポジトリに格納され得る既存のソフトウェアプログラムの既存のコードから導出されてよい。その上、いくつかの実施形態では、共通コードパターンデータベース１１４は、共通コードパターンの夫々とともに格納されている入力カウンタ値を含んでよい。入力カウンタ値は、共通コードパターンを取得するために実行され得るビッグコードの解析中に見つけられ得るその対応する共通コードパターンの発生の回数を示すことができる。
【００２８】
いくつかの実施形態では、共通コードパターンは、既存のソフトウェアプログラムの既存のコードの正規化された部分に基づいてよい。正規化は、修復コード及び共通コードに特有であり得るが、一般的なパターン及び構造も有し得るパラメータが、一般的なパターン及び構造を反映する一般的な形式に正規化され得るようにするものであってよい。よって、正規化は、異なるコードのコードパターンの比較を可能にし得る。
【００２９】
いくつかの実施形態では、既存のコードの部分は、図５に関して以下で記載される１つ以上の動作に従って正規化されてよい。
【００３０】
いくつかの実施形態では、共通コードパターンは、正規化された既存のコードに基づいてよい。例えば、いくつかの実施形態では、特定の部分に対応する正規化された既存のコードが、特定の共通コードパターンとして使用されてよい。その上、又は代替的に、ハッシュ関数が、既存のコードの対応する部分の特定のパターンを示し得るハッシュ値を得るよう、正規化された既存のコードに適用されてよい。それら又は他の実施形態において、得られたハッシュ値は、対応する共通コードパターンとして使用されてよい。いくつかの実施形態では、共通コードパターンデータベース１１４に含まれている共通コードパターン及び共通コードパターンの発生は、図４及び５に関して以下で記載される１つ以上の動作に従って取得されてよい。
【００３１】
修復モジュール１０６は、修復候補の修復コードパターンを、共通コードパターンデータベース１１４に含まれている共通コードパターンと比較して、解析されたビッグコード内で特定の修復コードパターンが何回現れ得るかを決定するよう構成されてよい。例えば、いくつかの実施形態では、修復モジュール１０６は、修復コードパターンが、共通コードパターンデータベース１１４に含まれている共通コードパターンのうちの１つと一致するか否かを判定してよい。修復コードパターンが特定の共通コードパターンと一致するとの決定に応答して、修復モジュール１０６は、特定の共通コードパターンと併せて共通コードパターンデータベース１１４に格納され得る特定の共通コードパターンの発生回数に関連した入力カウンタ値を取得するよう構成されてよい。このようにして、取得された値は、ビッグコードにおける修復コードパターンの発生回数を示すことができ、よって、修復候補と同じコードパターンを有しているコードがビッグコード内で如何に広く使用され得るかを示し得る。その上、又は代替的に、修復コードパターンが特定の共通コードパターンと一致しないとの決定に応答して、修復モジュール１０６は、修復候補コードパターンの発生回数として“０”を使用するよう構成されてよい。
【００３２】
いくつかの実施形態では、修復モジュール１０６は、修復コードパターンの決定された発生回数に基づき、修復候補を欠陥の修復として優先順位付けするよう構成されてよい。例えば、いくつかの実施形態では、複数の修復候補は、解析されたビッグコード内で夫々の対応する修復コードパターンが見つけられ得る発生の回数を決定するよう、上述されたように解析されてよい。複数の修復候補は、発生回数に基づき優先順位付けされてよく、その場合に、より多く発生する修復候補は、発生がより少ない修復候補に対して優先される。その上、又は代替的に、いくつかの実施形態では、特定の閾数よりも発生が少ないと決定された修復候補は、潜在的な修復として完全に検討から外されてよい。
【００３３】
いくつかの実施形態では、発生閾値は、（１）共通コードパターンについて解析されたビッグコード内のソフトウェアプログラムの数、（２）ビッグコードの解析において特定された異なる共通コードパターンの数、及び（３）解析されたビッグコード内で特定された全ての共通コードパターンの発生の総数、に基づいてよい。例えば、パターンの平均発生回数は、全ての共通コードパターンの発生の総数を異なる共通コードパターンの数で除すること（“因子（３）／因子（２）”）によって計算され得る。いくつかの実施形態では、発生閾値は、平均と比較して相対的に小さな数、例えば、平均の１％、２％、５％、１０％、等として設定されてよい。例えば、平均発生回数が３００であり、閾値が平均の１％に基づく場合に、発生閾値は３に設定され得る。
【００３４】
いくつかの実施形態では、修復モジュール１０６はまた、修復候補の優先順位付けに基づき被試験コード１０４に対して修復を実行するよう構成されてよい。例えば、修復モジュール１０６は、最も高い優先順位から最も低い優先順位までの降順において修復候補を潜在的な修復として実装してよい。その上、又は代替的に、修復モジュール１０６は、変更された被試験コード１０８を出力するよう構成されてよい。変更された被試験コード１０８は、修復候補の優先順位付けに基づき実装され得る１つ以上の修復を含んでよい。
【００３５】
変更、追加、又は省略が、本開示の適用範囲から外れることなしに、図１に対して行われてよい。例えば、環境１００は、本開示で図解及び記載されているものよりも多い又は少ない要素を含んでよい。その上、いくつかの実施形態では、修復モジュール１０６の１つ以上のルーチン、１つ以上の命令、又はコードの少なくとも一部分と、テストスイート１１１と、修復テンプレート１１２とは、それらが同じ要素と見なされ得るか、あるいは、修復モジュール１０６、テストスイート１１１、及び修復テンプレート１１２のうちの２つ以上の部分と見なされ得る共通のセクションを有し得るように、組み合わされてよい。
【００３６】
図２は、本開示の少なくとも１つの実施形態に従う、例となるコンピュータシステム２０２のブロック図を表す。コンピュータシステム２０２は、修復モジュール（例えば、修復モジュール１０６）と関連する１つ以上の動作を実装又は指示するよう構成されてよい。コンピュータシステム２０２は、プロセッサ２５０、メモリ２５２、及びデータストレージ２５４を含んでよい。プロセッサ２５０、メモリ２５２、及びデータストレージ２５４は、通信上結合されてよい。
【００３７】
一般に、プロセッサ２５０は、様々なコンピュータハードウェア又はソフトウェアモジュールを含む如何なる適切な専用又は汎用コンピュータ、コンピュータエンティティ、又はプロセッシングデバイスも含んでよく、如何なる適用可能なコンピュータ可読記憶媒体においても記憶された命令を実行するよう構成されてよい。例えば、プロセッサ２５０は、マイクロプロセッサ、マイクロコントローラ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、あるいは、プログラム命令を解釈するよう及び／若しくは実行するよう並びに／又はデータを処理するよう構成された如何なる他のデジタル又はアナログ回路構成も含んでよい。図２では単一のプロセッサとして表されているが、プロセッサ２５０は、本開示で記載される動作をいくつでも個々に又は集合的に実行するか又はそのような実行を指示するよう構成されるプロセッサをいくつでも含んでよい。その上、プロセッサの１つ以上は、１つ以上の異なる電子デバイス、例えば、異なるサーバにおいて存在してよい。
【００３８】
いくつかの実施形態では、プロセッサ２５０は、メモリ２５２、データストレージ２５４、又はメモリ２５２及びデータストレージ２５４に記憶されているプログラム命令を解釈及び／若しくは実行し、並びに／又はそのように記憶されているデータを処理するよう構成されてよい。いくつかの実施形態では、プロセッサ２５０は、データストレージ２５４からプログラム命令をフェッチし、プログラム命令をメモリ２５２にロードしてよい。プログラム命令がメモリ２５２にロードされた後、プロセッサ２５０はプログラム命令を実行してよい。
【００３９】
例えば、いくつかの実施形態では、修復モジュールは、プログラム命令としてデータストレージ２５４に含まれてよい。プロセッサ２５０は、修復モジュールのプログラム命令をデータストレージ２５４からフェッチしてよく、そして、修復モジュールのプログラム命令をメモリ２５２にロードしてよい。修復モジュールのプログラム命令がメモリ２５２にロードされた後、プロセッサ２５０は、コンピュータシステムが、命令によって指示されるように、修復モジュールに関連した動作を実装し得るように、プログラム命令を実行してよい。
【００４０】
メモリ２５２及びデータストレージ２５４は、コンピュータ実行可能な命令又はデータ構造を搬送するか、又はそれらが記憶されているコンピュータ可読記憶媒体を含んでよい。そのようなコンピュータ可読記憶媒体は、プロセッサ２５０のような汎用又は専用のコンピュータによってアクセスされ得る如何なる利用可能な媒体も含んでよい。一例として、制限なしに、そのようなコンピュータ可読記憶媒体には、ランダムアクセスメモリ（ＲＡＭ）、リードオンリーメモリ（ＲＯＭ）、電気的消去可能なプログラム可能リードオンリーメモリ（ＥＥＰＲＯＭ）、コンパクトディスク・リードオンリーメモリ（ＣＤ−ＲＯＭ）若しくは他の光ディスクストレージ、磁気ディスクストレージ若しくは他の磁気記憶デバイス、フラッシュメモリデバイス（例えば、固体状態メモリデバイス）、あるいは、コンピュータ実行可能な命令又はデータ構造の形で特定のプログラムコードを搬送又は記憶するために使用され得、且つ、汎用又は専用のコンピュータによってアクセスされ得る如何なる他の記憶媒体も含む有形又は非一時的なコンピュータ可読記憶媒体が含まれ得る。上記の組み合わせも、コンピュータ可読記憶媒体の適用範囲内に含まれ得る。コンピュータ実行可能命令は、例えば、プロセッサ２５０に特定の動作又は動作群を実行させるよう構成される命令及びデータを含んでよい。
【００４１】
変更、追加、又は省略は、本開示の適用範囲から外れることなしに、コンピュータシステム２０２に対して行われてよい。例えば、いくつかの実施形態では、コンピュータシステム２０２は、明示的に図解又は記載され得ない他のコンポーネントをいくつでも含んでよい。
【００４２】
図３は、本開示で記載される少なくとも１つの実施形態に従って配置されるソフトウェアプログラムを修復する、例となる方法３００のフローチャートである。方法３００は、被試験コードに対して如何なる適切なシステム、装置、又はデバイスによっても実行されてよい。例えば、図１の修復モジュール１０６又は図２のコンピュータシステム２０２（例えば、修復モジュールによって指示されるもの）が、被試験コード１０４に対して、方法３００に関連した動作のうちの１つ以上を実行してよい。別個のブロックにより表されているが、方法３００のブロックのうちの１つ以上に関連したステップ及び動作は、特定の実施に応じて、更なるブロックに分けられても、より少ないブロックへとまとめられても、あるいは削除されてもよい。
【００４３】
方法３００はブロック３０２から開始してよい。ブロック３０２において、欠陥及びその対応する欠陥位置が被試験コード内で特定されてよい。欠陥の特定は、如何なる適切な技術を用いても、被試験コードに対して実行されてよい。例えば、いくつかの実施形態では、欠陥の特定は、１つ以上のテストスイートのテスト実行を被試験コードに対して実行することに基づき、実行されてよい。
【００４４】
ブロック３０４において、修復候補が取得されてよい。いくつかの実施形態では、修復候補は、例えば上述されたように、修復テンプレートに基づき取得されてよい。
【００４５】
ブロック３０６において、修復候補の修復コードパターンが取得される。いくつかの実施形態では、修復コードパターンは、図５に関して以下で記載される１つ以上の動作に従って取得されてよい。
【００４６】
ブロック３０８において、前もって解析されているビッグコード内での修復コードパターンの発生回数が決定されてよい。例えば、発生回数は、例えば図１に関して上述されたように、共通コードパターンデータベースに含まれている情報に基づき、決定されてよい。
【００４７】
ブロック３１０において、優先順位付けが、解析されたビッグコードにおける決定された発生回数に基づき、修復候補について決定されてよい。いくつかの実施形態では、優先順位付けは、図１に関して上述されたのと類似又は同じであってよい。
【００４８】
ブロック３１２において、ブロック３１０で決定され得る修復候補の優先順位付けに基づき、修復が実行されてよい。例えば、いくつかの実施形態では、修復候補がその決定された発生回数と発生閾値との間の比較に基づき受け入れられると見なされることを優先順位付けが示す場合に、修復候補はブロック３１２で受け入れられ実装されてよい。対照的に、修復候補がその決定された発生回数と発生閾値との間の比較に基づき受け入れられないと見なされることを優先順位付けが示す場合に、修復候補は拒絶されてよく、そして、他の修復候補が選択されてよい。
【００４９】
それら又は他の実施形態において、欠陥位置に対応し得る複数の修復候補は、ブロック３０４、３０６、３０８、及び３１０に基づき優先順位付けされてよい。ブロック３１２では、複数の修復候補のうちの、最も高い優先順位を有している修復候補が、実装されてよい。
【００５０】
ブロック３１４において、変更された被試験コードが出力されてよい。変更された被試験コードは、上述された修復の優先順位付けに基づき実装され得る１つ以上の修復候補を含んでよく、それにより、変更された被試験コードは、ブロック３０２で受け取られ得る被試験コードの修復されたバージョンを含むことができる。
【００５１】
方法３００は、ソフトウェアプログラムのテスト及び修復の効率及び有効性を改善し得る。例えば、記載されるような修復候補の優先順位付けの決定は、修復候補の実効性に関して、より良い決定を行うことを助ける。
【００５２】
変更、追加、又は省略は、本開示の適用範囲から外れることなしに、方法３００に対して行われてよい。例えば、方法３００の動作は、異なる順序で実施されてよい。その上、又は代替的に、２つ以上の動作は、同時に実行されてよい。更には、説明されているアクション及び動作は、単に例として与えられており、アクション及び動作の一部は、開示されている実施形態の本質から逸脱することなしに、任意であっても、より少ないアクション及び動作へとまとめられても、あるいは、更なるアクション及び動作に拡張されてもよい。
【００５３】
例えば、いくつかの実施形態では、方法３００は繰り返し実行されてよく、その場合に、一度に１つの欠陥位置及び該欠陥位置に対応する１つの修復候補が解析され得る。その上、又は代替的に、１つ以上のブロックに関連する１つ以上の動作は、一度に複数の欠陥位置及び／又は複数の修復候補に対して実行されてよい。
【００５４】
図４は、本開示で記載される少なくとも１つの実施形態に従って共通コードパターンデータベースにポピュレートする、例となる方法４００のフローチャートである。方法４００は、ソフトウェアコードに対して如何なる適切なシステム、装置、又はデバイスによっても実行されてよい。例えば、図１の修復モジュール１０６又は図２のコンピュータシステム２０２（例えば、修復モジュールによって指示されるもの）が、ビッグコードの部分であってよい既存のソフトウェアプログラムの既存のコードに対して、方法４００に関連した動作のうちの１つ以上を実行してよい。別個のブロックにより表されているが、方法４００のブロックのうちの１つ以上に関連したステップ及び動作は、特定の実施に応じて、更なるブロックに分けられても、より少ないブロックへとまとめられても、あるいは削除されてもよい。
【００５５】
方法４００はブロック４０２から開始してよい。ブロック４０２において、ビッグコードの部分であってよい既存のソフトウェアプログラムのウィンドウが、選択されてよい。ウィンドウは、既存のソフトウェアプログラムの既存のコードの１つ以上の行を含んでよい。いくつかの実施形態では、ウィンドウのサイズ（例えば、行の数）は、具体的な設計又は実施の検討に基づいてよい。例えば、より大きいウィンドウサイズは、コードパターンに対するより高品位の決定をもたらし得るが、より大きい計算時間も導入する可能性がある。
【００５６】
その上、又は代替的に、いくつかの実施形態では、ウィンドウは、既存のソフトウェアプログラムに対する前のウィンドウ選択に基づき選択されてよい。例えば、既存のソフトウェアプログラムが未だ解析されていない場合に、前のウィンドウ選択が実行され得ないので、ウィンドウは既存のソフトウェアプログラムのコードの最初の行を含んでよい。その上、又は代替的に、前のウィンドウが解析されている場合に、選択されたウィンドウは、コードの次の行を含んでよい。例えば、ウィンドウは、コードの５つの行を含んでよく、前のウィンドウは、既存のコードの行５〜１０を含んでいてよい。この例においてブロック４０２で選択されたウィンドウは、次いで、既存のコードの行１１〜１５を含み得る。
【００５７】
ブロック４０４において、ウィンドウ内の既存のコードの共通コードパターンが取得されてよい。いくつかの実施形態では、共通コードパターンは、図５に関して以下で記載される１つ以上の動作に従って取得されてよい。
【００５８】
ブロック４０６において、ブロック４０４で取得された共通コードパターンを共通コードパターンデータベースが含むかどうかが判定されてよい。共通コードパターンデータベースが共通コードパターンを含まないことに応答して、方法４００はブロック４０８へ進んでよい。対照的に、共通コードパターンデータベースが共通コードパターンを含むことに応答して、方法４００はブロック４１０へ進んでよい。
【００５９】
ブロック４０８において、新しいデータベース入力が、共通コードパターンのために生成されてよい。いくつかの実施形態では、新しいデータベース入力は共通コードパターンを含んでよい。それら又は他の実施形態において、共通コードパターンの発生回数を示す値を持った入力カウンタも生成され、“０”の値を与えられてよい。ブロック４０８の後に、方法４００はブロック４１０へ進んでよい。
【００６０】
ブロック４１０において、入力カウンタ値がインクリメントされてよい。例えば、ブロック４０８から起こることに応答して、入力カウンタ値は“１”にインクリメントされ得る。他の例として、ブロック４０６から起こることに応答して、入力カウンタ値は、ブロック４０６からブロック４１０へ進む前に“ｎ”であってよく、そして、“ｎ＋１”にインクリメントされ得る。
【００６１】
然るに、共通コードパターンデータベースは、ビッグコードの既存のコードのウィンドウに対応し得る共通コードパターンに関する情報をポピュレートされてよい。いくつかの例において、方法４００は、既存のコードのウィンドウの如何なる数についても且つソフトウェアプログラムの如何なる数についても繰り返されてよい。
【００６２】
変更、追加、又は省略は、本開示の適用範囲から外れることなしに、方法４００に対して行われてよい。例えば、方法４００の動作は、異なる順序で実施されてよい。その上、又は代替的に、２つ以上の動作は、同時に実行されてよい。更には、説明されているアクション及び動作は、単に例として与えられており、アクション及び動作の一部は、開示されている実施形態の本質から逸脱することなしに、任意であっても、より少ないアクション及び動作へとまとめられても、あるいは、更なるアクション及び動作に拡張されてもよい。
【００６３】
例えば、いくつかの実施形態では、方法４００は繰り返し実行されてよく、その場合に、既存のコードの１つのウィンドウが一度に解析され得る。その上、又は代替的に、１つ以上のブロックに関連する１つ以上の動作は、一度に既存のコードの複数のウィンドウに対して実行されてよい。
【００６４】
図５は、本開示で記載される少なくとも１つの実施形態に従ってコードパターンを取得する、例となる方法５００のフローチャートである。方法５００は、ソフトウェアコードに対して如何なる適切なシステム、装置、又はデバイスによっても実行されてよい。例えば、図１の修復モジュール１０６又は図２のコンピュータシステム２０２（例えば、修復モジュールによって指示されるもの）が、修復候補のふゅうくこー度に対して、又は既存のソフトウェアプログラムの既存のコードに対して、方法５００に関連した動作のうちの１つ以上を実行してよい。別個のブロックにより表されているが、方法５００のブロックのうちの１つ以上に関連したステップ及び動作は、特定の実施に応じて、更なるブロックに分けられても、より少ないブロックへとまとめられても、あるいは削除されてもよい。
【００６５】
方法５００はブロック５０２から開始してよい。ブロック５０２において、コードが取得されてよい。いくつかの例において、コードは、例えば図４に関して上述されたように、既存のソフトウェアプログラムのウィンドウ内の既存のコードを含んでよい。他の例において、コードは、修復候補の修復コードを含んでよい。それら又は他の実施形態において、取得され得る修復コードの行の数は、生成され得る修復コードパターンと比較され得る共通コードパターンを取得するために使用され得るウィンドウのサイズに対応してよい。例えば、いくつかの実施形態では、取得され得る修復コードの行の数は、共通コードパターンを取得するために使用されるウィンドウと同じサイズであってよい。
【００６６】
方法５００のブロック５０４、５０６、５０８、及び５１０は、ブロック５０２で取得されたコードを正規化することに関係がある。上述されたように、正規化は、取得されたコード及び対応するソフトウェアプログラムに特有であり得るが、一般的なパターン及び構造も有し得るパラメータが、一般的なパターン及び構造を反映する一般的な形式に正規化され得るようにするものであってよい。よって、正規化は、異なるコードのコードパターンの比較を可能にし得る。
【００６７】
例えば、いくつかの実施形態では、方法５００はブロック５０４を含んでよい。ブロック５０４において、取得されたコードのいずれかの部分表現（subexpression）を簡約すべきかどうかが判定されてよい。例えば、いくつかの例において、コードは、特定のタイプの構造を有し得るが、対応する構造を反映するのに必要とされるよりも複雑でもあり得る部分表現を含んでよい。そのようなものとして、ブロック５０４において、複雑度が、コードに含まれ得る１つ以上の部分表現について決定されてよい。いくつかの実施形態では、複雑度は、コードに含まれ得るあらゆる部分表現について決定されてよい。
【００６８】
いくつかの実施形態では、複雑度は、特定の部分表現について、その特定の部分表現に含まれ得るパラメータ（例えば、値、定数、変数、演算子、及び関数、等）の数に基づき決定されてよい。それら又は他の実施形態において、パラメータの数は、複雑度閾値と比較されてよい。パラメータの数が複雑度閾値以上であることに応答して、特定の部分表現が複雑度閾値を満足し、簡約されるべきであることが決定されてよい。対照的に、パラメータの数が複雑度閾値に満たないことに応答して、特定の部分表現は複雑度閾値を満足せず、よって、如何なる簡約化も受けないことが決定されてよい。
【００６９】
簡約されるべきである如何なる部分表現も存在しないとの決定に応答して、方法５００は、ブロック５０４からブロック５０８へ進んでよい。簡約されるべきである１つ以上の部分表現が存在するとの決定に応答して、方法は、ブロック５０４からブロック５０６へ進んでよい。ブロック５０６において、簡約されるべきである部分表現が簡約されてよい。いくつかの実施形態では、適用可能な部分表現は、複雑な表現をより簡単な表現で置換する抽象（abstraction）プロセスによって簡約されてよく、これにおいて、置換表現は複雑度閾値を満足しない。いくつかの実施形態では、置換表現は、同じタイプの全ての表現のために使用され得る一般的な形式を含んでよく、それにより、置換表現は、コードパターンが取得され得るコードの異なる部分にわたって正規化され得る。ブロック５０６の後に、方法５００はブロック５０８へ進んでよい。
【００７０】
ブロック５０８において、ブロック５０２で取得されたコードに含まれているいずれかのオブジェクト（例えば、値、定数、変数、及び関数、等）が正規化されていないかどうかが決定されてよい。正規化されていないオブジェクトは、コード及び対応するプログラムソフトウェアに特有である名称又は識別子を与えられている特定のタイプのオブジェクトを含んでよく、これにおいて、使用される命名規則は一貫して従われない。
【００７１】
正規化されていない如何なるオブジェクトも存在しないとの決定に応答して、方法５００は、ブロック５０８からブロック５１２へ進んでよい。１つ以上のオブジェクトが正規化されていないとの決定に応答して、方法５００は、ブロック５０８からブロック５１０へ進んでよい。ブロック５１０において、正規化されていないオブジェクトが正規化されてよい。いくつかの実施形態では、特定の正規化されていないオブジェクトの正規化は、慣例に従わない又は一貫性のない様態で特にラベルを付され得る特定のオブジェクトを、同じタイプであって、そのタイプの全てのオブジェクトのために使用され得る一般的にラベルを付されたオブジェクトに変えることを含んでよい。例えば、特定の正規化されていないオブジェクトが特定の名称又はラベルを持った整数である場合に、オブジェクトは、全ての整数のために使用され得る一般的な名称又はラベルを持った整数へ変更されてよい。ブロック５１０の後に、方法５００はブロック５１２へ進んでよい。
【００７２】
ブロック５１２において、ブロック５０４、５０６、５０８、及び５１０で正規化され得るコードは、正規化されたコードとして取得されてよい。その上、ブロック５１２において、ハッシュ関数は、正規化された部分に対応し得るハッシュ値を得るよう、正規化されたコードに適用されてよい。ハッシュ値は、ブロック５０２で取得されたコードに対応し得るコードパターンを示してよい。例えば、いくつかの例において、コードの２つの異なる部分に対応する同じハッシュ値は、コードのそれら２つの部分が同じコードパターンを含むことを示し得る。いくつかの実施形態では、ブロック５１４において、ハッシュ値は、ブロック５０２で取得されたコードのコードパターンとして出力されてよい。
【００７３】
変更、追加、又は省略は、本開示の適用範囲から外れることなしに、方法５００に対して行われてよい。例えば、方法５００の動作は、異なる順序で実施されてよい。例えば、コードを正規化することに関連した動作は、記載又は図解されているのとは異なる順序で実行されてよく、あるいは、同時に実行されてよい。
【００７４】
その上、又は代替的に、２つ以上の動作は、同時に実行されてよい。更には、説明されているアクション及び動作は、単に例として与えられており、アクション及び動作の一部は、開示されている実施形態の本質から逸脱することなしに、任意であっても、より少ないアクション及び動作へとまとめられても、あるいは、更なるアクション及び動作に拡張されてもよい。例えば、いくつかの実施形態では、ハッシュ関数を計算することに関連した動作は省略されてよい。その上、いくつかの実施形態では、方法５００は繰り返し実行されてよく、その場合に、既存のコードの１つのウィンドウが一度に解析され得る。その上、又は代替的に、１つ以上のブロックに関連する１つ以上の動作は、一度に既存のコードの複数のウィンドウに対して実行されてよい。
【００７５】
上述されたように、本開示で記載される実施形態は、以下で更に詳細に説明されるように、様々なコンピュータハードウェア又はソフトウェアモジュールを含む専用又汎用のコンピュータ（例えば、図２のプロセッサ２５０）の使用を含んでよい。更には、上述されたように、本開示で記載される実施形態は、コンピュータ実行可能な命令又はデータ構造を搬送するか又はそれらが記憶されているコンピュータ可読媒体（例えば、図２のメモリ２５２）を用いて実装されてよい。
【００７６】
本開示で使用されるように、語“モジュール”又は“コンポーネント”は、コンピュータシステムの汎用ハードウェア（例えば、コンピュータ可読媒体、プロセッシングデバイス）において記憶及び／又は実行され得るソフトウェアオブジェクト若しくはソフトウェアルーチン及び／又はモジュール若しくはコンポーネントのアクションを実行するよう構成される特定のハードウェア実装を表し得る。いくつかの実施形態では、本開示で記載される種々のコンポーネント、モジュール、エンジン、及びサービスは、コンピュータシステムで（例えば、別個のスレッドとして）実行するオブジェクト又はプロセスとして実装されてよい。本開示で記載されるシステム及び方法の一部は、ソフトウェア（汎用ハードウェアにおいて記憶及び／又は実行される。）で実装されるものとして概して記載されるが、特定のハードウェア実装、ファームウェア実装、又はそれらの如何なる組み合わせも、可能であって考えられている。本明細書において、“コンピュータエンティティ”は、本開示で先に記載されている如何なるコンピュータシステムであっても、あるいは、コンピュータシステムで実行する如何なるモジュール又はモジュールの組み合わせであってもよい。
【００７７】
一般的に、本明細書内及び添付の請求の範囲内（例えば、添付の請求の範囲の要部）で使用される用語は、一般的に「非限定的な（open）」用語として意図されている（例えば、「含んでいる（including）」という用語は、「・・・を含んでいるが限定されない（including,  but  not  limited  to）」と解釈されるべきであり、「有している（having）」という用語は、「少なくとも・・・を有している（having  at  least）」と解釈されるべきであり、「含む（includes）」という用語は、「・・・を含むが限定されない（includes,  but  is  not  limited  to）」と解釈されるべきである。）。
【００７８】
加えて、導入されたクレーム記載（introduced  claim  recitation）において特定の数が意図される場合、そのような意図は当該クレーム中に明確に記載され、そのような記載がない場合は、そのような意図も存在しない。理解を促すために、例えば、後続の添付する特許請求の範囲では、「少なくとも１つの（at  least  one）」及び「１つ以上の（one  or  more）」といった導入句を使用し、クレーム記載を導入することがある。しかし、このような句を使用するからといって、「a」又は「an」といった不定冠詞によりクレーム記載を導入した場合に、たとえ同一のクレーム内に、「１つ以上の」又は「少なくとも１つの」といった導入句と「a」又は「an」といった不定冠詞との両方が含まれるとしても、当該導入されたクレーム記載を含む特定のクレームが、当該記載事項を１つのみ含む例に限定されるということが示唆されると解釈されるべきではない（例えば、「a」及び／又は「an」は、通常は、「少なくとも１つの」又は「１つ以上の」を意味すると解釈されるべきである。）。定冠詞を使用してクレーム記載を導入する場合にも同様のことが当てはまる。
【００７９】
加えて、導入されたクレーム記載において特定の数が明示されている場合であっても、そのような記載は、通常、「少なくとも」記載された数を意味するように解釈されるべきであることは、当業者には理解されるであろう（例えば、他に修飾語のない、単なる「２つの記載事項」という記載がある場合、この記載は、「少なくとも」２つの記載事項、又は「２つ以上の」記載事項を意味する。）。更に、「Ａ、Ｂ及びＣなどのうち少なくとも１つ」又は「Ａ、Ｂ及びＣのうちの１つ以上」に類する表記が使用される場合、一般的に、そのような構造は、Ａのみ、Ｂのみ、Ｃのみ、Ａ及びＢの両方、Ａ及びＣの両方、Ｂ及びＣの両方、並びに／又はＡ及びＢ及びＣの全て、などを有するものとして意図される。
【００８０】
更には、２つ以上の代替的な項目を提示する如何なる離切語又は語句も、明細書、特許請求の範囲、又は図面のいずれであろうとも、項目のうちの１つ、項目のうちのいずれか、又は両方の項目を含む可能性を意図すると理解されるべきである。例えば、「Ａ又はＢ」との語句は、Ａ若しくはＢ、又はＡ及びＢの可能性を含むと理解されるべきである。
【００８１】
ここで挙げられている全ての例及び条件付き語は、当該技術の促進に対して発明者によって寄与される概念及び発明を読者が理解するのを助ける教育上の目的を意図され、そのような具体的に挙げられている例及び条件に制限されないものとして解釈されるべきである。本発明の実施形態が詳細に記載されてきたが、様々な変更、置換及び代替は、本発明の主旨及び適用範囲から逸脱することなしに行われてよいことが理解されるべきである。
【００８２】
上記の実施形態に加えて、以下の付記を開示する。
（付記１）
テストスイートを用いてテスト済みのソフトウェアプログラムにおいて欠陥の欠陥位置を特定し、
前記欠陥のための修復候補を取得し、
前記修復候補の修復コードパターンを取得し、
複数の既存のソフトウェアプログラムの既存のコードにおける前記修復コードパターンの発生回数を決定し、
前記修復コードパターンの前記発生回数に基づき、前記修復候補を、前記テスト済みソフトウェアプログラムの修復として優先順位付けし、
前記修復候補の前記優先順位付けに従って、前記テスト済みソフトウェアプログラムに対して修復動作を実行する
ことを有する方法。
（付記２）
複数の共通コードパターンを前記既存のコードから取得し、
前記既存のコードにおける前記複数の共通コードパターンの発生回数を決定し、
前記修復コードパターンが前記複数の共通コードパターンの中の特定の共通コードパターンと一致するとの決定に基づき、且つ、前記特定の共通コードパターンの決定された特定の発生回数に基づき、前記修復コードパターンの発生回数を決定する
ことを更に有する、付記１に記載の方法。
（付記３）
前記特定の共通コードパターンを取得することは、
特定の既存のソフトウェアプログラムの特定の既存のコードの部分を取得し、
前記特定の既存のコードの前記部分を正規化し、
前記正規化された部分において前記特定の共通コードパターンにバイアスをかける
ことを含む、付記２に記載の方法。
（付記４）
前記特定の既存のコードの前記部分を正規化することは、前記部分の特にラベルを付されたオブジェクトを、一般的にラベルを付されたオブジェクトへ変更することを含み、
前記特にラベルを付されたオブジェクト及び前記一般的にラベルを付されたオブジェクトは、同じオブジェクトタイプである、
付記３に記載の方法。
（付記５）
前記特定の既存のコードの前記部分を正規化することは、
前記部分の表現の複雑度が複雑度閾値を満足すると決定し、
前記複雑度が前記複雑度閾値を満足すると決定することをに応答して前記表現を簡約する
ことを含む、付記３に記載の方法。
（付記６）
前記正規化された部分において前記特定の共通コードパターンにバイアスをかけることは、前記正規化された部分を前記特定の共通コードパターンとして使用することを含む、
付記３に記載の方法。
（付記７）
前記正規化された部分において前記特定の共通コードパターンにバイアスをかけることは、
前記正規化された部分に対応するハッシュ値を得るようハッシュ関数を前記正規化された部分に適用し、
前記ハッシュ値を前記特定の共通コードパターンとして使用する
ことを含む、付記３に記載の方法。
（付記８）
前記修復候補の前記修復コードパターンを取得することは、
前記修復候補の修復コードを正規化し、
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかける
ことを含む、付記１に記載の方法。
（付記９）
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかけることは、前記正規化された修復コードを前記修復コードパターンとして使用することを含む、
付記８に記載の方法。
（付記１０）
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかけることは、
前記正規化された修復コードに対応するハッシュ値を得るようハッシュ関数を前記正規化された修復コードに適用し、
前記ハッシュ値を前記修復コードパターンとして使用する
ことを含む、付記８に記載の方法。
（付記１１）
実行されることに応答して、システムに、
テストスイートを用いてテスト済みのソフトウェアプログラムにおいて欠陥の欠陥位置を特定し、
前記欠陥のための修復候補を取得し、
前記修復候補の修復コードパターンを取得し、
複数の既存のソフトウェアプログラムの既存のコードにおける前記修復コードパターンの発生回数を決定し、
前記修復コードパターンの前記発生回数に基づき、前記修復候補を、前記テスト済みソフトウェアプログラムの修復として優先順位付けし、
前記修復候補の前記優先順位付けに従って、前記テスト済みソフトウェアプログラムに対して修復動作を実行する
ことを有する動作を実行させる命令を記憶するよう構成された非一時的なコンピュータ可読記憶媒体。
（付記１２）
前記動作は、
複数の共通コードパターンを前記既存のコードから取得し、
前記既存のコードにおける前記複数の共通コードパターンの発生回数を決定し、
前記修復コードパターンが前記複数の共通コードパターンの中の特定の共通コードパターンと一致するとの決定に基づき、且つ、前記特定の共通コードパターンの決定された特定の発生回数に基づき、前記修復コードパターンの発生回数を決定する
ことを更に有する、付記１１に記載のコンピュータ可読記憶媒体。
（付記１３）
前記特定の共通コードパターンを取得することは、
特定の既存のソフトウェアプログラムの特定の既存のコードの部分を取得し、
前記特定の既存のコードの前記部分を正規化し、
前記正規化された部分において前記特定の共通コードパターンにバイアスをかける
ことを含む、付記１２に記載のコンピュータ可読記憶媒体。
（付記１４）
前記特定の既存のコードの前記部分を正規化することは、前記部分の特にラベルを付されたオブジェクトを、一般的にラベルを付されたオブジェクトへ変更することを含み、
前記特にラベルを付されたオブジェクト及び前記一般的にラベルを付されたオブジェクトは、同じオブジェクトタイプである、
付記１３に記載のコンピュータ可読記憶媒体。
（付記１５）
前記特定の既存のコードの前記部分を正規化することは、
前記部分の表現の複雑度が複雑度閾値を満足すると決定し、
前記複雑度が前記複雑度閾値を満足すると決定することをに応答して前記表現を簡約する
ことを含む、付記１３に記載のコンピュータ可読記憶媒体。
（付記１６）
前記正規化された部分において前記特定の共通コードパターンにバイアスをかけることは、前記正規化された部分を前記特定の共通コードパターンとして使用することを含む、
付記１３に記載のコンピュータ可読記憶媒体。
（付記１７）
前記正規化された部分において前記特定の共通コードパターンにバイアスをかけることは、
前記正規化された部分に対応するハッシュ値を得るようハッシュ関数を前記正規化された部分に適用し、
前記ハッシュ値を前記特定の共通コードパターンとして使用する
ことを含む、付記１３に記載のコンピュータ可読記憶媒体。
（付記１８）
前記修復候補の前記修復コードパターンを取得することは、
前記修復候補の修復コードを正規化し、
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかける
ことを含む、付記１１に記載のコンピュータ可読記憶媒体。
（付記１９）
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかけることは、前記正規化された修復コードを前記修復コードパターンとして使用することを含む、
付記１８に記載のコンピュータ可読記憶媒体。
（付記２０）
前記正規化された修復コードにおいて前記修復コードパターンにバイアスをかけることは、
前記正規化された修復コードに対応するハッシュ値を得るようハッシュ関数を前記正規化された修復コードに適用し、
前記ハッシュ値を前記修復コードパターンとして使用する
ことを含む、付記１８に記載のコンピュータ可読記憶媒体。
【符号の説明】
【００８３】
１００  環境
１０４  被試験コード
１０６  修復モジュール
１０８  変更された被試験コード
１１１  テストスイート
１１２  修復テンプレート
１１４  共通コードパターンデータベース
２０２  コンピュータシステム
２５０  プロセッサ
２５２  メモリ
２５４  データストレージ
【図１】
2019096292.tif 000003
【図２】
2019096292.tif 000004
【図３】
2019096292.tif 000005
【図４】
2019096292.tif 000006
【図５】
2019096292.tif 000007