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

标签 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 异常标记很有用。

最佳答案

您似乎遇到了 PMD 中的错误。 DataflowAnomalyAnalysis rule 似乎没有捕捉到所有可能类型的变量定义(找到另一个示例 here )。 UR 代表“ undefined reference ”,这显然是不正确的。

那么,你能做什么呢?

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

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

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

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

在我看来,整个 UR 检查有点过头了,因为编译器不会接受 undefined reference 。而如今,运行编译器已不再是什么大不了的事。

关于每个循环的 Java 都被 PMD 标记为 UR 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21592497/

相关文章:

java - java 二维数组求最后一行的平均值

java - 在没有显式取消 key 的情况下获取 java.nio.channels.CancelledKeyException

ios - 如何摆脱内部使用异步DispatchQueue的循环

java - 如何使用同一个引用变量在不同时间存储多个对象而不对以前存储的对象造成任何影响?

java - @PostConstruct sleep 时不会触发 ContextClosedEvent

python - 有没有办法把这个嵌套循环变成递归循环?

r - 绘图在 for 循环中不起作用

Perl挑战-目录迭代器

java - 如何在RSA 7.5.5.3中设置PMD?

.NET 可移植性警告 : CA1901 PInvoke Declarations Should Be Portable