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 <sguel...@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@+2{{first argument in call to 'memcpy' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}} + // expected-note@+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 <sguel...@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 <sguel...@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@+2{{first argument in call to 'memcpy' is a pointer to non-trivially copyable type 'NonTriviallyCopyable'}} - // expected-note@+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)); -} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits