From: Paul Floyd Date: Fri, 25 Aug 2023 20:11:27 +0000 (+0200) Subject: Bug 473677 - make check compile failure with Clang 16 based on GCC 13.x X-Git-Tag: VALGRIND_3_22_0~117 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=566b39a46f273710857938f66672213a4617beeb;p=thirdparty%2Fvalgrind.git Bug 473677 - make check compile failure with Clang 16 based on GCC 13.x --- diff --git a/NEWS b/NEWS index 2ce35472dd..63d86bf51d 100644 --- a/NEWS +++ b/NEWS @@ -51,6 +51,7 @@ are not entered into bugzilla tend to get forgotten about or ignored. 472219 Syscall param ppoll(ufds.events) points to uninitialised byte(s) 472963 Broken regular expression in configure.ac 473604 Fix bug472219.c compile failure with Clang 16 +473677 make check compile failure with Clang 16 based on GCC 13.x To see details of a given bug, visit https://bugs.kde.org/show_bug.cgi?id=XXXXXX diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index 307f47bd8e..e7e0d78e45 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -586,6 +586,11 @@ sized_aligned_new_delete_args_SOURCES = sized_aligned_new_delete_args.cpp sized_aligned_new_delete_args_CXXFLAGS = ${AM_CXXFLAGS} -std=c++17 sized_aligned_new_delete_misaligned_SOURCES = sized_aligned_new_delete_misaligned.cpp sized_aligned_new_delete_misaligned_CXXFLAGS = ${AM_CXXFLAGS} -std=c++17 +if COMPILER_IS_CLANG +cxx17_aligned_new_CXXFLAGS += -fsized-deallocation +sized_aligned_new_delete_args_CXXFLAGS += -fsized-deallocation +sized_aligned_new_delete_misaligned_CXXFLAGS += -fsized-deallocation +endif endif demangle_SOURCES = demangle.cpp diff --git a/memcheck/tests/cxx17_aligned_new.cpp b/memcheck/tests/cxx17_aligned_new.cpp index 1a7ac3c299..91d4d6535a 100644 --- a/memcheck/tests/cxx17_aligned_new.cpp +++ b/memcheck/tests/cxx17_aligned_new.cpp @@ -1,3 +1,12 @@ +// See +// https://en.cppreference.com/w/cpp/memory/new/operator_new +// and +// https://en.cppreference.com/w/cpp/memory/new/operator_delete + +// Some of these are only used in very special circumstances +// so rather then using new and delete expressions most calls +// here directly call the operators + #include #include #include @@ -13,44 +22,63 @@ public: }; int main() { - // unsized versions - MyClass* myClass = new MyClass; + // THROWING + // plain versions + // cppreference new number 1 + OrdinaryClass* oClass = new OrdinaryClass(); + // cppreference delete number 1 + operator delete(oClass); + + // cppreference new number 2 + OrdinaryClass* oClass5 = new OrdinaryClass[5]; + // cppreference delete number 2 + operator delete[](oClass5); + + // aligned versions + // cppreference new number 3 + MyClass* myClass = new MyClass(); + // cppreference delete number 3 operator delete(myClass, std::align_val_t(64U)); + // cppreference new number 4 MyClass* myClass5 = new MyClass[5]; - operator delete [](myClass5, std::align_val_t(64U)); + // cppreference delete number 4 + operator delete[](myClass5, std::align_val_t(64U)); // sized versions + oClass = new OrdinaryClass(); + // cppreference delete number 5 + operator delete(oClass, sizeof(OrdinaryClass)); + + oClass5 = new OrdinaryClass[5]; + // cppreference delete number 6 + operator delete[](oClass5, sizeof(OrdinaryClass)*5); + + // sized aligned versions myClass = new MyClass(); - operator delete(myClass, 64U, std::align_val_t(64U)); + // cppreference delete number 7 + operator delete(myClass, sizeof(*myClass), std::align_val_t(64U)); myClass5 = new MyClass[5]; - operator delete [](myClass5, 320U, std::align_val_t(64U)); + // cppreference delete number 8 + operator delete [](myClass5, sizeof(*myClass)*5, std::align_val_t(64U)); - MyClass* myClassNt = new (std::nothrow) MyClass; - operator delete(myClassNt, std::align_val_t(64U)); + // NOTHROW - MyClass* myClass5Nt = new (std::nothrow) MyClass[5]; - operator delete [](myClass5Nt, std::align_val_t(64U)); + // cppreference new number 5 + oClass = new (std::nothrow) OrdinaryClass; + delete oClass; - myClassNt = new (std::nothrow) MyClass; - operator delete(myClassNt, sizeof(MyClass), std::align_val_t(64U)); + // cppreference new number 6 + oClass5 = new (std::nothrow) OrdinaryClass[5]; + delete [] oClass5; - myClass5Nt = new (std::nothrow) MyClass[5]; - operator delete [](myClass5Nt, sizeof(MyClass)*5, std::align_val_t(64U)); + // cppreference new number 7 + myClass = new (std::nothrow) MyClass; + delete myClass; - OrdinaryClass* oClass = new OrdinaryClass; - // this is a limitation, VG does not use enough bits - // to tell apart aligned and unaligned allocations - // so new/aligned delete is not a mismatch - operator delete(oClass, std::align_val_t(64U)); - oClass = new (std::nothrow) OrdinaryClass; - //delete oClass; - // changed the above delete because GCC generates - // a sized delete (???) whilst clang generates an ordinary delete - operator delete(oClass); - oClass = new OrdinaryClass[5]; - delete [] oClass; - oClass = new (std::nothrow) OrdinaryClass[5]; - delete [] oClass; + // cppreference new number 8 + myClass5 = new (std::nothrow) MyClass[5]; + delete [] myClass5; } + diff --git a/memcheck/tests/cxx17_aligned_new.stderr.exp b/memcheck/tests/cxx17_aligned_new.stderr.exp index cf52836c69..389bebf747 100644 --- a/memcheck/tests/cxx17_aligned_new.stderr.exp +++ b/memcheck/tests/cxx17_aligned_new.stderr.exp @@ -1,28 +1,28 @@ +_Znwm(4) = 0x........ +_ZdlPv(0x........) +_Znam(20) = 0x........ +_ZdaPv(0x........) _ZnwmSt11align_val_t(size 64, al 64) = 0x........ _ZdlPvSt11align_val_t(0x........) _ZnamSt11align_val_t(size 320, al 64) = 0x........ _ZdaPvSt11align_val_t(0x........) +_Znwm(4) = 0x........ +_ZdlPvm(0x........) +_Znam(20) = 0x........ +_ZdaPvm(0x........) _ZnwmSt11align_val_t(size 64, al 64) = 0x........ _ZdlPvmSt11align_val_t(0x........) _ZnamSt11align_val_t(size 320, al 64) = 0x........ _ZdaPvmSt11align_val_t(0x........) -_ZnwmSt11align_val_tRKSt9nothrow_t(size 64, al 64) = 0x........ -_ZdlPvSt11align_val_t(0x........) -_ZnamSt11align_val_tRKSt9nothrow_t(size 320, al 64) = 0x........ -_ZdaPvSt11align_val_t(0x........) -_ZnwmSt11align_val_tRKSt9nothrow_t(size 64, al 64) = 0x........ -_ZdlPvmSt11align_val_t(0x........) -_ZnamSt11align_val_tRKSt9nothrow_t(size 320, al 64) = 0x........ -_ZdaPvmSt11align_val_t(0x........) -_Znwm(4) = 0x........ -_ZdlPvSt11align_val_t(0x........) _ZnwmRKSt9nothrow_t(4) = 0x........ -_ZdlPv(0x........) -_Znam(20) = 0x........ -_ZdaPv(0x........) +_ZdlPvm(0x........) _ZnamRKSt9nothrow_t(20) = 0x........ _ZdaPv(0x........) +_ZnwmSt11align_val_tRKSt9nothrow_t(size 64, al 64) = 0x........ +_ZdlPvmSt11align_val_t(0x........) +_ZnamSt11align_val_tRKSt9nothrow_t(size 320, al 64) = 0x........ +_ZdaPvSt11align_val_t(0x........) HEAP SUMMARY: in use at exit: ... bytes in ... blocks diff --git a/memcheck/tests/cxx17_aligned_new.stderr.exp_32 b/memcheck/tests/cxx17_aligned_new.stderr.exp_32 index d40deebe81..c7239766b8 100644 --- a/memcheck/tests/cxx17_aligned_new.stderr.exp_32 +++ b/memcheck/tests/cxx17_aligned_new.stderr.exp_32 @@ -1,28 +1,28 @@ -_Znwj(64) = 0x........ -_ZdlPvSt11align_val_t(0x........) -_Znaj(320) = 0x........ -_ZdaPvSt11align_val_t(0x........) -_Znwj(64) = 0x........ -_ZdlPvjSt11align_val_t(0x........) -_Znaj(320) = 0x........ -_ZdaPvjSt11align_val_t(0x........) -_ZnwjRKSt9nothrow_t(64) = 0x........ +_Znwj(4) = 0x........ +_ZdlPv(0x........) +_Znaj(20) = 0x........ +_ZdaPv(0x........) +_ZnwjSt11align_val_t(size 64, al 64) = 0x........ _ZdlPvSt11align_val_t(0x........) -_ZnajRKSt9nothrow_t(320) = 0x........ +_ZnajSt11align_val_t(size 320, al 64) = 0x........ _ZdaPvSt11align_val_t(0x........) -_ZnwjRKSt9nothrow_t(64) = 0x........ +_Znwj(4) = 0x........ +_ZdlPvj(0x........) +_Znaj(20) = 0x........ +_ZdaPvj(0x........) +_ZnwjSt11align_val_t(size 64, al 64) = 0x........ _ZdlPvjSt11align_val_t(0x........) -_ZnajRKSt9nothrow_t(320) = 0x........ +_ZnajSt11align_val_t(size 320, al 64) = 0x........ _ZdaPvjSt11align_val_t(0x........) -_Znwj(4) = 0x........ -_ZdlPvSt11align_val_t(0x........) _ZnwjRKSt9nothrow_t(4) = 0x........ -_ZdlPv(0x........) -_Znaj(20) = 0x........ -_ZdaPv(0x........) +_ZdlPvj(0x........) _ZnajRKSt9nothrow_t(20) = 0x........ _ZdaPv(0x........) +_ZnwjSt11align_val_tRKSt9nothrow_t(size 64, al 64) = 0x........ +_ZdlPvjSt11align_val_t(0x........) +_ZnajSt11align_val_tRKSt9nothrow_t(size 320, al 64) = 0x........ +_ZdaPvSt11align_val_t(0x........) HEAP SUMMARY: in use at exit: ... bytes in ... blocks