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

不可返回临时对象的地址或引用

8.26 ID_tmpAddressFlowOut
目录 › next › previous

临时对象可以通过常量引用或右值引用等方式作为函数的参数,但生命周期结束后,其地址或引用就会失效,如果继续访问会导致标准未定义的行为,对引用型参数取地址应谨慎。

示例:

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
}

相关

ID_localAddressFlowOut ID_referInvalidTmpObject ID_danglingDeref ID_illLifetime

依据

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

参考

MISRA C++ 2008 7-5-3
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.