2017-04-12 4 views
0

私は、Javaプログラミング言語の「メソッドのパラメータを追跡する」という正確な用語を見つけようとしていますが、私は一般に「汚れ分析」を見つけましたが、正しい経路にいるかどうかはまだ分かりません。メソッドパラメータを追跡する方法は?

私が欲しいのは、メソッドのパラメータを追跡し、メソッドのどの部分(スコープ内)がパラメータの効果をするかを確認することです。たとえば、パラメータが別の変数に割り当てられている場合は、割り当てられた変数も追跡する必要があります。 「部品」に言及することによって、制御フローグラフのコード、ステートメント、または分岐のラインとなり得る。

また、ツールを確認してChecker FrameworkFindbugsと出会ったが、私が望むニーズを十分に満たしていないか、自分のニーズに対応できるようにできなかったようだ。

「汚れ分析」が私が探している正しい用語であるかどうかを教えてください。また、他のツール提案も歓迎します。

Checker Framework Live Demoの下に編集されたコードがあります。私が期待しているのは、変数String inputが汚染されている場合、processRequest()の内部にあります。executeQuery()メソッド内のすべての行について、警告またはエラーが発生することが予想されます。汚染された変数がそのパラメータに渡されるためです。

import org.checkerframework.checker.tainting.qual.*; 

public class TaintingExampleWithWarnings { 
    String getUserInput() { 
     return "taintedStr"; 
    } 

    void processRequest() { 
     @Tainted String input = getUserInput(); 
     executeQuery(input); //error: pass tainted string to executeQeury() 
    } 

    public void executeQuery(@Untainted String input) { 
     // Do some SQL Query 
     String token = input + " Hello World"; 
     String tokens[] = token.split(" "); 

     for(int i=0; i<tokens.length; i++) 
     { 
       System.out.println((i+1)+"String: "+tokens[i]) 
     } 

    } 


    /* To eliminate warning in line 10, replace line 10 by 
    * executeQuery(validate(input)); */ 
    /*@Untainted*/ public String validate(String userInput) { 
     // Do some validation here 
     @SuppressWarnings("tainting") 
     @Untainted String result = userInput; 
     return result; 
    } 
} 
+0

さまざまな言語でさまざまな汚れチェックツールがあります。あなたは言語を指定していないので何もお勧めできませんが、Googleはあなたの親友です –

+0

@UlugToprakはリマインダーに感謝し、言語を "Java"として指定して編集しました。 – Ekin

+0

IntelliJ IDEAには、使用できる統合ツールがあります。 Checkstyleは私の選択になります。これはIDEに統合することもできます –

答えて

1

Checker FrameworkTainting Checkerはあなたのコードの正確欠陥ライン上の警告を発行:

% javac -g TaintingExampleWithWarnings.java -processor tainting 
TaintingExampleWithWarnings.java:10: error: [argument.type.incompatible] incompatible types in argument. 
     executeQuery(input); //error: pass tainted string to executeQeury() 
        ^
    found : @Tainted String 
    required: @Untainted String 
1 error 

これは、欠陥を正確に示し、あなたのプログラムに修正する必要が正確に何を示しています。

Iは executeQuery()方法

executeQuery()の実装が正しい内部行の全ての警告やエラーを得ることを期待します。 の使用executeQuery()に問題があります。

(背景:モジュラー分析は、一度に1つの方法を動作するものであるモジュラー分析は、メソッドの仕様に依存している。)

型チェックモジュラー分析の一例です。その仕様は、仮パラメータのユーザ記述アノテーションです。

  • executeQuery()の体をタイプ・チェック、型チェッカは、仮パラメータの宣言が正しいことを を前提としています。
  • executeQuery()へのコールをタイプチェックするとき、タイプチェッカーは引数が合法であることを確認します。あなたのプログラム内のどこか一つでも型チェックエラーがあった場合

、その後、 あなたのプログラムは、(おそらく他のいくつかの場所で)危険な状態で動作をする可能性があります。

あなたのプログラムで汚染が流れる可能性のあるすべての場所を知りたい場合は、モジュラーではないプログラム全体の解析を使用する必要があります。さらに、プログラム全体の分析では、プログラム内のユーザー記述アノテーションをすべて無視する必要があります。そのような分析は可能であり、合理的な願いですが、あなたの質問で言及したツールでは対応していません。

関連する問題