Простой и не очень очевидный способ повесить chrome, firefox и nodejs внутри нативной функции

в 12:34, , рубрики: javascript, V8, заметки, криворукость, сериализация

Вот весь код: var x = []; x[0x7fffffff]=1; JSON.stringify(x);

Для желающих попробовать: jsfiddle

Таким незамысловатым способом, можно намертво повесить firefox, довести до падения вкладку хрома и повесить основной поток nodejs.

Самое примечательное в этом то, что зависание происходит на уровне нативного кода функции JSON.stringify, что не позволяет прервать выполнение в том же firefox'е, как это обычно бывает при простом while(true);.

При выполнении внутри WebWorker'а в chrome, страница продолжает отвечать, но terminate не может завершить поток.

Так же по понятным причинам, такой код не обнаруживается jslint'ом.

Как это работает

var x = [];
x[0x7fffffff]=1; // предел знакового положительного 32х битного целого
JSON.stringify(x); // поскольку x массив, получаем очень много null...

Как автор докатился до жизни такой

Было 2 с лишним часа ночи, спал я уже давно и мало, а работать было надо. Нужно было реализовать коллекцию объектов в localStorage. Мозг думал уже туго, и вначале для хранения был выбран простой массив с сохранением как JSON. После осознания что с ID в данном случае работать будет удобнее, массив был заменен на объект, а для генерации случайного ID использовался следующий код Math.random() * 0x7fffffff >> 0, далее данные сериализовались и записывались в хранилище. После этого начались случайные зависания страницы, а при отладке обнаружилось что коллекция всё еще инициализировалась как массив.

Резюмируя, про себя...

На самом деле, заметка не о том что JSON.stringify плохой, а о том что надо быть внимательнее к тому, что в него отправляешь.

  1. Надо больше спать
  2. Надо чаще спать
  3. Не стоит делать числовые id, если они будут случайными(проще найти ошибку в случае чего).
  4. Нестрогая типизация иногда зло.

Заметку решил написать, когда выяснилось, что несколько знакомых программистов не раскусили сброшенный по "аське" код.

Автор: findoff

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js