Как отследить параметр метода?

Я пытался найти точный термин для "отслеживания параметра метода" для языка программирования 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()средство проверки типов проверяет правильность аргументов.

Если где-то в вашей программе есть хотя бы одна ошибка проверки типов, то ваша программа может вести себя небезопасно (возможно, в другом месте).

Если вы хотите знать все возможные места, в которые может проникнуть порча, в вашей программе, то вам нужно использовать немодульный анализ всей программы. Кроме того, анализ всей программы должен был бы игнорировать каждую пользовательскую аннотацию в программе. Такой анализ возможен и является разумным желанием, но он не учитывается инструментами, которые вы упомянули в своем вопросе.

Другие вопросы по тегам