7

ライブラリに 2 つのメソッドがあるとします。

void com.somepackage.SomeClass.someSink(String s)

int com.someotherpackage.SomeOtherClass.someSource(int i)

最初の方法はデータ シンクとして使用され、2 番目の方法はコード内のデータ ソースとして使用されます。型パラメータint, Stringは例として示したものであり、実際の状況では変更される場合があります。

以下に示す特定のパターンを満たすコードで、これらのメソッドの使用を検出したいと考えています。

  1. 一部のデータ (たとえばx) は、ソースによって生成されます
  2. 一部のデータ (たとえばy) は、一連の変換を使用して生成されますf1(f2(... fn(x))
  3. yシンクに与えられます。

変換は、シンクのデータを生成する関数からソースからデータを取り込む関数への一連の呼び出しがある限り、任意の関数にすることができます。関数は他のパラメータも取ることができ、ブラックボックスとして使用されます。

スキャンは、ソース レベルまたはバイトコード レベルで行うことができます。この種の分析に利用できるツールは何ですか?

Java API を使用する非 IDE ベースのツールを優先します。

[編集:]より明確にするために、クラスとそれぞれの任意のメソッド名someSinkです。それらは、そうである場合とそうでない場合があり、任意の数のパラメーターを取る場合があります(これは私が定義できるはずです)。パラメータの型も任意ではありません。唯一の要件は、ツールがコードをスキャンし、パターンが発生する行番号を出力することです。したがって、ツールは次のように機能する可能性があります。someSourceSomeSomeSomeOtherClassstatic

  • ユーザーからシンク名とソース名 (クラスの完全修飾名とメソッド名) を取得します。
  • コードを静的にスキャンし、指定されたシンクとソースが使用されているすべての場所を見つけます
  • ソースによって出力されたデータが、一連の操作 (演算子、メソッド) を介して直接的または間接的にシンクに与えられるパスが存在するかどうかを確認します。
  • そのようなパスが存在しないソース/シンクを無視し、残りのもの (存在する場合) を出力します。

出力例:

MyClass1.java:12: value1 = com.someotherpackage.SomeOtherClass.someSource(...)
MyClass2.java:23: value2 = foo(value1, ...)
MyClass3.java:3: value3 = bar(value2)
MyClass4.java:22: com.somepackage.SomeClass.someSink(value3, ...)

注: 関数がパラメーターを取らないが、データに何らかの副作用がある場合も考慮する必要があります。(例a = source(); void foo(){ c = a+b }; foo(); sink(c)はキャッチが必要なパターンです。)

4

2 に答える 2

4

いくつかの調査を行った後、この種の作業には煤が最適であることがわかりました。Soot は、PQL などの他のオープン ソースの代替手段よりも成熟しています。

于 2012-07-26T07:05:34.283 に答える
2

つまり、ソース メソッドとシンク メソッドの役割は、x がソース メソッド (どこか) で発生し、ターゲット メソッドで (どこか) 消費されるということですか? 「x」をどのように特徴付けますか、または単にこのプロパティを持つすべての x が必要ですか?

ソースメソッドで特定の x を識別したと仮定すると、a) メソッド呼び出しによってのみx がターゲットメソッドに渡されることを主張しますか[これにより、ターゲットメソッドが一連の呼び出しの最後の呼び出しになります]、または次のいずれかが可能です。中間値はコピーされますか? b) 各関数呼び出しには引数が1 つだけあると主張しますか?

大規模な C システムについては、このようなことを行いました。問題は、割り当てられた変数を他の関数での使用に追跡することでした。これには、表現は同一ではありませんが、意図は同一の値が含まれます (「抽象コピー」; 文字列「1.0」は、使用する場合、整数 1 と抽象的に同等です。文字列は最終的に数値になります。「int_to_string」は、ある表現の値を別の表現の同等の値に変換する「抽象コピー」関数です)。

これに必要だったのは、各関数の到達定義分析 (「特定の割り当てからの値はどこに行くのか?」) と、到達値が「」とタグ付けされた特別な関数によって消費される場所を決定する「抽象コピー」到達分析です。抽象コピー」、そしてその抽象コピー機能の結果が到達する場所。次に、「x が z に到達する」および「x が f(x) に到達する」の推移閉包が、x が移動できる場所で計算されます。

これは、一般的な構文解析とフロー分析機構を提供する DMS Software Reengineering Toolkit と、C の特定の到達計算と抽象コピー到達計算を実装する DMS のCフロントエンドを使用して行いました。DMS には、到達定義を計算するJava フロント エンドがあります。 ; abstact-copy-reaching ロジックを追加し、推移的なクロージャー コードを再実装する必要があります。

于 2012-05-07T03:27:45.910 に答える