IE6をクラッシュさせるコード
マイコミジャーナルに「IEをクラッシュさせる1行」というAjaxianの記事の紹介記事が載っている。jQueryのプラグインで落ちるとあるが、jQueryとは無関係の下記のコードで落ちるようだ。
function crash() { for (x in document.open); } crash();
そもそも、IE6をクラッシュさせるコードなんて、ググればたくさん出てくる。
僕も数年前にJavaScriptのテストケースを自作していたときに、IE6でクラッシュするケースを見つけた。 既知のものかどうかは分らないが、以下のようなもの。
function equal(x, y) { return x == y; } function test() { var v = 2147483647; // 2^31-1 v++; equal(v, 2147483648); }
test()関数を実行するとクラッシュする。JScriptエンジンの実装では、小さな整数は32ビットで実装していると思われるが、2147483647は31ビットが全部1であり、最上位ビットは符号なので、32ビットで表現できる最大の数値。それをインクリメントすると32ビットでは表現できなくなるので、64ビットに変換しているものと思われるが、そこに問題があるらしい。でも、それだけではクラッシュしない。関数の引数にその値を渡すとクラッシュする。
JScriptの実装の正確なところはわからないが、これは境界系の極々普通に考えられるテストケースであり、それが不十分らしいということにはちょっと驚いた。