1 // RUN: %clang_cc1 -std=c++20 -Wunsafe-buffer-usage \ 2 // RUN: -fsafe-buffer-usage-suggestions \ 3 // RUN: -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s 4 5 void bar(int * param) {} 6 7 void foo1a() { 8 int *r = new int[7]; 9 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> r" 10 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" 11 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 7}" 12 int *p = new int[4]; 13 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> p" 14 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" 15 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 4}" 16 p = r; 17 int tmp = p[9]; 18 int *q; 19 q = r; 20 } 21 22 void uuc_if_body() { 23 int *r = new int[7]; 24 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> r" 25 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" 26 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 7}" 27 int *p = new int[4]; 28 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> p" 29 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" 30 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 4}" 31 if (true) 32 p = r; 33 p[5] = 4; 34 } 35 36 void uuc_if_body1(bool flag) { 37 int *r = new int[7]; 38 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> r" 39 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" 40 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 7}" 41 int *p = new int[4]; 42 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> p" 43 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{" 44 // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:22-[[@LINE-3]]:22}:", 4}" 45 if (flag) { 46 p = r; 47 } 48 p[5] = 4; 49 } 50 51 void uuc_if_cond_no_unsafe_op() { 52 int *r = new int[7]; 53 int *p = new int[4]; 54 if ((p = r)) { 55 int x = 0; 56 } 57 } 58 59 void uuc_if_cond_unsafe_op() { 60 int *r = new int[7]; 61 int *p = new int[4]; //expected-warning{{'p' is an unsafe pointer used for buffer access}} 62 if ((p = r)) { 63 p[3] = 2; // expected-note{{used in buffer access here}} 64 } 65 } 66 67 void uuc_if_cond_unsafe_op1() { 68 int *r = new int[7]; // expected-warning{{'r' is an unsafe pointer used for buffer access}} 69 int *p = new int[4]; 70 if ((p = r)) { 71 r[3] = 2; // expected-note{{used in buffer access here}} 72 } 73 } 74 75 void uuc_if_cond_unsafe_op2() { 76 int *r = new int[7]; // expected-warning{{'r' is an unsafe pointer used for buffer access}} 77 int *p = new int[4]; // expected-warning{{'p' is an unsafe pointer used for buffer access}} 78 if ((p = r)) { 79 r[3] = 2; // expected-note{{used in buffer access here}} 80 } 81 p[4] = 6; // expected-note{{used in buffer access here}} 82 } 83 84 void uuc_call1() { 85 int *w = new int[4]; // expected-warning{{'w' is an unsafe pointer used for buffer access}} 86 int *y = new int[4]; 87 bar(w = y); 88 w[5] = 0; // expected-note{{used in buffer access here}} 89 } 90