...
Throwing an exception copy-initializes a temporary object, called the exception object. The temporary is an lvalue and is used to initialize the variable declared in the matching handler.
If the copy constructor for the exception object type throws during the copy initialization, std::terminate()
is called, which can result in undefined possibly unexpected implementation-defined behavior. For more information on implicitly calling std::terminate()
, see ERR50-CPP. Do not abruptly terminate the program.
...
In this noncompliant code example, an exception of type S
is thrown from in f()
. However, because S
has a std::string
data member, and the copy constructor for std::string
is not declared noexcept
, the implicitly-defined copy constructor for S
is also not declared to be noexcept
. In low-memory situations, the copy constructor for std::string
may be unable to allocate sufficient memory to complete the copy operation, resulting in a std::bad_alloc
exception being thrown.
...
Allowing the application to abnormally terminate can lead to resources not being freed, closed, and so on. It is frequently a vector for denial-of-service attacks.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
ERR60-CPP | Low | Probable | Medium | P4 | L3 |
Automated Detection
Tool | Version | Checker | Description | ||||||
---|---|---|---|---|---|---|---|---|---|
Clang |
| cert-err60-cpp | Checked by clang-tidy |
Helix QAC |
| C++ |
3508 | |
Parasoft C/ |
C++ |
3508
test |
| CERT_CPP-ERR60-a | Exception objects must be nothrow copy constructible | ||||||
Polyspace Bug Finder |
| Checks for throwing exception object in copy constructor (rule fully covered) |
Related Vulnerabilities
Search for other vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
SEI CERT C++ Coding Standard | ERR50-CPP. Do not abruptly terminate the program |
Bibliography
[ Hinnant 2015 ] |
[ISO/IEC 14882-2014] | Subclause 15.1, "Throwing an Exception" |
...
...