我们已经知道 use-after-free 漏洞可能会导致安全问题。由于释放后使用错误是由悬空指针产生的,我的问题是,如果悬空指针没有在程序中使用,它们被认为是安全的还是良性的(不是那么危险)?
2 回答
未使用的悬空指针并不危险……直到下一个开发人员使用它。您将问题标记为 C 和 C++;我会考虑你使用 C++,而不是 C。对于 C++,避免使用模糊语义和悬空倾向的原始指针。使用unique_ptr
andshared_ptr
可以帮助你很多。
无论如何,避免悬空指针。设置已删除的指针几乎不需要任何成本nullptr
,而且可以节省大量的开发/调试时间。
如果你面临悬空指针的问题,或者至少是与它们相关的问题,你可能有机会应用美丽的rule of zero
:要么你的类管理内存(你正在编写一个容器,一个特定的酷炫的指针包装器等),或者您正在编写一个不应拥有任何原始指针的非管理类。
尽管您从安全性和漏洞方面提出问题,但我认为避免悬空指针的更令人信服的原因是帮助程序及早失败。
将指针设置为NULL
或nullptr
当它们的引用被删除时会创建一个易于识别的错误条件,一旦程序尝试引用指针,就可能导致失败。允许指针持续引用已释放的内存可能会导致以后难以调试的情况。
在 C++ 中,unique_ptr
,shared_ptr
等可以帮助您避免由悬空指针引起的问题。
在 C 和 C++ 中,地址清理可以帮助您发现内存滥用,例如不适当的引用指针。在 clang、gcc、clang++ 和 g++ 中,您可以通过将-fsanitize=address
标志添加到您的编译选项来使用此工具(请注意,它还不能很好地与多线程配合使用)。