こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

締切り済みの質問

不正なコードの検出方法

EclipseにてJavaにて開発を行っているのですが下記のような不正なコード
(オブジェクトを==演算子で比較して同じ値かどうかを判定)を検出する
プラグインがないか探しています。FindBugをインストールしてみましたが検出されませんでした。
下記コードではJavaの仕様によりa,bの値が-127~127であれば同じオブジェクトと判定され、
範囲を超える場合、異なるオブジェクトとみなされる不安定な動きをするため、
警告してくれてもよさそうなものなのですが・・・。
警告してくれるようなプラグインまたはEclipseの設定はありますでしょうか。

Integer a = 1000;
Integer b = 1000;
if( a == b)
{
System.out.println("同じ値");
}

投稿日時 - 2015-09-27 00:32:23

QNo.9054453

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

ANo.3

少なくとも最新(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-

投稿日時 - 2015-09-28 02:06:27

ANo.2

#1です。

例えば、質問に書いてあるソースでは

>System.out.println("同じ値");

とありますのでメッセージの"同じ値"の意味がわかる人であれば、a == b は実際は同じ値なのかを調べたいので a.equals(b) (または b.eqals(a)) の間違いとわかりますが、"同じ値"の意味のわからない人(日本語が読めないとか)にとってはa == bが警告すべきものなのかどうかわかりません。

まあインスタンス同士を==で比較してるのを無条件に警告するというのもありなのかもしれませんが。

投稿日時 - 2015-09-27 10:55:34

ANo.1

>下記コードではJavaの仕様によりa,bの値が-127~127であれば同じオブジェクトと判定され、
>範囲を超える場合、異なるオブジェクトとみなされる不安定な動きをするため、

不安定というわけではなく実際に-127~127なら同じインスタンスが使われて、それ以外だと個別にインスタンスが生成されてるだけだと思いますけど。

>警告してくれるようなプラグインまたはEclipseの設定はありますでしょうか。

その部分だけみるならインスタンスが同じかの判定で、おかしいわけではありませんから、さすがにないのではないでしょうか。

投稿日時 - 2015-09-27 01:37:47

お礼

ご回答ありがとうございます。
下記の挙動がコーディングの落とし穴となりえるのでコンパイル時に警告が
出てくれればと思った次第です。


>>不安定というわけではなく実際に-127~127なら同じインスタンスが使われて、それ以外だと個別にインスタンスが生成されてるだけだと思いますけど。

投稿日時 - 2015-09-27 11:00:44

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-