局部变量地址存储在非局部内存中¶
ID: cpp/stack-address-escape
Kind: problem
Security severity:
Severity: warning
Precision: medium
Tags:
- reliability
Query suites:
- cpp-security-and-quality.qls
此规则查找可能将局部变量地址存储在非局部内存中的赋值。局部变量地址在函数返回之前有效,之后将变成悬空指针。如果在函数返回后从未使用过悬空指针,则此类代码是安全的,但这不是推荐的编码实践。此外,除非非局部内存受互斥锁保护,否则此代码存在线程安全风险。
建议¶
如果需要获取局部变量的地址,请确保该地址仅存储在不会超出局部变量生命周期的内存中。例如,将地址存储在另一个局部变量中是安全的。同样,将局部变量的地址传递给另一个函数也是安全的,前提是另一个函数仅在本地使用该地址,并且不会将其存储在非局部内存中。
如果需要存储一个超出当前函数范围的生命周期的地址,则应该在堆上分配该地址。应注意确保在不再需要时释放内存,尤其是在使用低级内存管理例程(如
malloc
/free
或new
/delete
)时。现代 C++ 应用程序通常使用智能指针(如std::shared_ptr
)来降低内存泄漏的可能性。
示例¶
static const int* xptr;
void example1() {
int x = 0;
xptr = &x; // BAD: address of local variable stored in non-local memory.
}
void example2() {
static const int x = 0;
xptr = &x; // GOOD: storing address of static variable is safe.
}
参考¶
维基百科:悬空指针.