[clang] [clang] Move warning about memset/memcpy to NonTriviallyCopyable type… (PR #117387)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 28 05:15:31 PST 2024
https://github.com/serge-sans-paille updated https://github.com/llvm/llvm-project/pull/117387
>From fda70bc5aeabe33fc578fbb2f55bc805a3304059 Mon Sep 17 00:00:00 2001
From: serge-sans-paille <sguelton at mozilla.com>
Date: Fri, 22 Nov 2024 22:38:23 +0100
Subject: [PATCH 1/3] [clang] Move warning about memset/memcpy to
NonTriviallyCopyable types to its own flag
Namely -Wnontrivial-memcall, implied by -Wnontricial-memaccess
This is a followup to #111434
---
clang/docs/ReleaseNotes.rst | 2 +-
clang/include/clang/Basic/DiagnosticGroups.td | 6 +++--
.../clang/Basic/DiagnosticSemaKinds.td | 2 +-
clang/test/SemaCXX/warn-memcall.cpp | 27 +++++++++++++++++++
4 files changed, 33 insertions(+), 4 deletions(-)
create mode 100644 clang/test/SemaCXX/warn-memcall.cpp
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 8bd06fadfdc984..80b521001bbd2f 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -404,7 +404,7 @@ Modified Compiler Flags
to utilize these vector libraries. The behavior for all other vector function
libraries remains unchanged.
-- The ``-Wnontrivial-memaccess`` warning has been updated to also warn about
+- The ``-Wnontrivial-memcall`` warning has been updated to also warn about
passing non-trivially-copyable destrination parameter to ``memcpy``,
``memset`` and similar functions for which it is a documented undefined
behavior.
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td
index df9bf94b5d0398..e20c3f8bbb26a5 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -683,11 +683,13 @@ def SizeofArrayDecay : DiagGroup<"sizeof-array-decay">;
def SizeofPointerMemaccess : DiagGroup<"sizeof-pointer-memaccess">;
def MemsetTransposedArgs : DiagGroup<"memset-transposed-args">;
def DynamicClassMemaccess : DiagGroup<"dynamic-class-memaccess">;
-def NonTrivialMemaccess : DiagGroup<"nontrivial-memaccess">;
+def NonTrivialMemcall : DiagGroup<"nontrivial-memcall">;
+def NonTrivialMemaccess : DiagGroup<"nontrivial-memaccess", [NonTrivialMemcall]>;
def SuspiciousBzero : DiagGroup<"suspicious-bzero">;
def SuspiciousMemaccess : DiagGroup<"suspicious-memaccess",
[SizeofPointerMemaccess, DynamicClassMemaccess,
- NonTrivialMemaccess, MemsetTransposedArgs, SuspiciousBzero]>;
+ NonTrivialMemaccess, NonTrivialMemcall, MemsetTransposedArgs,
+ SuspiciousBzero]>;
def StaticInInline : DiagGroup<"static-in-inline">;
def StaticLocalInInline : DiagGroup<"static-local-in-inline">;
def GNUStaticFloatInit : DiagGroup<"gnu-static-float-init">;
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index eb05a6a77978af..cc35c2c58baad0 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -798,7 +798,7 @@ def warn_cstruct_memaccess : Warning<
def warn_cxxstruct_memaccess : Warning<
"first argument in call to "
"%0 is a pointer to non-trivially copyable type %1">,
- InGroup<NonTrivialMemaccess>;
+ InGroup<NonTrivialMemcall>;
def note_nontrivial_field : Note<
"field is non-trivial to %select{copy|default-initialize}0">;
def err_non_trivial_c_union_in_invalid_context : Error<
diff --git a/clang/test/SemaCXX/warn-memcall.cpp b/clang/test/SemaCXX/warn-memcall.cpp
new file mode 100644
index 00000000000000..fbc9f25a5f65bc
--- /dev/null
+++ b/clang/test/SemaCXX/warn-memcall.cpp
@@ -0,0 +1,27 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wnontrivial-memcall %s
+
+extern "C" void *memcpy(void *s1, const void *s2, unsigned n);
+
+class TriviallyCopyable {};
+class NonTriviallyCopyable { NonTriviallyCopyable(const NonTriviallyCopyable&);};
+struct Incomplete;
+
+void test_memcpy(TriviallyCopyable* tc0, TriviallyCopyable* tc1,
+ NonTriviallyCopyable *ntc0, NonTriviallyCopyable *ntc1,
+ Incomplete *i0, Incomplete *i1) {
+ // OK
+ memcpy(tc0, tc1, sizeof(*tc0));
+
+ // OK
+ memcpy(i0, i1, 10);
+
+ // expected-warning at +2{{first argument in call to 'memcpy' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}}
+ // expected-note at +1{{explicitly cast the pointer to silence this warning}}
+ memcpy(ntc0, ntc1, sizeof(*ntc0));
+
+ // ~ OK
+ memcpy((void*)ntc0, ntc1, sizeof(*ntc0));
+
+ // OK
+ memcpy((void*)ntc0, (void*)ntc1, sizeof(*ntc0));
+}
>From a9b2bbbb0af616710782beedacdc3ac61d68dfa7 Mon Sep 17 00:00:00 2001
From: serge-sans-paille <sguelton at mozilla.com>
Date: Wed, 27 Nov 2024 15:48:05 +0100
Subject: [PATCH 2/3] fixup! [clang] Move warning about memset/memcpy to
NonTriviallyCopyable types to its own flag
---
clang/docs/ReleaseNotes.rst | 4 ++--
clang/include/clang/Basic/DiagnosticGroups.td | 3 +--
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 80b521001bbd2f..cee72f897a9778 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -404,10 +404,10 @@ Modified Compiler Flags
to utilize these vector libraries. The behavior for all other vector function
libraries remains unchanged.
-- The ``-Wnontrivial-memcall`` warning has been updated to also warn about
+- The ``-Wnontrivial-memcall`` warning has been added to warn about
passing non-trivially-copyable destrination parameter to ``memcpy``,
``memset`` and similar functions for which it is a documented undefined
- behavior.
+ behavior. It is implied by ``-Wnontrivial-memaccess``
Removed Compiler Flags
-------------------------
diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td
index e20c3f8bbb26a5..bb37e142b3bcb7 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -688,8 +688,7 @@ def NonTrivialMemaccess : DiagGroup<"nontrivial-memaccess", [NonTrivialMemcall]>
def SuspiciousBzero : DiagGroup<"suspicious-bzero">;
def SuspiciousMemaccess : DiagGroup<"suspicious-memaccess",
[SizeofPointerMemaccess, DynamicClassMemaccess,
- NonTrivialMemaccess, NonTrivialMemcall, MemsetTransposedArgs,
- SuspiciousBzero]>;
+ NonTrivialMemaccess, MemsetTransposedArgs, SuspiciousBzero]>;
def StaticInInline : DiagGroup<"static-in-inline">;
def StaticLocalInInline : DiagGroup<"static-local-in-inline">;
def GNUStaticFloatInit : DiagGroup<"gnu-static-float-init">;
>From 08613f45ffc5be7a158240b264f1b02b9042ffe3 Mon Sep 17 00:00:00 2001
From: serge-sans-paille <sguelton at mozilla.com>
Date: Thu, 28 Nov 2024 14:14:12 +0100
Subject: [PATCH 3/3] fixup! [clang] Move warning about memset/memcpy to
NonTriviallyCopyable types to its own flag
---
clang/test/SemaCXX/warn-memaccess.cpp | 2 +-
clang/test/SemaCXX/warn-memcall.cpp | 27 ---------------------------
2 files changed, 1 insertion(+), 28 deletions(-)
delete mode 100644 clang/test/SemaCXX/warn-memcall.cpp
diff --git a/clang/test/SemaCXX/warn-memaccess.cpp b/clang/test/SemaCXX/warn-memaccess.cpp
index 070b44891a91aa..2e60539b3e48ef 100644
--- a/clang/test/SemaCXX/warn-memaccess.cpp
+++ b/clang/test/SemaCXX/warn-memaccess.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wnontrivial-memaccess %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wnontrivial-memcall %s
extern "C" void *bzero(void *, unsigned);
extern "C" void *memset(void *, int, unsigned);
diff --git a/clang/test/SemaCXX/warn-memcall.cpp b/clang/test/SemaCXX/warn-memcall.cpp
deleted file mode 100644
index fbc9f25a5f65bc..00000000000000
--- a/clang/test/SemaCXX/warn-memcall.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wnontrivial-memcall %s
-
-extern "C" void *memcpy(void *s1, const void *s2, unsigned n);
-
-class TriviallyCopyable {};
-class NonTriviallyCopyable { NonTriviallyCopyable(const NonTriviallyCopyable&);};
-struct Incomplete;
-
-void test_memcpy(TriviallyCopyable* tc0, TriviallyCopyable* tc1,
- NonTriviallyCopyable *ntc0, NonTriviallyCopyable *ntc1,
- Incomplete *i0, Incomplete *i1) {
- // OK
- memcpy(tc0, tc1, sizeof(*tc0));
-
- // OK
- memcpy(i0, i1, 10);
-
- // expected-warning at +2{{first argument in call to 'memcpy' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}}
- // expected-note at +1{{explicitly cast the pointer to silence this warning}}
- memcpy(ntc0, ntc1, sizeof(*ntc0));
-
- // ~ OK
- memcpy((void*)ntc0, ntc1, sizeof(*ntc0));
-
- // OK
- memcpy((void*)ntc0, (void*)ntc1, sizeof(*ntc0));
-}
More information about the cfe-commits
mailing list