Как стать автором
Обновить

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

Время на прочтение 2 мин
Количество просмотров 25K

Вот весь код: 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. Нестрогая типизация иногда зло.

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

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн