ライブラリに 2 つのメソッドがあるとします。
void com.somepackage.SomeClass.someSink(String s)
と
int com.someotherpackage.SomeOtherClass.someSource(int i)
最初の方法はデータ シンクとして使用され、2 番目の方法はコード内のデータ ソースとして使用されます。型パラメータint, String
は例として示したものであり、実際の状況では変更される場合があります。
以下に示す特定のパターンを満たすコードで、これらのメソッドの使用を検出したいと考えています。
- 一部のデータ (たとえば
x
) は、ソースによって生成されます - 一部のデータ (たとえば
y
) は、一連の変換を使用して生成されますf1(f2(... fn(x))
y
シンクに与えられます。
変換は、シンクのデータを生成する関数からソースからデータを取り込む関数への一連の呼び出しがある限り、任意の関数にすることができます。関数は他のパラメータも取ることができ、ブラックボックスとして使用されます。
スキャンは、ソース レベルまたはバイトコード レベルで行うことができます。この種の分析に利用できるツールは何ですか?
Java API を使用する非 IDE ベースのツールを優先します。
[編集:]より明確にするために、クラスとそれぞれの任意のメソッド名someSink
です。それらは、そうである場合とそうでない場合があり、任意の数のパラメーターを取る場合があります(これは私が定義できるはずです)。パラメータの型も任意ではありません。唯一の要件は、ツールがコードをスキャンし、パターンが発生する行番号を出力することです。したがって、ツールは次のように機能する可能性があります。someSource
SomeSome
SomeOtherClass
static
- ユーザーからシンク名とソース名 (クラスの完全修飾名とメソッド名) を取得します。
- コードを静的にスキャンし、指定されたシンクとソースが使用されているすべての場所を見つけます
- ソースによって出力されたデータが、一連の操作 (演算子、メソッド) を介して直接的または間接的にシンクに与えられるパスが存在するかどうかを確認します。
- そのようなパスが存在しないソース/シンクを無視し、残りのもの (存在する場合) を出力します。
出力例:
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)
はキャッチが必要なパターンです。)