☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

不可返回局部对象的地址或引用

8.25 ID_localAddressFlowOut
目录 › next › previous

函数的参数以及在函数作用域内定义的,不受 static、extern、local_thread 等关键字限定的对象简称局部对象,局部对象的生命周期在函数返回后结束,其地址或引用也会失效,如果继续访问会导致标准未定义的行为。

示例:

int* foo() {
    int i = 0;    // Local object
    ....
    return &i;    // Non-compliant
}

int& bar() {
    int i = 0;    // Local object
    ....
    return i;     // Non-compliant
}

int&& baz() {
    int i = 0;    // Local object
    ....
    return std::move(i);    // Non-compliant
}

局部对象的生命周期在函数返回后结束,返回与局部对象相关的指针或引用是不符合要求的。

注意,除了 return 语句,throw、赋值等表达式也受本规则限制,禁止将内层作用域中的地址向外层作用域传递,如:

char* global;

void fun() {
    char local[] = "....";
    global = local;          // Non-compliant
}

例中 local 是局部数组,函数返回后,全局指针会指向无效的内存区域。

另外,将对象地址传入异步过程时也需要注意对象的生命周期,参见 ID_illLifetime。

相关

ID_tmpAddressFlowOut ID_danglingDeref ID_illLifetime

依据

ISO/IEC 9899:1999 6.2.4(2)-undefined ISO/IEC 9899:2011 6.2.4(2)-undefined

参考

CWE-562 C++ Core Guidelines F.43 MISRA C 2012 18.6 MISRA C++ 2008 7-5-1 MISRA C++ 2008 7-5-2
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.