CodeQL 文档

局部变量地址存储在非局部内存中

ID: cpp/stack-address-escape
Kind: problem
Security severity: 
Severity: warning
Precision: medium
Tags:
   - reliability
Query suites:
   - cpp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

此规则查找可能将局部变量地址存储在非局部内存中的赋值。局部变量地址在函数返回之前有效,之后将变成悬空指针。如果在函数返回后从未使用过悬空指针,则此类代码是安全的,但这不是推荐的编码实践。此外,除非非局部内存受互斥锁保护,否则此代码存在线程安全风险。

建议

  1. 如果需要获取局部变量的地址,请确保该地址仅存储在不会超出局部变量生命周期的内存中。例如,将地址存储在另一个局部变量中是安全的。同样,将局部变量的地址传递给另一个函数也是安全的,前提是另一个函数仅在本地使用该地址,并且不会将其存储在非局部内存中。

  2. 如果需要存储一个超出当前函数范围的生命周期的地址,则应该在堆上分配该地址。应注意确保在不再需要时释放内存,尤其是在使用低级内存管理例程(如 malloc/freenew/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.
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私