// RUN: %clang_cc1 -std=c++20 -Wunsafe-buffer-usage \ // RUN: -fsafe-buffer-usage-suggestions -verify %s [[clang::unsafe_buffer_usage]] void deprecatedFunction3(); void deprecatedFunction4(int z); void someFunction(); [[clang::unsafe_buffer_usage]] void overloading(int* x); void overloading(char c[]); void overloading(int* x, int size); [[clang::unsafe_buffer_usage]] void deprecatedFunction4(int z); void caller(int z, int* x, int size, char c[]) { deprecatedFunction3(); // expected-warning{{function introduces unsafe buffer manipulation}} deprecatedFunction4(z); // expected-warning{{function introduces unsafe buffer manipulation}} someFunction(); overloading(x); // expected-warning{{function introduces unsafe buffer manipulation}} overloading(x, size); overloading(c); } [[clang::unsafe_buffer_usage]] void overloading(char c[]); // Test variadics [[clang::unsafe_buffer_usage]] void testVariadics(int *ptr, ...); template [[clang::unsafe_buffer_usage]] T adder(T first, Args... args); template void foo(T t) {} template<> [[clang::unsafe_buffer_usage]] void foo(int *t) {} void caller1(int *p, int *q) { testVariadics(p, q); // expected-warning{{function introduces unsafe buffer manipulation}} adder(p, q); // expected-warning{{function introduces unsafe buffer manipulation}} int x; foo(x); foo(&x); // expected-warning{{function introduces unsafe buffer manipulation}} } // Test virtual functions class BaseClass { public: [[clang::unsafe_buffer_usage]] virtual void func() {} virtual void func1() {} }; class DerivedClass : public BaseClass { public: void func() {} [[clang::unsafe_buffer_usage]] void func1() {} }; void testInheritance() { DerivedClass DC; DC.func(); DC.func1(); // expected-warning{{function introduces unsafe buffer manipulation}} BaseClass *BC; BC->func(); // expected-warning{{function introduces unsafe buffer manipulation}} BC->func1(); BC = &DC; BC->func(); // expected-warning{{function introduces unsafe buffer manipulation}} BC->func1(); }