Как отследить параметр метода?
Я пытался найти точный термин для "отслеживания параметра метода" для языка программирования Java, и я обычно находил "анализ порчи", но все еще не уверен, нахожусь ли я на правильном пути.
Я хочу отслеживать параметр метода и видеть, какая часть метода (в области видимости) влияет на параметр. Например, если параметр назначен другой переменной, я также хочу отслеживать отслеживаемую переменную. Упоминая "части", это могут быть строки кода, оператор или ветвь графа потока управления.
Я также проверил наличие инструментов и наткнулся на https://checkerframework.org/ и 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;
}
}
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()
средство проверки типов проверяет правильность аргументов.
Если где-то в вашей программе есть хотя бы одна ошибка проверки типов, то ваша программа может вести себя небезопасно (возможно, в другом месте).
Если вы хотите знать все возможные места, в которые может проникнуть порча, в вашей программе, то вам нужно использовать немодульный анализ всей программы. Кроме того, анализ всей программы должен был бы игнорировать каждую пользовательскую аннотацию в программе. Такой анализ возможен и является разумным желанием, но он не учитывается инструментами, которые вы упомянули в своем вопросе.