Java PMDによってUR異常としてフラグが立てられている各ループ
これが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は常に 物議を醸すと考えられています です。私は個人的に、ほとんどすべてのタイプの異常の完全に狂った検出でそれを捕らえました:
- インライン宣言があると、UR異常が警告されます。これには、
for
ループスコープで定義された変数が含まれます。 - 変数がループスコープ外で定義され、その値が一部のローカルスコープの終了前にループ内で変更された場合、DU異常が警告されることがよくあります。
- DDの異常は、誤ったURまたはDUが検出されるのと並行して報告されることがよくあります。さらに、ループの前に変数を設定し、ループ内でその値を更新すると(次の反復のために)報告される場合があります。この異常は、ルールの説明内でもあまり関連性がないように参照されています。
したがって、私の意見では、このバグのあるルールを完全にオフにする価値があります。
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>