[clang] nonblocking/nonallocating attributes: 2nd pass caller/callee analysis (PR #99656)

Doug Wyatt via cfe-commits cfe-commits at lists.llvm.org
Sun Sep 8 08:30:23 PDT 2024


dougsonos wrote:

In working with this version of the compiler, I've discovered a pain point with libc++, `std::__libcpp_verbose_abort()`. Many things which one would expect to be nonblocking, e.g. `std::vector<T>::operator[]`, have hardening paths which call `__libcpp_verbose_abort()` on failure.

I chatted with a libc++ maintainer about this. A first thought was to simply declare `__libcpp_verbose_abort()` as `nonblocking`. But that feels like a weird lie. Possibly most ideally, functions like this would have an attribute to exempt them from nonblocking analysis.

A quick hack would be to synthesize that attribute from a combination of the `noreturn` attribute and the function name containing "abort" or "terminate". (`noreturn` on its own is initially attractive, but it can also apply to a wrapper around `throw`).

The only workaround is to redeclare `__libcpp_verbose_abort()` with `[[clang::nonblocking]]`. This is tricky because the redeclaration has to follow the one in `<__verbose_abort>` but precede its use from other headers like `<vector>`. That leads to having to include `<__verbose_abort>` directly.

Would appreciate any thoughts!

https://github.com/llvm/llvm-project/pull/99656


More information about the cfe-commits mailing list