Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The C++ 2004, section 15.3 "Handling an Exception", saysStandard, [except.handle], paragraph 4, states [ISO/IEC 14882-2014]:

The handlers for a try block are tried in order of appearance. That makes it possible to write handlers that can that can never be executed, for example by placing a handler for a derived class after a handler for a corresponding base corresponding base class.

A ... in a handlers exception-declaration functions similarly to ... in a function parameter declaration; it specifies a match for any exception. If present, a ... handler shall be the last handler for its try block.

Consequently if two handlers catch exceptions that are derived from the same base class (such as std::exception), the most derived exception should must come first.

...

Noncompliant Code Example

In this non-compliant noncompliant code example, the first handler will catch all exceptions of class B, as well as exceptions of class D, since they are also of class B. Consequently, the second handler will not catch any exceptions.

Code Block
bgColor#FFcccc
langcpp
// classes used for exception handling
class B {};
class D : public B {};

// ... Using the classes from above
void f() {
  try {
    // ...
  } catch (B &b) {
    // ...
  } catch (D &d) {
    // ...
  }

}

Compliant Solution

In this compliant solution, the first handler will catch all exceptions of class D, and the second handler will catch all the other exceptions of class B.

Code Block
bgColor#ccccff
langcpp
// classes used for exception handling
class B {};
class D : public B {};

// ... Using the classes from above
void f() {
  try {
    // ...
  } catch (D &d) {
    // ...
  } catch (B &b) {
    // ...
  }

}

Risk Assessment

Badly ordering exception handlers can Exception handlers with inverted priorities cause unexpected control flow when an exception occurs of the derived type.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

ERR36-CPP

highMedium

likelyLikely

lowLow

P27P18

L1

Automated Detection

Tool

Version

Checker

Description

ECLAIR

Include Page
ECLAIR_V
ECLAIR_V

CP1.ERR36

Fully implemented

PRQA QA-C++
Include Page
PRQA QA-C++_v
PRQA QA-C++_v
4040,4034 

Bibliography

...

Related Vulnerabilities

Search for other vulnerabilities resulting from the violation of this rule on the CERT website.

Related Guidelines

[MISRA 08]

Rule 15-3-6

...

, "Where multiple handlers are provided in a single try-catch statement or function-try-block for a derived class and some or all of its bases, the handlers shall be ordered most-derived to base class."
Rule 15-3-7, "Where multiple handlers are provided in a single try-catch statement or function-try-block, any ellipsis (catch-all) handler shall occur last." 

Bibliography

[ISO/IEC 14882-2014]15.3, "Handling an Exception"