[libcxx-commits] [libcxx] [libc++] Fix UB in <expected> related to "has value" flag (#68552) (PR #68733)
via libcxx-commits
libcxx-commits at lists.llvm.org
Sat Oct 14 14:50:45 PDT 2023
================
@@ -30,6 +31,22 @@ static_assert(!HasValueNoexcept<Foo>);
static_assert(HasValueNoexcept<std::expected<int, int>>);
static_assert(HasValueNoexcept<const std::expected<int, int>>);
+// This type has one byte of tail padding where `std::expected` will put its
+// "has value" flag. The constructor will clobber all bytes including the
+// tail padding. With this type we can check that `std::expected` will set
+// its "has value" flag _after_ the value/error object is constructed.
+template <int c>
+struct tail_clobberer {
+ constexpr tail_clobberer() {
+ if (!std::is_constant_evaluated()) {
+ // This `memset` might actually be UB (?) but suffices to reproduce bugs
----------------
philnik777 wrote:
I think this should be fine. IIUC the type is allowed to overwrite padding bytes during construction.
https://github.com/llvm/llvm-project/pull/68733
More information about the libcxx-commits
mailing list