[clang] 041b7f5 - [Wunsafe-buffer-usage] Turn off unsafe-buffer warning for methods annotated with clang::unsafe_buffer_usage attribute (#125671)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 25 09:39:30 PST 2025
Author: Malavika Samak
Date: 2025-02-25T23:09:26+05:30
New Revision: 041b7f508533417bcda4feaa03d6c16ff85275f5
URL: https://github.com/llvm/llvm-project/commit/041b7f508533417bcda4feaa03d6c16ff85275f5
DIFF: https://github.com/llvm/llvm-project/commit/041b7f508533417bcda4feaa03d6c16ff85275f5.diff
LOG: [Wunsafe-buffer-usage] Turn off unsafe-buffer warning for methods annotated with clang::unsafe_buffer_usage attribute (#125671)
Unsafe operation in methods that are already annotated with
clang::unsafe_buffer_usage attribute, should not trigger a warning. This
is because, the developer has already identified the method as unsafe
and warning at every unsafe operation is redundant.
rdar://138644831
---------
Co-authored-by: MalavikaSamak <malavika2 at apple.com>
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/AnalysisBasedWarnings.cpp
clang/test/SemaCXX/warn-unsafe-buffer-usage-function-attr.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 657340c170503..3a0eab66fd584 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -124,6 +124,8 @@ Removed Compiler Flags
Attribute Changes in Clang
--------------------------
+Adding [[clang::unsafe_buffer_usage]] attribute to a method definition now turns off all -Wunsafe-buffer-usage
+related warnings within the method body.
- The ``no_sanitize`` attribute now accepts both ``gnu`` and ``clang`` names.
- Clang now diagnoses use of declaration attributes on void parameters. (#GH108819)
diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp
index f21e571e6e0ce..afdc0eaab0a40 100644
--- a/clang/lib/Sema/AnalysisBasedWarnings.cpp
+++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp
@@ -2566,6 +2566,9 @@ void clang::sema::AnalysisBasedWarnings::IssueWarnings(
// The Callback function that performs analyses:
auto CallAnalyzers = [&](const Decl *Node) -> void {
+ if (Node->hasAttr<UnsafeBufferUsageAttr>())
+ return;
+
// Perform unsafe buffer usage analysis:
if (!Diags.isIgnored(diag::warn_unsafe_buffer_operation,
Node->getBeginLoc()) ||
diff --git a/clang/test/SemaCXX/warn-unsafe-buffer-usage-function-attr.cpp b/clang/test/SemaCXX/warn-unsafe-buffer-usage-function-attr.cpp
index 724d444638b57..f3abe87928400 100644
--- a/clang/test/SemaCXX/warn-unsafe-buffer-usage-function-attr.cpp
+++ b/clang/test/SemaCXX/warn-unsafe-buffer-usage-function-attr.cpp
@@ -119,16 +119,15 @@ struct HoldsUnsafeMembers {
[[clang::unsafe_buffer_usage]]
HoldsUnsafeMembers(int i)
- : FromCtor(i), // expected-warning{{function introduces unsafe buffer manipulation}}
- FromCtor2{i} // expected-warning{{function introduces unsafe buffer manipulation}}
- {}
+ : FromCtor(i),
+ FromCtor2{i} {}
HoldsUnsafeMembers(float f)
: HoldsUnsafeMembers(0) {} // expected-warning{{function introduces unsafe buffer manipulation}}
UnsafeMembers FromCtor;
UnsafeMembers FromCtor2;
- UnsafeMembers FromField{3}; // expected-warning 2{{function introduces unsafe buffer manipulation}}
+ UnsafeMembers FromField{3}; // expected-warning {{function introduces unsafe buffer manipulation}}
};
struct SubclassUnsafeMembers : public UnsafeMembers {
@@ -138,8 +137,7 @@ struct SubclassUnsafeMembers : public UnsafeMembers {
[[clang::unsafe_buffer_usage]]
SubclassUnsafeMembers(int i)
- : UnsafeMembers(i) // expected-warning{{function introduces unsafe buffer manipulation}}
- {}
+ : UnsafeMembers(i){}
};
// https://github.com/llvm/llvm-project/issues/80482
@@ -245,3 +243,68 @@ struct AggregateViaDefaultInit {
void testAggregateViaDefaultInit() {
AggregateViaDefaultInit A;
};
+
+struct A {
+ int arr[2];
+
+ [[clang::unsafe_buffer_usage]]
+ int *ptr;
+};
+
+namespace std{
+ template <typename T> class span {
+
+ T *elements;
+
+ public:
+
+ constexpr span(T *, unsigned){}
+
+ template<class Begin, class End>
+ constexpr span(Begin first, End last){}
+
+ constexpr T* data() const noexcept {
+ return elements;
+ }
+ };
+}
+
+[[clang::unsafe_buffer_usage]]
+void check_no_warnings(unsigned idx) {
+ int *arr = new int[20];
+
+ int k = arr[idx]; // no-warning
+
+ std::span<int> sp = {arr, 20}; // no-warning
+ A *ptr = reinterpret_cast<A*> (sp.data()); // no-warning
+ A a;
+ a.ptr = arr; // no-warning
+}
+
+[[clang::unsafe_buffer_usage]]
+void check_no_warning_variadic(unsigned idx, int arr[20], ...) {
+ int k = arr[idx]; // no-warning
+
+ std::span<int> sp = {arr, 20}; // no-warning
+ A *ptr = reinterpret_cast<A*> (sp.data()); // no-warning
+ A a;
+ a.ptr = arr; // no-warning
+}
+
+template<typename T>
+[[clang::unsafe_buffer_usage]]
+void check_no_warnings_template(unsigned idx, T* arr) {
+ int k = arr[idx]; // no-warning
+
+ std::span<int> sp = {arr, 20}; // no-warning
+ A *ptr = reinterpret_cast<A*> (sp.data()); // no-warning
+ A a;
+ a.ptr = arr; // no-warning
+}
+
+void invoke_methods() {
+ int array[20];
+ check_no_warnings(30); //expected-warning{{function introduces unsafe buffer manipulation}}
+ check_no_warning_variadic(15, array); //expected-warning{{function introduces unsafe buffer manipulation}}
+ check_no_warnings_template(10, array); //expected-warning{{function introduces unsafe buffer manipulation}}
+}
More information about the cfe-commits
mailing list