Chrome 51のV8の興味深いバグ
以下のコードを実行した結果を予想してみてほしい。
function foo()
{
return typeof null === "undefined" ;
}
for ( var i = 0 ; i < 1000 ; ++i )
{
console.log( foo() ) ;
}
typeof nullの結果は"object"なので、"undefined"と===で比較するとfalseになる。したがって、関数fooは必ずfalseを返すはずである。1000回実行しようと常にfalseを返す関数は常にfalseを返すはずである。
では実際に実行して確かめてみよう。
コンソールにコピペするのとは挙動が違うが、何度もクリックすると、なぜかtrueを返すようになる。おそらく、コンソールにコピペすると毎回JITが走るので、挙動が違うのだろう。
ちなみに、workaroundとしては、typeof null === undefinedとかtypeof null === "undefined" + ""などがあるらしい。
参考
Javascript developers, be warned about this crazy JIT bug in V8!
Issue 604033 - chromium - JIT compiler not preserving method behavior - Monorail
ドワンゴ広告
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0