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/catchto silently swallow any exceptions.Close()andkillTimer()are markednoexceptand all potentially throwing operations are wrapped intry/catch.noexceptif 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
.