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の実装の正確なところはわからないが、これは境界系の極々普通に考えられるテストケースであり、それが不十分らしいということにはちょっと驚いた。