xref: /llvm-project/clang/test/SemaCXX/warn-unsafe-buffer-usage-multi-decl-uuc-fixits.cpp (revision 171dfc5462a23b7e8ace31f4d9206b972b38ffbc)
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