fix(HttpHandler): prevent exceptions from escaping destructors and cleanup #765
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem:
Currently,
~HttpHandler()
,Close()
,killTimer()
, anderase()
can propagate exceptions through destructors or cleanup code.This violates safe C++ practices because throwing exceptions from destructors is undefined behavior if another exception is already active (stack unwinding). In addition, placement new or STL container operations (like
std::deque::push_back
) can throw, which might escape through the destructor.This is flagged by static analyzers and linters as a critical issue: destructors must not throw. Even if the code works most of the time, a single allocation failure or exception in a callback can terminate the program unexpectedly.
Potential call stack where exceptions can propagate:
There are 3 potential fixes, (I am suggesting the first one):
~HttpHandler()
now wrapsClose()
in atry/catch
to silently swallow any exceptions.Close()
andkillTimer()
are markednoexcept
and all potentially throwing operations are wrapped intry/catch
.noexcept
if move constructor isnoexcept
.Guarantees no exceptions propagate from erase.
This guarantees that destructors and cleanup routines cannot throw, satisfying the C++ Core Guidelines rule: C.64: Destructors should be noexcept
.