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

在面向构造或析构函数体的 catch 子句中不可访问非静态成员

8.13 ID_illMemberAccess
目录 › next › previous

当流程进入面向构造或析构函数体的 catch 子句时,非静态成员的生命周期均已结束,如果继续访问会导致标准未定义的行为。

示例:

class A {
    int i = 0;

public:
    A() try {   // Function-try-block
        ....
    } catch (...) {
        access(i);    // Non-compliant, ‘i’ may no longer exist
    }

   ~A() try {
        ....
    } catch (...) {
        access(i);    // Non-compliant, ‘i’ may no longer exist
    }
};

例中 catch 子句均面向函数体,从属于“函数 try 块(function-try-block)”,当流程进入 catch 子句时成员 i 的生命周期已结束,不应被访问。

应调整实现或将 try-catch 语句移入函数内:

A::A() {
    try {
        ....
    } catch (...) {
        access(i);   // Compliant
    }
}

依据

ISO/IEC 14882:2003 15.3(10)-undefined ISO/IEC 14882:2011 15.3(10)-undefined

参考

MISRA C++ 2008 15-3-3 SEI CERT ERR53-CPP
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.