最近在学习并行编程时注意到了UAF(USE-AFTER-FREE)问题,引发UAF问题的原因一般是因为在释放了某个指针指向的内存后,并没有将该指针置空,从而可以通过该指针非法地修改内存。
以前因为一直都没有写过大型项目,也不曾特别关心安全问题,虽然知道在指针申请后手动置为NULL但一度以为在free()
之后该指针会被自动置为NULL或者废置。(事实上在debug版本里大部分编译器确实会自动将指针置为0xdddddddd,但是在realse版本中则不会)
想要避免这个问题解决方式十分直观,就是养成良好的使用指针的习惯,即:
1. 初始化时置 NULL
2. 释放时置 NULL
对于释放时的置NULL,有一个常用技巧:即定义一个宏来释放内存及将指针置NULL:
#define xfree(x) free(x); x = NULL;
// 在 C++ 中应使用 nullptr 指代空指针
// 一些平台上的 C/C++ 已经预先添加了 xfree 拓展,如 GNU 的
libiberty
xfree(p);
// 用函数实现,例如 GitHub 上的 AOSC-Dev/Anthon-Starter #9:
static inline void *Xfree(void *ptr) {
free(ptr);
#ifdef __cplusplus
return nullptr;
#else
return NULL;
#endif
}
q=Xfree(q);