| // RUN: %clang_cc1 -std=c++20 -Wno-everything -Wunsafe-buffer-usage \ |
| // RUN: -fsafe-buffer-usage-suggestions \ |
| // RUN: -verify %s |
| |
| // CHECK-NOT: [-Wunsafe-buffer-usage] |
| |
| |
| void foo(unsigned idx) { |
| int buffer[10]; // expected-warning{{'buffer' is an unsafe buffer that does not perform bounds checks}} |
| // expected-note@-1{{change type of 'buffer' to 'std::array' to label it for hardening}} |
| buffer[idx] = 0; // expected-note{{used in buffer access here}} |
| } |
| |
| int global_buffer[10]; // expected-warning{{'global_buffer' is an unsafe buffer that does not perform bounds checks}} |
| void foo2(unsigned idx) { |
| global_buffer[idx] = 0; // expected-note{{used in buffer access here}} |
| } |
| |
| struct Foo { |
| int member_buffer[10]; |
| }; |
| void foo2(Foo& f, unsigned idx) { |
| f.member_buffer[idx] = 0; // expected-warning{{unsafe buffer access}} |
| } |
| |
| void constant_idx_safe(unsigned idx) { |
| int buffer[10]; |
| buffer[9] = 0; |
| } |
| |
| void constant_idx_safe0(unsigned idx) { |
| int buffer[10]; |
| buffer[0] = 0; |
| } |
| |
| void constant_idx_unsafe(unsigned idx) { |
| int buffer[10]; // expected-warning{{'buffer' is an unsafe buffer that does not perform bounds checks}} |
| // expected-note@-1{{change type of 'buffer' to 'std::array' to label it for hardening}} |
| buffer[10] = 0; // expected-note{{used in buffer access here}} |
| } |