Поиск жестко закодированных (магических) чисел и строк - PullRequest
0 голосов
/ 01 мая 2018

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

Например:

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

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

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

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

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

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

0 голосов
/ 01 мая 2018

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

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

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

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

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

...