【问题标题】:How to track a method parameter?如何跟踪方法参数?
【发布时间】:2017-04-12 20:24:42
【问题描述】:

我一直在尝试为 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;
    }
}

【问题讨论】:

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

标签: java static-analysis control-flow-graph taint


【解决方案1】:

Checker Framework 中的 Tainting 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()使用

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

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

  • 在对executeQuery() 的主体进行类型检查时,类型检查器假定 形式参数声明是否正确。
  • 在对executeQuery() 的调用进行类型检查时,类型检查器会验证参数是否合法。

如果你的程序中甚至有一个类型检查错误,那么 您的程序可能运行不安全(可能在其他位置)。

如果您想知道污点在您的程序中可能流向的所有可能位置,那么您需要使用非模块化的全程序分析。此外,整个程序分析需要忽略程序中每个用户编写的注释。这样的分析是可能的,并且是合理的愿望,但您在问题中提到的工具没有解决它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2021-08-07
    • 2018-04-22
    相关资源
    最近更新 更多