mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 19:06:44 +00:00
[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@apple.com>
This commit is contained in:
parent
24b7759a9d
commit
041b7f5085
@ -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)
|
||||
|
@ -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()) ||
|
||||
|
@ -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}}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user