MISRA C++:2023 Rule 18.5.1
A noexcept
function should not attempt to propagate an exception
to the calling function
Since R2024b
Description
Rule Definition
A noexcept
function should not attempt to propagate an
exception to the calling function.
Rationale
You can specify that a callable entity does not raise an exception by specifying it as
noexcept
, or noexcept(true)
, or
noexcept(<true condition>)
. The compiler expects that a
noexcept
function does not exit with an exception. Based on this
assumption, the compiler omits the exception handing process for noexcept
functions. When a noexcept
function exits with an exception, the
exception becomes unhandled.
If a noexcept
function exits with an exception, the compiler invokes
std::terminate()
implicitly. The function
std::terminate()
terminates the program execution in an
implementation-defined manner. That is, the exact process of program termination depends on
the particular set of software and hardware that you use. For instance,
std:terminate()
might invoke std::abort()
to
abnormally abort the execution without unwinding the stack, leading to resource leak and
security vulnerabilities.
Specify functions as noexcept
or noexcept(true)
only when you know the functions raise no exceptions. If you cannot determine the exception
specification of a function, specify it by using noexcept(false)
.
Destructors of objects are implicitly noexcept(<true>)
. Do not raise
exceptions in destructors.
Polyspace Implementation
Polyspace® reports a violation of this rule if either of these conditions are true:
A destructor of an object exits with an unhandled exception.
A
noexcept
,noexcept(true)
, ornoexcept(<true condition>)
callable entity exits with an exception.
When a noexcept
callable entity invokes other callable entities,
Polyspace reports violations of this rule only if the called entities are explicitly
specified as noexcept(<false>)
. For example:
Functions — Polyspace reports a violation if a
noexcept
function calls a function that is explicitly specified asnoexcept(<false>)
. Some standard library functions, such as the constructor ofstd::string
, use pointers to functions to perform memory allocation, which might raise exceptions. Because these functions are not specified asnoexcept(<false>)
, Polyspace does not flag a function that calls these standard library functions.External function — Polyspace reports a violation if a
noexcept
function calls an external function that is explicitly specified asnoexcept(<false>)
.Virtual function — Polyspace reports a violation when a
noexcept
function calls a virtual function that is explicitly specified asnoexcept(<false>)
in a derived class.Pointers to function — These callable entities cannot be specified as
noexcept(<false>)
. Polyspace does not report a violation if anoexcept
function invokes a pointer to function.
When analyzing whether a function raises unhandled exceptions, Polyspace ignores:
Exceptions raised in
atexit()
operations.Dynamic context when checking for exceptions. For instance, a function might raise unhandled exceptions that arise only in certain dynamic contexts. Polyspace flags such a function even if the exception might not be raised.
Troubleshooting
If you expect a rule violation but Polyspace does not report it, see Diagnose Why Coding Standard Violations Do Not Appear as Expected.
Examples
Check Information
Group: Exception Handling |
Category: Advisory |
Version History
Introduced in R2024b