我一直试图找到"跟踪方法参数"的确切术语。对于Java编程语言而言,我通常会发现"污点分析",但仍不确定我是否在正确的道路上。
我想要的是,跟踪方法的参数并查看方法的哪个部分(范围内)对参数产生影响。例如,如果将参数分配给另一个变量,我也想跟踪所分配的变量。通过提及" parts",它可以是控制流图的代码行,语句或分支。
我还检查了工具并遇到了Checker Framework和Findbugs,但似乎他们并不能完全满足我的需求,或者我无法满足让它们满足我的需求。
请告知是否"污点分析"是我正在寻找的合适的术语。此外,欢迎任何其他工具建议。
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 :(得分:1)
Tainting Checker的Checker Framework会对您的代码的缺陷行发出警告:
% 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()
的调用进行类型检查时,类型检查器会验证参数是否合法。如果程序中的某个地方甚至有一个类型检查错误,那么 你的程序可能表现得不安全(可能在其他地方)。
如果您想知道污染可能流入程序的所有可能位置,那么您需要使用非模块化的整体程序分析。此外,整个程序分析需要忽略程序中每个用户编写的注释。这样的分析是可行的,并且是一种合理的愿望,但是你在问题中提到的工具并没有解决这个问题。