【问题标题】:Java for each loop being flagged as UR anomaly by PMD每个循环的 Java 都被 PMD 标记为 UR 异常
【发布时间】:2019-01-16 20:58:09
【问题描述】:

我想确认这是否是 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 异常标记很有用。

【问题讨论】:

  • @bmargulies,我知道使用 String.getBytes()。 UR 不代表“未使用的结果”。这甚至不是问题,我可以简单地使用经过 SOP 处理的字符串,但我想要一个 SSCCE,其中只有我感兴趣的 UR 异常违规被标记为。
  • @jeremyjjbrown,我觉得它很有用,您不能更改迭代器变量。仅供参考,这不是 PMD 抱怨的原因;)
  • @jeremyjjbrown 有一个不可变的迭代值很有用(上面代码中的字符串不是迭代器,而是迭代值),这样您就知道迭代值(字符串)被设置一次并且不能被意外更改。
  • 没关系,我明白你的意思。字符串仅在循环范围内是最终的。

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


【解决方案1】:

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

那么,你能做什么呢?

由于问题似乎主要影响规则的 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 检查有点过头了,因为编译器不会接受未定义的引用。而如今,运行编译器已不再是什么大不了的事。

【讨论】:

  • 顺便说一句,PMD 的错误列表是here。还没有关于这个问题的内容。您可能需要一个 SourceForge 帐户来提交新票证。
【解决方案2】:

请看,适当的 PMD 规则 DataflowAnomalyAnalysis 一直是considered controversial。我个人是在完全疯狂地检测几乎任何类型的异常时发现的:

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

所以在我看来,完全关闭这个错误的规则是值得的。

【讨论】:

    【解决方案3】:

    扩展 Thomas Jensen 的答案: 现在任何人都在看这个(我使用的是 PMD 6.2.0 版),你会收到来自 PMD 的关于弃用此规则名称的警告。要抑制 UR 异常,您需要这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-08
      • 2020-10-09
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多