PMD将每个循环的Java标记为UR异常

时间:2014-02-06 01:52:28

标签: java for-loop code-analysis static-analysis pmd

我想确认这是否是PMD的错误?如果是,我如何提交票证。

    public static void main(final String[] args) {
        for (final String string : args) {
            string.getBytes(); //UR Anomaly
        }
        for (int i = 0; i < args.length; i++) {
            args[i].getBytes();
        }
    }

第1-3行被标记为UR异常,而重写它以使用局部变量进行迭代是正常的。

想要消除尽可能多的PMD违规,但不得不采用旧的循环结构作为解决方法。

虽然存在争议,但我不希望禁用此规则,因为我发现DD,并且DU异常标记为有用。

3 个答案:

答案 0 :(得分:14)

您似乎遇到了PMD中的错误。 DataflowAnomalyAnalysis规则似乎没有捕获所有可能的变量定义(找到另一个示例here)。 UR代表&#34;未定义的引用&#34;,这显然是不正确的。

那么,你能做什么?

由于问题似乎主要影响规则的UR部分,因此您可以禁用它并继续使用DU和DD部分。你需要一个相当新版本的PMD才能做到这一点。在规则集文件中,抑制UR结果如下:

<rule ref="rulesets/java/controversial.xml/DataflowAnomalyAnalysis">
    <properties>
        <property name="violationSuppressRegex" value="^Found 'UR'-anomaly.*"/>
    </properties>
</rule>

更新:对于PMD 6. +,规则引用已更改(感谢ZuziaKru):

<rule ref="category/java/errorprone.xml/DataflowAnomalyAnalysis">
    <properties>
        <property name="violationSuppressRegex" value="^Found 'UR'-anomaly.*"/>
    </properties>
</rule>

在我看来,整个UR检查有点过头了,因为编译器不会接受未定义的引用。而现在,运行编译器不再是一件大事了。

答案 1 :(得分:4)

请参阅相应的PMD规则DataflowAnomalyAnalysis  经常是considered controversial。我个人完全疯狂地发现了几乎任何类型的异常现象:

  • 任何内联声明都会导致UR异常警报。这包括在for循环范围中定义的变量。
  • 如果在循环范围之外定义变量并且在某个局部范围结束之前在循环内更改其值,则通常会警告DU异常。
  • DD异常通常与检测到错误的UR或DU同时报告。另外,如果我们在循环之前设置变量然后在循环内更新它的值(用于下一次迭代),则可以报告。甚至在规则描述中引用此异常也不太相关。

因此,根据我的观点,完全可以关闭这个错误的规则。

答案 2 :(得分:0)

扩展托马斯·詹森的答案: 如今,任何人(我使用的是PMD版本6.2.0)都会从PMD收到有关此规则名称已弃用的警告。要抑制UR异常,您需要执行以下操作:

<rule ref="category/java/errorprone.xml/DataflowAnomalyAnalysis">
    <properties>
        <property name="violationSuppressRegex" value="^Found 'UR'-anomaly.*"/>
    </properties>
</rule>