- 締切済み
不正なコードの検出方法
EclipseにてJavaにて開発を行っているのですが下記のような不正なコード (オブジェクトを==演算子で比較して同じ値かどうかを判定)を検出する プラグインがないか探しています。FindBugをインストールしてみましたが検出されませんでした。 下記コードではJavaの仕様によりa,bの値が-127~127であれば同じオブジェクトと判定され、 範囲を超える場合、異なるオブジェクトとみなされる不安定な動きをするため、 警告してくれてもよさそうなものなのですが・・・。 警告してくれるようなプラグインまたはEclipseの設定はありますでしょうか。 Integer a = 1000; Integer b = 1000; if( a == b) { System.out.println("同じ値"); }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- root139
- ベストアンサー率60% (488/809)
少なくとも最新(ver.3.0.1)のFindBugsなら、 FindRefComparison が有効になっていればご質問のような箇所は検出されるはずです。 http://findbugs.sourceforge.net/bugDescriptions_ja.html#RC_REF_COMPARISON というか、私の環境の FindBugs では質問のコードの if( a == b) の行にマーカーが付きました。 ちなみに、すでに指摘されている通り、-127~127であれば本当に同じオブジェクトになっていてそれら以外では別オブジェクトになっている訳です。(どんな環境でも100%そうなるとは限らないかも知れませんが・・・) 理由は、Integer.valueOf(int) のソースコードを見ると分かります。 http://docs.oracle.com/javase/jp/8/api/java/lang/Integer.html#valueOf-int-
- wormhole
- ベストアンサー率28% (1626/5665)
#1です。 例えば、質問に書いてあるソースでは >System.out.println("同じ値"); とありますのでメッセージの"同じ値"の意味がわかる人であれば、a == b は実際は同じ値なのかを調べたいので a.equals(b) (または b.eqals(a)) の間違いとわかりますが、"同じ値"の意味のわからない人(日本語が読めないとか)にとってはa == bが警告すべきものなのかどうかわかりません。 まあインスタンス同士を==で比較してるのを無条件に警告するというのもありなのかもしれませんが。
- wormhole
- ベストアンサー率28% (1626/5665)
>下記コードではJavaの仕様によりa,bの値が-127~127であれば同じオブジェクトと判定され、 >範囲を超える場合、異なるオブジェクトとみなされる不安定な動きをするため、 不安定というわけではなく実際に-127~127なら同じインスタンスが使われて、それ以外だと個別にインスタンスが生成されてるだけだと思いますけど。 >警告してくれるようなプラグインまたはEclipseの設定はありますでしょうか。 その部分だけみるならインスタンスが同じかの判定で、おかしいわけではありませんから、さすがにないのではないでしょうか。
お礼
ご回答ありがとうございます。 下記の挙動がコーディングの落とし穴となりえるのでコンパイル時に警告が 出てくれればと思った次第です。 >>不安定というわけではなく実際に-127~127なら同じインスタンスが使われて、それ以外だと個別にインスタンスが生成されてるだけだと思いますけど。