查找硬编码(魔术)数字和字符串

时间:2018-05-01 02:28:26

标签: java sonarqube static-analysis magic-numbers

有没有办法在Java中查找所有硬编码的数字和字符串? 我的意思是没有放入专用变量的值。

例如:

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

我在SonarQube上得到了建议,但我不知道如何使用它。

2 个答案:

答案 0 :(得分:5)

SonarJube的Java插件SonarJava有明确针对幻数的规则。请在此处查看其说明:S109 - Magic numbers should not be used

还有一条规则会要求您定义常量而不是多次使用相同的字符串,但只有在同一个文件中使用时(如在其他答案中已经提到的那样)(S1192 - String literals should not be duplicated) 。因此,它不会标记在任何方法的主体中仅使用一次的任何字符串常量,也不会标识分布在多个文件中的重复常量。

如果您迫切需要跟踪项目中所有字符串常量的使用情况,最好的方法是编写自己的规则作为自定义插件的一部分(参见自定义插件) Writing Custom Java Rules)。

现在,如果您想从这些规则中受益,您唯一需要做的就是设置项目分析,以便对代码执行SonarQube分析,并确保您需要的所有规则都是已启用,因为它们不是默认质量配置文件的全部内容(有关设置的详细信息,请参阅SonarQubeSonarCloud网站。)

答案 1 :(得分:1)

SonarQube / SonarLint有关于重复使用相同HC字符串的专门问题,但这是在单个类文件的范围内完成的。

这意味着如果您在每个类文件中仅使用相同的HC字符串一次或两次,但是您有10个此类文件,则SQ / SL将不会检测到此问题,您将不会意识到HC / Magic字符串问题。

我建议您尝试使用IDE的搜索功能并进行一些自动化 - 构建一个可疑魔术字符串的简单文本列表,并将其用作IDE搜索工具的输入,以便它将覆盖整个工作空间并标记/总结项目中的所有魔术字符串用法。

支持在SQ / SL中检测幻数 - Magic numbers should not be used规则。与上述魔术字符串相同的检测问题。

注意 - 我倾向于用于HC magic Strings / ints的解决方案是一个常量实用程序类,带有public static final个变量。为了增强使用效果,我允许HC字符串可选地包含可以使用动态值解析的标记(&#34;我的[tag]字符串&#34; - [tag = nice] - &gt;&#34; My很棒的字符串&#34;)。