2017-04-12 77 views
0

我一直在嘗試爲Java編程語言找到「跟蹤方法參數」的確切術語,我通常發現「污點分析」,但仍不確定我是否處於正確的路徑。如何跟蹤方法參數?

我想要的是跟蹤一個方法的參數,看看該方法的哪一部分(在範圍內)做參數效果。例如,如果一個參數被分配給另一個變量,我也想保持跟蹤所分配的變量。通過提及「部分」,它可以是代碼行,語句或控制流圖的分支。

我也檢查過工具,遇到了Checker FrameworkFindbugs,但是看起來他們並不完全滿足我的需要,或者我無法讓他們滿足我的需求。

請告訴我,「污點分析」是否是我正在尋找的正確術語。此外,歡迎任何其他工具建議。

Checker Framework Live Demo下面有一個編輯的代碼。我期望的是,在processRequest()裏面當變量String input被污染時,我期望在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

對於不同的語言,有不同的污點檢查工具。你沒有指定一種語言,所以我不能推薦任何東西,但谷歌是你最好的朋友 –

+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 

這查明缺陷,準確地表明,你需要在你的程序來解決的。

我希望能進去 executeQuery()方法

executeQuery()的實施是正確的所有行的警告或錯誤;這是使用executeQuery()是有問題的。

(背景:A 模塊化分析是一個在一個時間工作的一種方法的模塊化分析依賴於方法的規格。)

類型檢查是一個模塊化分析的一個例子。其規格是用戶編寫的形式參數註釋。

  • 當類型檢查的executeQuery()身體,類型檢驗器處於 ,正式參數聲明是正確的。
  • 當類型檢查對executeQuery()的調用時,類型檢查器會驗證參數是否合法。

如果在程序中某處存在一個類型檢查錯誤,那麼你的程序可能會不安全地運行(可能在某個其他位置)。

如果您想知道程序中可能流入的所有可能的位置,那麼您需要使用非模塊化的全程序分析。此外,整個程序分析需要忽略程序中每個用戶編寫的註釋。這樣的分析是可以做到的,而且是一個合理的願望,但是在你的問題中你沒有提到你所提到的工具。