MiddleДебаггингЧастоЕщё не отвечали
Что произойдёт, если вызвать free() дважды для одного и того же указателя?
Этот код освобождает одно и то же выделение по двум путям. AddressSanitizer завершает программу; без него поведение хаотично, а куча может быть испорчена.
void process(bool early) {
int* p = static_cast<int*>(std::malloc(sizeof(int)));
*p = 42;
if (early)
std::free(p);
// ... ещё работа ...
std::free(p);
}
Найдите ошибку и объясните причину.
Двойное освобождение — неопределённое поведение: портит метаданные кучи, хранящиеся рядом с выделениями, и может вызвать падение, молча испортить данные или создать уязвимость. AddressSanitizer (-fsanitize=address) обнаруживает это мгновенно во время выполнения.
- ✗Вызывать
deleteдля указателя, который уже был удалён — то же UB, что и double-free - ✗Не обнулять указатель после free, затем проверять
if (ptr)перед повторным освобождением — устаревшее ненулевое значение проходит проверку - ✗Разделять сырой указатель между двумя контейнерами, оба из которых пытаются освободить его при уничтожении
- →Что такое уязвимость use-after-free и чем она отличается от double-free?
- →Как AddressSanitizer обнаруживает double-free без аппаратной поддержки?