[libcxx-commits] [libcxx] [libc++][hardening] Add a greppable prefix to assertion messages. (PR #150560)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Jul 30 13:58:12 PDT 2025
================
@@ -20,8 +20,8 @@
#define _LIBCPP_ASSERT(expression, message) \
(__builtin_expect(static_cast<bool>(expression), 1) \
? (void)0 \
- : _LIBCPP_ASSERTION_HANDLER(__FILE__ ":" _LIBCPP_TOSTRING(__LINE__) ": assertion " _LIBCPP_TOSTRING( \
- expression) " failed: " message "\n"))
+ : _LIBCPP_ASSERTION_HANDLER(__FILE__ ":" _LIBCPP_TOSTRING( \
+ __LINE__) ": libc++ Hardening assertion " _LIBCPP_TOSTRING(expression) " failed: " message "\n"))
----------------
ldionne wrote:
Personally, what I would do is something like this:
```
// This is the old _LIBCPP_ASSERT macro, we probably don't want to rename
// it but I'm using this new name here to clarify the intent
#define _LIBCPP_CONTRACT_VIOLATION(expression, message) \
(__builtin_expect(static_cast<bool>(expression), 1) \
? (void)0 \
: _LIBCPP_ASSERTION_HANDLER(message))
#define _LIBCPP_HARDENING_ASSERT(expression, message) \
_LIBCPP_CONTRACT_VIOLATION(expression, \
__FILE__ ":" _LIBCPP_TOSTRING(__LINE__) \
": assertion " _LIBCPP_TOSTRING(expression) " failed: " message "\n")
```
So basically, we have:
1. A mechanism to set the "contract violation handler" (which we call the "assertion handler"). That is not tied to libc++ Hardening specifically
2. A macro to trigger a "contract violation" (that is currently called `_LIBCPP_ASSERT`)
3. A macro that triggers a contract violation originating from a libc++ Hardening assertion (that's what we'd now call `_LIBCPP_HARDENING_ASSERT`)
That way, we clarify what is a Hardening assertion but we still retain a general purpose mechanism for setting (and talking about) contract violations which should be forward compatible if we add non-Hardening related assertions.
Connecting the current vendor-controlled way of defining a custom "contract violation handler aka assertion handler" is going to be a bit challenging but I think it's doable, hopefully while staying backwards compatible. Otherwise it's possible that vendors will need to change their stuff a little bit but it should be pretty self-contained.
https://github.com/llvm/llvm-project/pull/150560
More information about the libcxx-commits
mailing list