不可返回局部对象的地址或引用
8.25 ID_localAddressFlowOut
函数的参数以及在函数作用域内定义的,不受 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。
相关
依据
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