Java 如何跟踪方法参数?

Java 如何跟踪方法参数?,java,static-analysis,control-flow-graph,taint,Java,Static Analysis,Control Flow Graph,Taint,我一直在为Java编程语言寻找“跟踪方法的参数”的确切术语,我通常找到了“污染分析”,但仍然不确定我是否走上了正确的道路 我想要的是,跟踪一个方法的参数,并查看参数对方法的哪一部分(范围内)有影响。例如,如果一个参数被分配给另一个变量,我也希望跟踪分配的变量。通过提及“部分”,它可以是代码行、语句行或控制流图的分支 我还检查了工具,发现了和,但是它们似乎不能完全满足我想要的需求,或者我无法使它们满足我的需求 请告诉我“污染分析”是否是我所寻找的正确术语。此外,欢迎提出任何其他工具建议 下面是来自

我一直在为Java编程语言寻找“跟踪方法的参数”的确切术语,我通常找到了“污染分析”,但仍然不确定我是否走上了正确的道路

我想要的是,跟踪一个方法的参数,并查看参数对方法的哪一部分(范围内)有影响。例如,如果一个参数被分配给另一个变量,我也希望跟踪分配的变量。通过提及“部分”,它可以是代码行、语句行或控制流图的分支

我还检查了工具,发现了和,但是它们似乎不能完全满足我想要的需求,或者我无法使它们满足我的需求

请告诉我“污染分析”是否是我所寻找的正确术语。此外,欢迎提出任何其他工具建议

下面是来自的已编辑代码。我所期望的是,在
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;
    }
}
导入org.checkerframew.checker.tainting.qual.*;
带有警告的公共类污染示例{
字符串getUserInput(){
返回“taintedStr”;
}
void processRequest(){
@受污染的字符串输入=getUserInput();
executeQuery(输入);//错误:将受污染的字符串传递给executeQeury()
}
public void executeQuery(@Untainted String input){
//执行一些SQL查询
字符串标记=输入+“Hello World”;
字符串标记[]=标记.split(“”);
对于(int i=0;iof The),将在代码中有缺陷的行上发出警告:

% 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()
的使用

(背景:模块化分析是一次使用一种方法的分析。模块化分析依赖于方法规范。)

类型检查是模块化分析的一个例子。它的规范是用户在形式参数上编写的注释

  • 在对
    executeQuery()
    的主体进行类型检查时,类型检查器假定 形式参数声明是否正确
  • 当类型检查调用
    executeQuery()
    时,类型检查器会验证参数是否合法
如果您的程序中甚至有一个类型检查错误,那么 您的程序可能行为不安全(可能在其他位置)


如果你想知道程序中污染可能流向的所有地方,那么你需要使用非模块化的、完整的程序分析。此外,完整的程序分析需要忽略程序中每个用户编写的注释。这样的分析是可能的,也是合理的愿望,但t他是您在问题中提到的工具。

对于不同的语言,有不同的污点检查工具。您没有指定语言,所以我不能推荐任何东西,但谷歌是您最好的选择friend@UlugToprak感谢提醒,我通过将语言指定为“Java”来编辑问题.IntelliJ IDEA具有可供使用的集成工具。Checkstyle将是我的选择,也可以集成到IDE中。您可以澄清现有工具如何“不能完全满足我想要的需求”?此外,一个他们不处理的代码示例将很有帮助。没有这些信息,很难提出建议。@mernst您好Ernst博士:)我编辑了我的问题,并试图用一个例子来澄清它。如果我误解了“污染分析”的概念,请纠正我,如果你需要更多的澄清,请让我知道。谢谢你的贡献。