]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Bug 473677 - make check compile failure with Clang 16 based on GCC 13.x
authorPaul Floyd <pjfloyd@wanadoo.fr>
Fri, 25 Aug 2023 20:11:27 +0000 (22:11 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Fri, 25 Aug 2023 20:11:27 +0000 (22:11 +0200)
NEWS
memcheck/tests/Makefile.am
memcheck/tests/cxx17_aligned_new.cpp
memcheck/tests/cxx17_aligned_new.stderr.exp
memcheck/tests/cxx17_aligned_new.stderr.exp_32

diff --git a/NEWS b/NEWS
index 2ce35472dd0e576895f8abeccf883b5f202b3ab1..63d86bf51de0d820527878727891f016e1378d1e 100644 (file)
--- 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
index 307f47bd8e39a165852d058ac8314b7ee595798e..e7e0d78e45f467fb896f535e2e29337ad54d87cb 100644 (file)
@@ -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
index 1a7ac3c29927cb61757cce1c1fcec66c8b99d015..91d4d6535afe43d9dd5a5c519b5c3f8544ac72ae 100644 (file)
@@ -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 <cstdlib>
 #include <new>
 #include <iostream>
@@ -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;
 }
+
index cf52836c693f7e067dd9efb0682da8577b0c90ab..389bebf74729f3d2f56a1adbdc94d48e9c2d39bf 100644 (file)
@@ -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
index d40deebe817df13491267af2cae98217063f011f..c7239766b83781d6273975c33889213e143de6c0 100644 (file)
@@ -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