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 anomaly помечается как полезный.

2 ответов


похоже, что вы попали в ошибку в PMD. The DataflowAnomalyAnalysis правило, похоже, не улавливает все возможные виды определений переменных (еще один пример найден здесь). UR означает "неопределенная ссылка", что, очевидно, неверно.

Итак, что вы можете сделать?

поскольку проблема затрагивает в основном часть правила UR, вы можете отключить ее и продолжить использовать части DU и DD. Вам нужна довольно свежая версия PMD для этого. В файле набора правил подавите результаты UR следующим образом:

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

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


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

  • любое встроенное объявление приводит к предупрежденной аномалии UR. Это включает переменные, определенные в for объем петли.
  • du аномалия часто предупреждается, если переменная определена из области цикла и ее значение изменяется внутри цикла до конца некоторого локального масштаб.
  • аномалия ДД сообщена часто параллельно с неправильным обнаруженным УР или Ду. Кроме того, можно сообщить, если мы настроим переменную перед циклом, а затем обновим ее значение внутри цикла (для следующей итерации). Эта аномалия упоминается даже внутри описания правила, чтобы быть не столь актуальной.

поэтому, на мой взгляд, стоит вообще отключить это правило багги.