The C++ Standard, [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 never be executed, for example by placing a handler for a derived class after a handler for a corresponding base class.
Consequently if two handlers catch exceptions that are derived from the same base class (such as std::exception), the most derived exception must come first.
Noncompliant Code Example
In this 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.
// Classes used for exception handling.
class B {};
class D : public B {};
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.
// Classes used for exception handling.
class B {};
class D : public B {};
void f() {
try {
// ...
} catch (D &d) {
// ...
} catch (B &b) {
// ...
}
}
Risk Assessment
Exception handlers with inverted priorities cause unexpected control flow when an exception occurs of the derived type.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
|---|---|---|---|---|---|
ERR54-CPP | Medium | Likely | Low | P18 | L1 |
Automated Detection
Tool | Version | Checker | Description |
|---|---|---|---|
| 1.2 | CP1.ERR36 | Fully implemented | |
| PRQA QA-C++ | 4.4 | 4040,4034 |
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." |
Bibliography
| [ISO/IEC 14882-2014] | 15.3, "Handling an Exception" |