これが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 ルールは、考えられるすべての種類の変数定義をキャッチしているようには見えません(別の例が見つかりました ここ )。 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. +の場合、ルール参照が変更されました(ZuziaKruに感謝):
<rule ref="category/Java/errorprone.xml/DataflowAnomalyAnalysis">
<properties>
<property name="violationSuppressRegex" value="^Found 'UR'-anomaly.*"/>
</properties>
</rule>
私の謙虚な意見では、コンパイラは未定義の参照を受け入れないため、URチェック全体が少し上になります。そして最近では、コンパイラーの実行はそれほど大したことではありません。
適切なPMDルールDataflowAnomalyAnalysisは常に 物議を醸すと考えられています です。私は個人的に、ほとんどすべてのタイプの異常の完全に狂った検出でそれを捕らえました:
for
ループスコープで定義された変数が含まれます。したがって、私の意見では、このバグのあるルールを完全にオフにする価値があります。
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>