88 lines
2.1 KiB
C++
88 lines
2.1 KiB
C++
|
// 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<typename T, typename... Args>
|
||
|
[[clang::unsafe_buffer_usage]]
|
||
|
T adder(T first, Args... args);
|
||
|
|
||
|
template <typename T>
|
||
|
void foo(T t) {}
|
||
|
|
||
|
template<>
|
||
|
[[clang::unsafe_buffer_usage]]
|
||
|
void foo<int *>(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();
|
||
|
}
|