Назад к вопросам
MiddleДебаггингЧасто
Что произойдёт, если записать данных больше, чем было выделено (переполнение буфера)?
Эта функция копирует имя в буфер фиксированного размера. При длинном вводе программа портит память, падает или — что хуже — молча продолжает работать.
void store(const char* name) {
char buf[16];
std::strcpy(buf, name);
std::cout << buf << '\n';
}Найдите ошибку и объясните причину.
Запись за пределы выделенного региона портит соседнюю память: на стеке перезаписывается адрес возврата (stack smashing); на куче — метаданные аллокатора. Обнаруживается через AddressSanitizer, Valgrind или стековые канарейки.
- Использовать C-стиль
strcpy/getsбез проверки размера — эти функции являются наиболее частым источником переполнений стекового буфера - Выделять
nбайт, но записыватьn+1(нулевой терминатор) — классическая ошибка на единицу при работе со строками - Думать, что
std::stringиstd::vectorпредотвращают все переполнения — некорректные границы при ручном индексировании (operator[]) всё равно вызывают переполнение
- Что такое ASLR и как оно усложняет (но не делает невозможными) эксплойты переполнения буфера?
- Как стековые канарейки обнаруживают переполнения стекового буфера?