Вот весь код: 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
плохой, а о том что надо быть внимательнее к тому, что в него отправляешь.
- Надо больше спать
- Надо чаще спать
- Не стоит делать числовые id, если они будут случайными(проще найти ошибку в случае чего).
- Нестрогая типизация иногда зло.
Заметку решил написать, когда выяснилось, что несколько знакомых программистов не раскусили сброшенный по "аське" код.
ссылка на оригинал статьи https://habrahabr.ru/post/279439/
Добавить комментарий