Опасен ли висячий указатель, если его никогда не использовать?
Мы уже знали, что уязвимости использования после освобождения могут вызвать проблемы с безопасностью. Поскольку ошибка использования после освобождения возникает из-за висящего указателя, мой вопрос заключается в том, что, если в программе не используются висячие указатели, они считаются безопасными или безопасными (не такими опасными)?
2 ответа
Неиспользуемый висячий указатель не опасен... пока его не использует следующий разработчик. Вы пометили вопрос как C и C++; Я считаю, что вы работаете с C++, а не с C. Для C++ избегайте необработанных указателей с неясной семантикой и висячими тенденциями. С помощью unique_ptr
а также shared_ptr
может помочь вам там.
Во всяком случае, избегайте висящих указателей. Установка удаленного указателя почти ничего не стоит nullptr
и это может сэкономить тонны времени разработки / отладки.
Если вы столкнулись с проблемой висячих указателей, или, по крайней мере, с вопросом, связанным с ними, у вас, вероятно, есть возможность применить красивые rule of zero
: либо ваш класс управляет памятью (вы пишете контейнер, специальную классную упаковку с необычными указателями или тому подобное), либо вы пишете неуправляющий класс, который не должен владеть какими-либо необработанными указателями.
Хотя вы формулируете свой вопрос с точки зрения безопасности и уязвимостей, я думаю, что более веская причина избегать висящих указателей состоит в том, чтобы помочь программам рано выходить из строя.
Установка указателей на NULL
или же nullptr
когда их ссылки удаляются, создается легко распознаваемое условие ошибки, которое может вызвать сбой, как только программа попытается отложить указатель. Если указатель сохранится при обращении к освобожденной памяти, это может впоследствии привести к сложным условиям отладки.
В C++ unique_ptr
, shared_ptr
и тому подобное может помочь вам избежать проблем, возникающих из-за висячих указателей.
Как в C, так и в C++, очистка адресов может помочь вам найти злоупотребления памятью, такие как указатели с неправильной привязкой. В clang, gcc, clang ++ и g ++ вы можете использовать этот инструмент, добавив -fsanitize=address
пометьте параметры компиляции (обратите внимание, что с многопоточностью это еще не очень хорошо).