Fix possible infinite recursion in FMT_ASSERT #1744
Merged
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.
With exceptions disabled and assertions enabled FMT_ASSERT can lead to infinite recursion until stack overflows.
Reason
When a fmt assertion is triggered it tries to print a
message via assert_fail before terminating. For printing it uses
fmt::print to stderr that, when stderr output is limited leads again
to an assertion that tries to print a message (and so on).
Reproduce
Easiest way to reproduce is to close stderr to cause the recursion and to also close stdout to trigger an assertion condition.
Compile the following code with FMT_EXCEPTIONS=0:
Resulting stacktrace:
Proposed fix is to not rely on std::print for assertion message output but to directly use (unchecked) output via std::fprintf.
This results in the expected stacktrace with abort:
I agree that my contributions are licensed under the {fmt} license, and agree to future changes to the licensing.