Введение

Указатель, который не указывает на допустимый объект.

В компьютерном программировании висячие и дикие указатели — это указатели, которые не указывают на допустимый объект соответствующего типа. Это особые случаи нарушений безопасности памяти. В более общем смысле, висячие и дикие ссылки — это ссылки, которые не разрешаются в допустимое местоположение. Висячие указатели возникают при уничтожении объекта, когда объект, на который есть входящая ссылка, удаляется или освобождается, не изменяя при этом значение указателя, так что указатель продолжает указывать на область памяти освобожденной памяти. Система может повторно выделить ранее освобожденную память, и если программа затем разыменует (теперь) висячий указатель, может возникнуть непредсказуемое поведение, поскольку память может содержать совершенно другие данные. Если программа записывает в память, на которую указывает висячий указатель, может произойти скрытая порча несвязанных данных, приводящая к трудноуловимым ошибкам, которые очень сложно обнаружить. Если память была перераспределена другому процессу, попытка разыменовать висячий указатель может вызвать ошибки сегментации (UNIX, Linux) или общие ошибки защиты (Windows). Если программа имеет достаточные привилегии для перезаписи служебных данных, используемых менеджером памяти ядра, повреждение может привести к нестабильности системы. В объектно-ориентированных языках со сборкой мусора висячие ссылки предотвращаются путем уничтожения только тех объектов, которые недоступны, то есть не имеют входящих указателей. Это обеспечивается либо трассировкой, либо подсчетом ссылок. Однако финализатор может создавать новые ссылки на объект, требуя его восстановления, чтобы предотвратить появление висячей ссылки. Дикие указатели, также называемые неинициализированными указателями, возникают, когда указатель используется до инициализации в какое-либо известное состояние, что возможно в некоторых языках программирования. Они демонстрируют такое же непредсказуемое поведение, как и висячие указатели, хотя их реже удается не заметить, поскольку многие компиляторы выдают предупреждение во время компиляции, если к объявленным переменным обращаются до их инициализации.

Ручное деаллокация без висящей ссылки

Антони Кречмар [pl] (1945–1996) создал полную систему управления объектами, свободную от проблемы висячих ссылок. Аналогичный подход был предложен Фишером и ЛеБланком под названием "Замки и ключи".

Защитные отверстия с висящими указателями

Как и ошибки переполнения буфера, ошибки с висячими/недействительными указателями часто приводят к уязвимостям в системе безопасности. Например, если указатель используется для вызова виртуальной функции, из-за перезаписи указателя vtable может быть вызван другой адрес (возможно, указывающий на код эксплойта). В противном случае, если указатель используется для записи в память, может быть повреждена другая структура данных. Даже если память считывается только после того, как указатель стал висячим, это может привести к утечке информации (если в следующую выделенную там структуру помещены важные данные) или к повышению привилегий (если теперь недействительная память используется в проверках безопасности). Когда висячий указатель используется после освобождения памяти, без последующего выделения ему нового блока памяти, это называется уязвимостью типа "использование после освобождения". Например, уязвимость "использование после освобождения" в Microsoft Internet Explorer 6–11 используется в атаках нулевого дня продвинутой устойчивой угрозой.