Поиск жестко закодированных (магических) чисел и строк

Есть ли способ найти все жестко закодированные числа и строки в Java? Я имею в виду значения, которые не были помещены в выделенные переменные.

Например:

while (i < 6) {
    System.out.println("6 is a number"); // Hard Coded, "Magic" String
}

Я получил предложения по SonarQube, но я не знаю, как его использовать.

2 ответа

SonarJava, плагин Java для SonarQube, имеет правило, явно ориентированное на магические числа. См. Его описание здесь: S109 - Магические числа не должны использоваться.

Существует также правило, которое попросит вас определить константы вместо того, чтобы использовать несколько раз одну и ту же строку, но только при использовании в одном и том же файле (как уже упоминалось в другом ответе) ( S1192 - Строковые литералы не должны дублироваться), Следовательно, он не собирается ни помечать строковую константу, использованную только один раз в теле каких-либо методов, ни идентифицировать дублированные константы, распределенные по нескольким файлам.

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

Теперь, если вы хотите извлечь выгоду из этих правил, единственное, что вам нужно сделать, это настроить анализ вашего проекта, чтобы выполнить анализ кода с помощью SonarQube, и убедиться, что все необходимые вам правила включены, так как они не все являются частью профиля качества по умолчанию (подробности о настройке см. на веб-сайтах SonarQube или SonarCloud).

SonarQube/SonarLint имеет специальные проблемы, касающиеся повторного использования одних и тех же строк HC, однако это делается в рамках одного файла класса.

Это означает, что если вы используете одну и ту же строку HC только один или два раза в каждом файле класса, но у вас есть 10 таких файлов, то SQ/SL не обнаружит эту проблему, и вы не будете знать о проблеме HC/Magic String.

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

В SQ/SL есть поддержка обнаружения магических чисел - Magic numbers should not be used править. Те же проблемы обнаружения, как указано выше для магических строк.

Примечание. Решение, которое я обычно использую для магических строк / строк HC, - это служебный класс Constants с public static final переменные. Чтобы улучшить использование, я разрешаю, чтобы строки HC дополнительно содержали теги, которые можно анализировать с помощью динамических значений ("My [tag] String" -[tag = nice] -> "My nice String").

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