brintos

brintos / llvm-project-archived public Read only

0
0
Text · 999 B · d47a39a Raw
35 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-unknown-linux -DSANITIZER_ENABLED -fsanitize=address -fsanitize-address-field-padding=1 %s2// RUN: %clang_cc1 -triple x86_64-unknown-linux %s3 4struct S {5  ~S() {}6  virtual void foo() {}7 8  int buffer[1];9  int other_field = 0;10};11 12union U {13  S s;14};15 16struct Derived : S {};17 18static_assert(!__is_trivially_copyable(S));19#ifdef SANITIZER_ENABLED20// Don't allow memcpy when the struct has poisoned padding bits.21// The sanitizer adds posion padding bits to struct S.22static_assert(sizeof(S) > 16);23static_assert(!__is_bitwise_cloneable(S));24static_assert(sizeof(U) == sizeof(S)); // no padding bit for U.25static_assert(!__is_bitwise_cloneable(U));26static_assert(!__is_bitwise_cloneable(S[2]));27static_assert(!__is_bitwise_cloneable(Derived));28#else29static_assert(sizeof(S) == 16);30static_assert(__is_bitwise_cloneable(S));31static_assert(__is_bitwise_cloneable(U));32static_assert(__is_bitwise_cloneable(S[2]));33static_assert(__is_bitwise_cloneable(Derived));34#endif35