高位合成メソッドの使用

このトピックでは、高位合成メソッドの主要な機能の一部を使用する方法について説明します。完全な詳細については、Framework for Frameworks API クラスおよびメソッドの Javadoc 資料を参照してください。

高位合成メソッドの作成

高位合成メソッドを作成して、それを F4FActions オブジェクト actions に追加するには、以下のようなコードを使用します。

HighLevelSyntheticMethod m = HighLevelSyntheticMethod.make();
actions.addHighLevelSyntheticMethod(m);

VDB メソッド・シグニチャーを HighLevelSyntheticMethod.make() に渡すことにより、合成メソッドの名前、パラメーターの型と戻り値の型を指定できます。

ローカルの作成

高位合成メソッド m の新規ローカル変数は、以下のようにして作成できます。

Local l = m.newLocal("java.lang.String");

合成メソッド内でコンストラクターを呼び出す必要はありません。上記のコードの場合、l は、合成メソッドにさらにステートメントを追加する際に、NULL 以外の String オブジェクトを参照すると見なすことができます。

呼び出しの追加

高位合成メソッドでのほとんどのステートメントは、メソッド呼び出しであり、addCall() メソッドによって追加されます。addCall() へのパラメーターは、呼び出すメソッド、呼び出しのためのファイル位置情報と呼び出しの際に渡すパラメーターを表します。以下の例では、F4FApp オブジェクト app を前提として、setter メソッド sample.BeanType.setName() の呼び出しを追加します。

Collection<IMethod> setterMethods =
   app.getClassMethods("sample.BeanType", "setName");
// assume there is exactly one "setName" method in BeanType
IMethod setter = setterMethods.iterator().next();
HighLevelSyntheticMethod m = HighLevelSyntheticMethod.make();
Local l = m.newLocal("sample.BeanType");
m.addCall(setter, null, l, Taint.taint());

MVC アーキテクチャーでクライアントのフォーム送信を処理するステップ 2 から 5 (高位合成メソッド で概説) は、上記に示したように合成メソッドの適切な呼び出しを追加することで、ある程度モデル化できます。

呼び出しのパラメーターは、Param タイプのオブジェクトによって表されます。これらのオブジェクトは、以下のいずれかにすることができます。

  • Local オブジェクト。ローカルを表します。
  • Taint オブジェクト。信頼できない、汚染されたデータを表します。
  • EnclosingFormal オブジェクト。高位合成メソッドの仮パラメーターを表します。例えば、合成メソッドのシグニチャーが synthMethod(int):void の場合、EnclosingFormal.FIRST はこのメソッドの int パラメーターを参照します。
  • Global オブジェクト。グローバル (グローバル で説明) を表します。
注: 非静的インスタンス・メソッドの場合、this として渡される値を addCall() に提供する必要があります。上記の例では、l に含まれる値が、this として setName() に渡されます。

戻り値の追加

合成メソッドでは、setReturnedValue() メソッドを使用して値を返すことができます。複雑なフレームワーク検証をモデル化するためにマーカー・メソッドを生成する場合は、戻り値が役立ちます。例えば、汚染された HTTP 要求値の複雑な検証を実行してからその値をモデル・オブジェクトの setter メソッドに渡すフレームワークを使用している場合は、以下のようなコードを使用して、AppScan® ソース によって検出されたトレース上の検証を公開することができます。

String validatorSig =
   "Synth.validatorModel(java.lang.String):
   java.lang.String";
HighLevelSyntheticMethod validator =
   HighLevelSyntheticMethod.make(validatorSig);
// just return the parameter passed in
validator.setReturnedValue(EnclosingFormal.FIRST);
HighLevelSyntheticMethod m = ...;
Local validated = m.addCall(validatorSig, null, Taint.taint());
// now, validated can be passed to a setter

合成メソッド Synth.validatorModel() は、パラメーターとして渡された String を単に返します。その後に、別の合成メソッドで Synth.validatorModel() の呼び出しが追加されて、汚染された値を引数として渡します。この呼び出しの結果は validated に保管され、後続の setter メソッドの呼び出しで渡すことができます (サンプルでは 呼び出しの追加 で示されています)。この汚染されたデータが関係するトレースには Synth.validatorModel() の呼び出しが追加されますが、検証が十分と思われる場合は、AppScan® ソース のユーザーがトレースのフィルタリングを選択できます。

グローバル

グローバル は、アプリケーションの個別の部分の間のフローを公開するために使用できる拡張機能です。例えば、グローバルを使用して、コントローラーからビューへのデータ・フローを要求属性またはセッション属性によってモデル化することができます。グローバルを作成してアクセスするための主な操作は、以下のとおりです。

  • グローバルを表す Global オブジェクトを作成するには、F4FActions.createGlobal() を使用します。
  • グローバルに書き込むには、HighLevelSyntheticMethod.addGlobalWrite() を使用します。
  • グローバルから読み取るには、Global オブジェクトを呼び出しの Param パラメーターとして HighLevelSyntheticMethod.addCall() に渡すか、HighLevelSyntheticMethod.setReturnedValue() を通じて合成メソッドから返します。

例: コントローラー・クラスがユーザーの名を要求属性 firstName に書き込むと、続いてビューがこの要求属性を読み取り、その値を応答にレンダリングします。高位レベルでは、このフローを例えば以下のようにモデル化できます。

Global firstNameGlobal = actions.createGlobal
   ("firstName", "java.lang.String", true);
HighLevelSyntheticMethod controller = ...;
Local firstNameLocal = controller.newLocal("java.lang.String");
controller.addGlobalWrite(firstNameGlobal, firstNameLocal, null);
HighLevelSyntheticMethod view = ...;
view.addCall("Response.write(java.lang.String):void",
   null, firstNameGlobal);

コントローラー合成メソッドに firstNameGlobal への書き込みを追加し、続いて view 合成メソッドで firstNameGlobalResponse.write() に渡すことにより、コントローラーからビューへのデータ・フローを公開しています。

注: この例は、大幅に単純化されています。特に、完全なバージョンでは firstNameLocal への適切なデータ・フローを公開する必要があります。