Another win for findbugs: is Math.abs broken?
larry ogrodnek - 07 Apr 2009
I was wrapping up some code today, and ran into a weirdly interesting findbugs warning:
RV_ABSOLUTE_VALUE_OF_HASHCODE.
Bill Pugh has a more in-depth post on his blog from 2006 about this. But, if you've ever written code like:
Object x = bucket[ Math.abs(y.hashCode()) % bucket.length]
you have a bug. Or, maybe it's a bug in Math.abs, depending on your point of view.
You would probably be surprised to learn that
Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE, but it's true (go ahead and try it out).
So, about one time out of 4 billion, you'll get an ArrayIndexOutOfBoundsException, when your object's hashCode returns Integer.MIN_VALUE, and you end up with a negative array index.
This seems like a fairly common bit of code to write. In fact, back when Bill wrote this post, he uncovered this occurring 7 times in eclipse, 6 times in jboss, and twice in tomcat, among others.
This behavior sort of makes sense when you think about it. There's really no other value Math.abs could return for Integer.MIN_VALUE, and, it is, in fact, documented). Still, I'd bet that this bug exists somewhere in code you are using.
Anyway, it's worth reading Bill's post to check out some suggested fixes, and dig a little deeper into this.
comments powered by Disqus