エキサイト株式会社メディア事業部エンジニアの佐々木です。メディア事業部ではSpringBoot/Javaで開発を行っており、静的解析ツールはSpotBugsを使用しています。ごくまれに、SpotBugsの指摘を抑止したいことがあります。Tipsとしてご紹介します。
前提
下記環境で動作確認済みです。
openjdk version "17.0.7" 2023-04-18 LTS OpenJDK Runtime Environment Corretto-17.0.7.7.1 (build 17.0.7+7-LTS) OpenJDK 64-Bit Server VM Corretto-17.0.7.7.1 (build 17.0.7+7-LTS, mixed mode, sharing)
plugins { id "com.github.spotbugs" version "5.0.6" }
問題となるコード
Enumの中で、定数且つイミュータブルなListを返却するメソッドでSpotBugsが警告をしてくれます。
public enum AreaType { HOKKAIDO, TOHOKU, KANTO, CHUBU, KANSAI, CHUGOKU, SHIKOKU, KYUSHU; private static final List<AreaType> AREA_TYPE_LIST = List.of(AreaType.values()); public List<AreaType> getAreaTypeList(){ return AREA_TYPE_LIST; } } ----- 下記 SpotBugsの警告内容 Malicious code vulnerability (内部表現を暴露するかもしれない配列を返すメソッド) EI_EXPOSE_REP (可変オブジェクトへの参照を返すことによって内部表現を暴露するかもしれないメソッド) ---
このように警告がでてしまいます。弊社ではテストが失敗するとGithubのプルリクエストのマージができませんので、対処する必要があります。
修正方法
上記のコードの対応方法は、公式によると、
EI: 可変オブジェクトへの参照を返すことによって内部表現を暴露するかもしれないメソッド (EI_EXPOSE_REP)¶ オブジェクトのフィールドに格納された可変オブジェクトの参照を返すと,オブジェクトの内部表現を暴露します。 インスタンスが信頼できないコードによってアクセスされるなら,可変オブジェクトのチェックされていない変更がセキュリティや他の重要なプロパティを危うくするでしょう。 何か違うことをする必要があります。オブジェクトの新しいコピーを返すことは,多くの状況でより良いアプローチです。 (引用元)https://spotbugs.readthedocs.io/ja/latest/bugDescriptions.html#ei-ei-expose-rep
まとめると、変更可能性がある可変オブジェクトをそのまま返却しないようにするということなのですが、今回は、 final修飾子
がついているのと、 List.of()
を使用して、イミュータブルなリストオブジェクトになっており、SpotBugsの指摘には該当しないと判断します。@SuppressFBWarnings
を使用することで警告を抑止することが可能となります。
@SuppressFBWarnings(value = {"EI_EXPOSE_REP"}, justification = "定数且つ不変リストなため") public List<AreaType> getAreaTypeList(){ return AREA_TYPE_LIST; }
警告されている箇所に@SuppressFBWarnings
をつけることでSpotBugsの指摘がなくなりました。
まとめ
SpotBugsの指摘も、場合によっては抑止が必要となるケースがありますので、@SuppressFBWarnings
の設定方法をご紹介させていただきました。無理にコードを変更せずに、この設定で対応可能なケースもありますので、ご参考になればと思います。
最後に
エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。
募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com