- PVSM.RU - https://www.pvsm.ru -
var x = []; x[0x7fffffff]=1; JSON.stringify(x);
Таким незамысловатым способом, можно намертво повесить firefox, довести до падения вкладку хрома и повесить основной поток nodejs.
Самое примечательное в этом то, что зависание происходит на уровне нативного кода функции JSON.stringify
, что не позволяет прервать выполнение в том же firefox'е, как это обычно бывает при простом while(true);
.
При выполнении внутри WebWorker'а в chrome, страница продолжает отвечать, но terminate не может завершить поток.
Так же по понятным причинам, такой код не обнаруживается jslint'ом.
var x = [];
x[0x7fffffff]=1; // предел знакового положительного 32х битного целого
JSON.stringify(x); // поскольку x массив, получаем очень много null...
Было 2 с лишним часа ночи, спал я уже давно и мало, а работать было надо. Нужно было реализовать коллекцию объектов в localStorage
. Math.random() * 0x7fffffff >> 0
, далее данные сериализовались и записывались в хранилище. После этого начались случайные зависания страницы, а при отладке обнаружилось что коллекция всё еще инициализировалась как массив.
На самом деле, заметка не о том что JSON.stringify
плохой, а о том что надо быть внимательнее к тому, что в него отправляешь.
Заметку решил написать, когда выяснилось, что несколько знакомых программистов не раскусили сброшенный по "аське" код.
Автор: findoff
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/115184
Ссылки в тексте:
[1] jsfiddle: https://jsfiddle.net/kLbf880o/6/
[2] Мозг: http://www.braintools.ru
[3] Источник: https://habrahabr.ru/post/279439/
Нажмите здесь для печати.