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"
Excerpt from SEI CERT C++ Coding Standard [https://cmu-sei.github.io/secure-coding-standards/sei-cert-cpp-coding-standard/rules/exceptions-and-error-handling-err/err53-cpp], Copyright (C) 1995-2026 Carnegie Mellon University. See section 9.4. "3rd-Party Licenses" in the documentation for full details.

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