#5752: В неизвестность со спецэффектами

14:00 21.03.2011, IT happens


Повадилась одна система валиться, причём в каких-то левых местах, каждый раз в новой подсистеме. А поскольку программа должна была бить рекорды надёжности (что-то там на электростанции измерять), то по шапке получили все, в чьих подсистемах были замечены падения.


Вся фирма на ушах — ищем баги. Опытным путём локализовали ресурсные файлы, после загрузки которых происходили падения, для общности снесли их в одну директорию — падения прекратились. Танцы с бубном продолжались довольно долго. Наконец что-то щёлкнуло в мозгу.


Итак, есть подпрограмма:


1. Объявляем массив для хранения имени файла.

2. Адрес этого массива передаём в другую подпрограмму, где в него заносится имя файла, файл загружается, и с ним довольно долго работают.

3. Выходим из всех подпрограмм наверх, в главное меню.


Как вы думаете, что лежало в памяти за «хвостом» массива? Правильно, адрес возврата из подпрограммы. Классическое переполнение буфера: стоит записать в массив на один символ больше, и по возврату из подпрограммы нам гарантирован полёт в неизвестность со всеми спецэффектами.


Заключительный аккорд: размер массива зарезал сам начальник. Молодость программистскую, блин, вспомнил. Программа-то 16-битная была, стек, соответственно, больше 64К быть не мог. Вот и оказал нам шеф свою посильную помощь, снизив нагрузку…




Загрузка...