PMD 標準的な
Github
リポジトリから、PMD
ルールセットを
Findbugs
のFilter
ファイルを
集計結果をfindbugs-excludes.xml
を
集計してから わかった こと
Findbugs
はexclude
設定の
include
設定も
除外設定と
計測のinclude
ファイルが
目次
サンプルの 抽出
対象プロジェクトは
こちらと 同様です。 上記の
リポジトリから ファイル名が、 以下の 名前と 一致する ものを 抽出します。 findbugs-rules.xml
findbugs-exclude-filter.xml
findbugs.xml
findbugs-exclude.xml
findbugs-filter.xml
exclude.xml
集計方法
除外された
ルール数を カウントします。
Findbugs
がPMD
と違う点は、 PMD
は適用する ルールを 定義するのに 対して、
Findbugs
は除外する ルールを 定義する 作りになっています。
このため、 どれだけ 除外されているかを カウントします。 ルールは、
pattern
と、category
、code
により 定義が 可能です。
pattern
が最小単位であるため、 category
、code
でルールが 記述されている 場合は、
関連pattern
を取得して、 集計します。
code
、category
とpattern
の関係は、 findbugs/findbugs.xml at master · findbugsproject/findbugs から、
取得しました。
集計に 使用する Github API
- 集計に
使用する Github
API
はこちらと 同様です。
集計結果
1. Findbugsの ルールファイルを 保持している プロジェクト数
- 146/5419 プロジェクト
Findbugs
の定義ファイルだけなら、 265個 ありました。
1リポジトリに何個も ファイルが あったりするので、 その 重複を 排除すると、
146リポジトリで使用されていました。
少なくとも、PMD
よりは多くの プロジェクトで 使用されているようです。
2. 全体で、 除外されている ルールの TOP10
NO | ルール名 | カウント |
---|---|---|
1 | EI_EXPOSE_REP2 | 23 |
2 | EI_EXPOSE_REP | 22 |
3 | SE_COMPARATOR_SHOULD_BE_SERIALIZABLE | 13 |
4 | SE_BAD_FIELD | 11 |
5 | DM_DEFAULT_ENCODING | 9 |
5 | MS_PKGPROTECT | 9 |
7 | MS_MUTABLE_ARRAY | 8 |
7 | DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED | 8 |
8 | SE_BAD_FIELD_INNER_CLASS | 7 |
8 | RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE | 7 |
9 | ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD | 6 |
9 | DM_EXIT | 6 |
9 | SE_NO_SERIALVERSIONID | 6 |
9 | PT_RELATIVE_PATH_TRAVERSAL | 6 |
9 | JLM_JSR166_UTILCONCURRENT_MONITORENTER | 6 |
9 | RV_RETURN_VALUE_IGNORED_BAD_PRACTICE | 6 |
全体なので、
指定なし[JAVAプロジェクト全体で 除外している ] ルールの TOP10に なります。 感覚ベースでの
話になりますが、 Findbugsに ついては、 行き当たりばったり(バグが 検出されたのに 応じて。 )
除外適用されるルールが 多いように 思われます。
※超ぱっと見の 感覚での 話です。 全体的に
除外している ものは 少なく、
クラス指定、メソッド指定などした 上で 除外する ことが 多いように 思われます。
3. クラススコープで 除外されている ルールの TOP10
続けます。Class
スコープ(正規表現含む
NO | ルール名 | カウント |
---|---|---|
1 | ALL | 219 |
2 | EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS | 195 |
3 | EQ_UNUSUAL | 114 |
4 | CN_IDIOM_NO_SUPER_CALL | 83 |
5 | EI_EXPOSE_REP2 | 80 |
6 | SE_NO_SUITABLE_CONSTRUCTOR | 77 |
7 | EI_EXPOSE_REP | 68 |
8 | BC_UNCONFIRMED_CAST | 62 |
9 | DM_DEFAULT_ENCODING | 60 |
10 | NM_SAME_SIMPLE_NAME_AS_INTERFACE | 59 |
10 | NM_SAME_SIMPLE_NAME_AS_SUPERCLASS | 59 |
全体で
除外されている ものと、 傾向は 違います。
確かにクラスベースで 発生するが、 見逃したい バグが 除外されているように 思います。 EI_EXPOSE_REP2
とEI_EXPOSE_REP
は全体でも、 クラスベースでも 除外されています。
問題となる場合は、 ものすごいわかりにくい バグに なると 思うのですが、 基本除外したい 人が 多い。 と いう ことでしょうか? NM_SAME_SIMPLE_NAME_AS_INTERFACE
等はClass
ならではの除外ルールかもしれません。
4. メソッドスコープで 除外されている ルールの TOP10
続けます。Method
スコープ(正規表現含む
NO | ルール名 | カウント |
---|---|---|
1 | DM_EXIT | 40 |
2 | NP_BOOLEAN_RETURN_NULL | 23 |
2 | EI_EXPOSE_REP | 23 |
4 | SF_SWITCH_FALLTHROUGH | 20 |
5 | BC_UNCONFIRMED_CAST | 16 |
6 | OBL_UNSATISFIED_OBLIGATION | 15 |
6 | NP_LOAD_OF_KNOWN_NULL_VALUE | 15 |
8 | EI_EXPOSE_REP2 | 14 |
9 | REC_CATCH_EXCEPTION | 13 |
9 | NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE | 13 |
10 | JLM_JSR166_UTILCONCURRENT_MONITORENTER | 12 |
確かに
メソッドの スコープで 除外設定したくなる ルールに 思われます。 NP_BOOLEAN_RETURN_NULL
をしたくなる ケースってどのような 時だろう? と 思いました。
True
(存在する) or
False
(存在しない)or
Null
(Unknown) みたいなケースでしょうか?
RDB
のようなNull
を表現するのに 使うんですかね? EI_EXPOSE_REP
、と EI_EXPOSE_REP2
はジャンル問わず、 よく Exclude
されていますwww。
5. フィールドスコープで 除外されている ルールの TOP10
更に続けます。Field
スコープ場合の、
NO | ルール名 | カウント |
---|---|---|
1 | IS2_INCONSISTENT_SYNC | 126 |
2 | SE_TRANSIENT_FIELD_NOT_RESTORED | 23 |
2 | URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD | 23 |
4 | SE_BAD_FIELD | 18 |
5 | MS_SHOULD_BE_FINAL | 12 |
6 | ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD | 9 |
7 | EI_EXPOSE_REP2 | 7 |
8 | EI_EXPOSE_REP | 6 |
8 | UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD | 6 |
8 | MS_PKGPROTECT | 6 |
シリアライズ、や、
IS2_INCONSISTENT_SYNC
は同期化されていない Field
の場合、 出力される 警告なので、
問題がある 場合と、 ない 場合が あるのだと 思います。 EI_EXPOSE_REP2
、EI_EXPOSE_REP
はここでも 抑制の 対象に なっています。
Findbugsルールファイル
以下、
- 各カテゴリの
TOP10
を抽出し、 重複を マージ
<FindBugsFilter> <Match> <Or> <Bug pattern="BC_UNCONFIRMED_CAST" /> <Bug pattern="CN_IDIOM_NO_SUPER_CALL" /> <Bug pattern="DM_DEFAULT_ENCODING" /> <Bug pattern="DM_EXIT" /> <Bug pattern="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED" /> <Bug pattern="EI_EXPOSE_REP" /> <Bug pattern="EI_EXPOSE_REP2" /> <Bug pattern="EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS" /> <Bug pattern="EQ_UNUSUAL" /> <Bug pattern="IS2_INCONSISTENT_SYNC" /> <Bug pattern="JLM_JSR166_UTILCONCURRENT_MONITORENTER" /> <Bug pattern="MS_MUTABLE_ARRAY" /> <Bug pattern="MS_PKGPROTECT" /> <Bug pattern="MS_SHOULD_BE_FINAL" /> <Bug pattern="NM_SAME_SIMPLE_NAME_AS_INTERFACE" /> <Bug pattern="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS" /> <Bug pattern="NP_BOOLEAN_RETURN_NULL" /> <Bug pattern="NP_LOAD_OF_KNOWN_NULL_VALUE" /> <Bug pattern="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE" /> <Bug pattern="OBL_UNSATISFIED_OBLIGATION" /> <Bug pattern="REC_CATCH_EXCEPTION" /> <Bug pattern="SE_BAD_FIELD" /> <Bug pattern="SE_BAD_FIELD_INNER_CLASS" /> <Bug pattern="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE" /> <Bug pattern="SE_NO_SUITABLE_CONSTRUCTOR" /> <Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED" /> <Bug pattern="SF_SWITCH_FALLTHROUGH" /> <Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" /> <Bug pattern="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD" /> <Bug pattern="UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD" /> </Or> </Match> </FindBugsFilter>
Findbugs
の感覚的な 使われ方を 考えると、 乱暴な 気は します。
最初かけていなかったけど、途中導入してやたら 大量の 警告に みまわれる 場合で、
ある程度、 対象の バグを 絞り込みたい 場合は、 上記の ルールを 適用して おけばいいのではと 考えます。
が、実プロジェクトでうまく いくかどうかは 試していないので、 わからないです! 集計詳細は
こちらの スプレッドシートに 記載しました。
PMD
は
のにFindbugs
は
解析の
実は
以上です。
コメント