不可返回临时对象的地址或引用
8.26 ID_tmpAddressFlowOut
临时对象可以通过常量引用或右值引用等方式作为函数的参数,但生命周期结束后,其地址或引用就会失效,如果继续访问会导致标准未定义的行为,对引用型参数取地址应谨慎。
示例:
using S = std::string;
const S* foo(const S& s) {
return &s; // Non-compliant
}
int main() {
auto* p = foo("abc");
cout << *p << '\n'; // Undefined behavior
}
例中 foo 函数的参数是由字符串常量 "abc" 生成的 string 型临时对象,所在语句执行完毕后生命周期即结束,p 会成为野指针,继续访问会导致标准未定义的行为。
同理,也应避免对于右值引用型的参数取地址,如:
S* bar(S&& s) {
return &s; // Non-compliant
}
相关
依据
ISO/IEC 9899:1999 6.2.4(2)-undefined
ISO/IEC 9899:2011 6.2.4(2)-undefined
参考
MISRA C++ 2008 7-5-3