CertC++-ERR53ΒΆ
Do not reference base classes or class data members in a constructor or destructor function-try-block handler
Required inputs: IR
When an exception is caught by a function-try-block handler in a constructor, any fully constructed base classes and class members of the object are destroyed prior to entering the handler [ ISO/IEC 14882-2014]. Similarly, when an exception is caught by a function-try-block handler in a destructor, all base classes and nonvariant class members of the objects are destroyed prior to entering the handler. Because of this behavior, the C++ Standard, [except.handle], paragraph 10, states the following:
Referring to any non-static member or base class of an object in the handler for a function-try-block of a constructor or destructor for that object results in undefined behavior.
Do not reference base classes or class data members in a constructor or destructor function-try-block handler. Doing so results in undefined behavior.
Noncompliant Code Example
In this noncompliant code example, the constructor for class
C handles exceptions with a function-try-block. However,
it generates
undefined
behavior by inspecting its member field
str.
#include <string>
class C {
std::string str;
public:
C(const std::string &s) try : str(s) {
// ...
} catch (...) {
if (!str.empty()) {
// ...
}
}
};
Compliant Solution
In this compliant solution, the handler inspects the constructor parameter rather than the class data member, thereby avoiding undefined behavior.
#include <string>
class C {
std::string str;
public:
C(const std::string &s) try : str(s) {
// ...
} catch (...) {
if (!s.empty()) {
// ...
}
}
};
Risk Assessment
Accessing nonstatic data in a constructor's exception handler or a destructor's exception handler leads to undefined behavior.
| Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
|---|---|---|---|---|---|
| ERR53-CPP | Low | Unlikely | Medium | P2 | L3 |
Related Guidelines
| [ MISRA 2008] | Rule 15-3-3 (Required) |
Bibliography
| [ ISO/IEC 14882-2014] | Subclause 15.3, "Handling an Exception" |
Possible Messages
Key |
Text |
Severity |
Disabled |
|---|---|---|---|
handler_uses_field |
Handler of a function-try-block shall not reference non-static members from this class or its bases |
None |
False |
Options
This rule shares the following common options: exclude_in_macros, exclude_messages_in_system_headers, excludes, extend_exclude_to_macro_invocations, includes, justification_checker, languages, post_processing, provider, report_at, severity
The following places define options that affect this rule: Stylechecks, Analysis-GlobalOptions
This rule has no individual options.