ネイティブ関数内でchrome、firefox、nodejsをハングアップする単純であまり明白ではない方法

コード全体を次に示しますvar x = []; x[0x7fffffff]=1; JSON.stringify(x);



var x = []; x[0x7fffffff]=1; JSON.stringify(x);





試してみたい人のために: jsfiddle



このような簡単な方法で、firefoxをしっかりとハングさせ、chromeタブを下げて、メインのnodejsスレッドをハングさせることができます。



これに関する最も注目すべきことは、 JSON.stringify



関数のネイティブコードレベルでハングが発生することです。これにより、単純なwhile(true);



場合のように、同じfirefoxで実行を中断することはできませんwhile(true);







クロムのWebWorker内で実行されると、ページは応答し続けますが、終了はストリームを終了できません。



また、明らかな理由により、このようなコードはjslintによって検出されません。





仕組み



 var x = []; x[0x7fffffff]=1; //    32   JSON.stringify(x); //  x ,    null...
      
      





著者がどのようにしてこのような生活を始めたのか



それは午前2時を超え、私は長い間眠りましたが、それほど多くはありませんでしたが、仕事をしなければなりませんでした。 localStorage



にオブジェクトのコレクションを実装する必要がありました。 脳はすでにきついと思っていました、そして、最初は単純な配列がJSONとして保存するためにストレージのために選ばれました。 この場合、IDを使用する方が便利であることを認識した後、配列をオブジェクトに置き換え、次のコードMath.random() * 0x7fffffff >> 0



使用してランダムIDを生成し、データをシリアル化してストレージに書き込みました。 その後、ランダムなページのフリーズが始まり、デバッグ中にコレクションが配列としてまだ初期化されていることが発見されました。



要約すると、自分自身に...



実際、 JSON.stringify



悪いというわけではありませんが、送信するものに注意する必要があります。



  1. もっと睡眠が必要
  2. より頻繁に寝る必要がある
  3. 数値IDがランダムな場合は、IDを作成しないでください(何かが発生した場合にエラーを見つけやすくなります)。
  4. 緩い類型化は時々悪です。


何人かの使い慣れたプログラマーがICQ用にリセットされたコードを理解しなかったことが判明したときに、私はメモを書くことにしました。




All Articles