Double.parseDouble("2.2250738585072012e-308")

追加情報です。



Q「grep で検索して Double.parseDouble を使っていなければOK?」


Noです。
直接呼んでいなくても、間接的に呼んでいる場合があります。
その場合も同様の現象が起きます。

コアのAPIでも、Double.parseDouble()を呼んでいるものがあります。
以下は内部で呼んでいるメソッド、クラス、パッケージです(JDK1.6)。

java.math.BigDecimal.doubleValue()
java.math.BigInteger.doubleValue()
java.text.DigitList.getDouble()
java.util.Scanner
java.util.prefs.AbstractPreferences
java.util.prefs.Preferences
xalan
xerces
xpath

さらにそれを呼んでいるAPIもあるでしょうから、範囲はもう少し広がります。


開発言語もJavaPHPだけではなく、JavaVM上で動く言語は同様の危険があります。
私が知っているだけでも、JRuby, Jython, Scala, Clojure, Groovy, ColdFusion, Rhino, Jaskell, Fortress, Pnuts, SISC, OCaml-Java ぐらいあります。
開発言語だけではなく、JavaVMで動くフレームワーク、ライブラリ、パッケージなども危険である可能性があります。
それらの中で、「文字列から実数に変換する処理」があれば、Double.parseDoubleを使っている可能性があります。


偶然、MySQLJDBCドライバでも使っている箇所を見つけました。
そのため、MySQLで実数を使ってる場合も危険になります。
これは、MySQLに限らず、実数を使っている他のDBでも、Double.parseDoubleを使っている可能性があります。


このように、問題のAPIがあまりにも基本的でよく使われるため、すべてのソフトウェアが問題ないかどうかを調べることは、現実的に不可能です。
例えすべてのソースが手元にあったとしても、「間接的に呼んでいるかどうか?」までも調べるのは困難です。
最も現実的で確実な解決方法は、修正されたパッチを当てることです。



Q「いつのバージョンから? 1.5? 1.4?」


Double.parseDouble()はJDK1.2から導入されたAPIです。
実際にJDK1.2で確認したところ、同じ現象が発生しました。
これは1998年12月の最初の実装から潜んでいたバグになります(12年以上前です!)。
すなわち、ほとんどすべてのシステムがこの問題を含んでいることになります。



Q「今まで起きなかったから、放っておいても大丈夫だよね?」


Noです。
外部からある種のサーバを落とすことが可能のようです(しかもメジャーな!)。
詳しくはとても話せません。
このバグが知られてしまった以上、悪意あるユーザーがその方法を見つけ、使う可能性があります。
できるだけ多くのシステム、特に、不特定多数の人が使うシステム、落ちるとインパクトのあるシステムは至急対応すべきです。