Correctly sanitize nonnull pointers. (#834)

Only the special nullability attributes (`_Nonnull`) work correctly
through type aliases like we're using with `Ptr`. But they aren't
strictly UB and so have to be specially enabled in our sanitizer config
in order to usefully catch nullness errors early. Turn on those
sanitizers as well.

Also, now that we are using fully remote build output caching for our
CI and not trying to squeeze under an arbitrary size limit, re-enable
the nice error messages for all the UBSan checks.

Note that this will have a (very) slow CI run as it will have to
recompile ~everything and upload fresh artifacts. But those should then
be effective cache hits going forward.
This commit is contained in:
Chandler Carruth
2021-09-16 23:22:20 -07:00
committed by GitHub
parent 56dc4ae375
commit 89da711a26
2 changed files with 4 additions and 9 deletions
+3 -4
View File
@@ -11,12 +11,11 @@ namespace Carbon {
// A non-nullable pointer. Written as `Nonnull<T*>` instead of `T*`.
//
// Note LLVM primarily enforces the attribute on function calls that can be
// proven to be called with nullptr; in other places, this is essentially a
// comment.
// Sanitizers enforce this dynamically on assignment, return, and when passing
// as an argument. Static analysis will also track erroneous uses of `nullptr`.
template <typename T,
typename std::enable_if_t<std::is_pointer_v<T>>* = nullptr>
using Nonnull = T _Nonnull __attribute__((nonnull));
using Nonnull = T _Nonnull;
} // namespace Carbon