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 и как оно усложняет (но не делает невозможными) эксплойты переполнения буфера?
- →Как стековые канарейки обнаруживают переполнения стекового буфера?