// RUN: %clang_cc1 -std=c++20 -Wno-all -Wunsafe-buffer-usage \ // RUN: -fsafe-buffer-usage-suggestions -verify %s namespace localVar { void testRefersPtrLocalVarDecl(int i) { int * ptr; // expected-warning{{'ptr' is an unsafe pointer used for buffer access}} ptr + i; // expected-note{{used in pointer arithmetic here}} ptr[i]; // expected-note{{used in buffer access here}} } void testRefersArrayLocalVarDecl(int i) { int array[i]; // expected-warning{{'array' is an unsafe buffer that does not perform bounds}} array[i/2]; // expected-note{{used in buffer access here}} } } namespace globalVar { int * ptr; // expected-warning{{'ptr' is an unsafe pointer used for buffer access}} void testRefersPtrGlobalVarDecl(int i) { ptr + i; // expected-note{{used in pointer arithmetic here}} ptr[i]; // expected-note{{used in buffer access here}} } int array[10]; // expected-warning{{'array' is an unsafe buffer that does not perform bounds}} void testRefersArrayGlobalVarDecl(int i) { array[i/2]; // expected-note{{used in buffer access here}} } } namespace functionParm { void testRefersPtrParmVarDecl(int * ptr) { // expected-warning@-1{{'ptr' is an unsafe pointer used for buffer access}} ptr + 5; // expected-note{{used in pointer arithmetic here}} ptr[5]; // expected-note{{used in buffer access here}} } // FIXME: shall we explain the array to pointer decay to make the warning more understandable? void testRefersArrayParmVarDecl(int array[10]) { // expected-warning@-1{{'array' is an unsafe pointer used for buffer access}} array[2]; // expected-note{{used in buffer access here}} } } namespace structField { struct Struct1 { int * ptr; // FIXME: per-declaration warning aggregated at the struct definition? }; void testRefersPtrStructFieldDecl(int i) { Struct1 s1; s1.ptr + i; // expected-warning{{unsafe pointer arithmetic}} s1.ptr[i]; // expected-warning{{unsafe buffer access}} } struct Struct2 { int array[10]; // FIXME: per-declaration warning aggregated at the struct definition? }; void testRefersArrayStructFieldDecl(int i) { Struct2 s2; s2.array[i/2]; // expected-warning{{unsafe buffer access}} } } namespace structFieldFromMethod { struct Struct1 { int * ptr; // FIXME: per-declaration warning aggregated at the struct definition void testRefersPtrStructFieldDecl(int i) { ptr + i; // expected-warning{{unsafe pointer arithmetic}} ptr[i]; // expected-warning{{unsafe buffer access}} } }; struct Struct2 { int array[10]; // FIXME: per-declaration warning aggregated at the struct definition void testRefersArrayStructFieldDecl(int i) { Struct2 s2; s2.array[i/2]; // expected-warning{{unsafe buffer access}} } }; } namespace staticStructField { struct Struct1 { static int * ptr; // expected-warning{{'ptr' is an unsafe pointer used for buffer access}} }; void testRefersPtrStructFieldDecl(int i) { Struct1::ptr + i; // expected-note{{used in pointer arithmetic here}} Struct1::ptr[i]; // expected-note{{used in buffer access here}} } struct Struct2 { static int array[10]; // expected-warning{{'array' is an unsafe buffer that does not perform bounds}} }; void testRefersArrayStructFieldDecl(int i) { Struct2::array[i/2]; // expected-note{{used in buffer access here}} } } int * return_ptr(); void testNoDeclRef(int i) { return_ptr() + i; // expected-warning{{unsafe pointer arithmetic}} return_ptr()[i]; // expected-warning{{unsafe buffer access}} }