在面向构造或析构函数体的 catch 子句中不可访问非静态成员
8.13 ID_illMemberAccess
当流程进入面向构造或析构函数体的 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