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

Joh*_*Doe 19 java code-analysis for-loop 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

第1-3行被标记为UR异常,而重写它以使用局部变量进行迭代很好.

想要消除尽可能多的PMD违规,但不得不求助于旧的循环结构作为一种解决方法.

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

bar*_*uin 16

您似乎遇到了PMD中的错误.该DataflowAnomalyAnalysis规则似乎并没有捕捉各种可能的变量定义的(另一个例子发现这里).UR代表"未定义的引用",这显然是不正确的.

所以,你可以做什么?

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

<rule ref="rulesets/java/controversial.xml/DataflowAnomalyAnalysis">
    <properties>
        <property name="violationSuppressRegex" value="^Found 'UR'-anomaly.*"/>
    </properties>
</rule>
Run Code Online (Sandbox Code Playgroud)

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

<rule ref="category/java/errorprone.xml/DataflowAnomalyAnalysis">
    <properties>
        <property name="violationSuppressRegex" value="^Found 'UR'-anomaly.*"/>
    </properties>
</rule>
Run Code Online (Sandbox Code Playgroud)

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

  • 顺便说一句,PMD的错误列表是[这里](http://sourceforge.net/p/pmd/bugs/).还没有关于这个问题.您可能需要一个SourceForge帐户来提交新票证. (3认同)