Java для каждого цикла, помеченного как аномалия UR по 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 как полезную.

Ответ 1

Похоже, что вы столкнулись с ошибкой в 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>

Обновление: для PMD 6. + правило ref изменилось (спасибо ZuziaKru):

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

По моему скромному мнению, вся проверка UR немного завышена, потому что компилятор не будет принимать неопределенные ссылки. И в наши дни запускать компилятор уже не так уж сложно.

Ответ 2

См. соответствующее правило PMD. DataflowAnomalyAnalysis  постоянно считается спорным. Я лично поймал его на совершенно сумасшедшем обнаружении почти любого типа аномалии:

  • Любое встроенное объявление приводит к предупреждению аномалии UR. Сюда входят переменные, определенные в области for.
  • Аномалия DU часто предупреждается, если переменная определена из области цикла и ее значение изменяется внутри цикла до конца некоторой локальной области.
  • Аномалия DD часто сообщается параллельно с неправильным обнаружением UR или DU. Кроме того, это может быть сообщено, если мы настроим переменную до цикла, а затем обновим ее значение внутри цикла (для следующей итерации). Эта аномалия упоминается даже внутри описания правила, чтобы быть не столь актуальным.

Так что, по моему мнению, стоит полностью отключить это правило.

Ответ 3

Если продолжить ответ Томаса Дженсена: любой, кто ищет это сейчас (я использую PMD версии 6.2.0), получит предупреждение от PMD об устаревании этого имени правила. Чтобы подавить UR-аномалию, вам нужно это:

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