xref: /llvm-project/clang/test/SemaCXX/warn-unsafe-buffer-usage-fixits-pointer-access.cpp (revision fde4b80cb772897a8cf0b3d022f3041e10b6e816)
1b7bdf199SArtem Dergachev // RUN: %clang_cc1 -std=c++20 -Wunsafe-buffer-usage \
2b7bdf199SArtem Dergachev // RUN:            -fsafe-buffer-usage-suggestions \
3b7bdf199SArtem Dergachev // RUN:            -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
4a046d187SMalavikaSamak 
foo(int * v)5a046d187SMalavikaSamak void foo(int* v) {
6a046d187SMalavikaSamak }
7a046d187SMalavikaSamak 
m1(int * v1,int * v2,int)8a046d187SMalavikaSamak void m1(int* v1, int* v2, int) {
9a046d187SMalavikaSamak 
10a046d187SMalavikaSamak }
11a046d187SMalavikaSamak 
condition_check_nullptr()12a046d187SMalavikaSamak void condition_check_nullptr() {
133a67b912SZiqing Luo   int* p = new int[10];
14*fde4b80cSjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:7}:"std::span<int>"
15a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
16a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}"
17a046d187SMalavikaSamak 
18a046d187SMalavikaSamak   int tmp = p[5];
19a046d187SMalavikaSamak   if(p != nullptr) {}
20a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:".data()"
21a046d187SMalavikaSamak }
22a046d187SMalavikaSamak 
condition_check()23a046d187SMalavikaSamak void condition_check() {
243a67b912SZiqing Luo   int* p = new int[10];
25*fde4b80cSjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:7}:"std::span<int>"
26a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
27a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}"
28a046d187SMalavikaSamak 
29a046d187SMalavikaSamak   auto q = new int[10];
30a046d187SMalavikaSamak 
31a046d187SMalavikaSamak   int tmp = p[5];
32a046d187SMalavikaSamak   if(p == q) {}
33a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:".data()"
34a046d187SMalavikaSamak 
35a046d187SMalavikaSamak   if(q != p){}
36a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:12-[[@LINE-1]]:12}:".data()"
37a046d187SMalavikaSamak 
38a046d187SMalavikaSamak   if(p < q) {}
39a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:".data()"
40a046d187SMalavikaSamak 
41a046d187SMalavikaSamak   if(p <= q) {}
42a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:".data()"
43a046d187SMalavikaSamak 
44a046d187SMalavikaSamak   if(p > q) {}
45a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:".data()"
46a046d187SMalavikaSamak 
47a046d187SMalavikaSamak   if(p >= q) {}
48a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:".data()"
49a046d187SMalavikaSamak 
50a046d187SMalavikaSamak   if( p == q && p != nullptr) {}
51a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:8-[[@LINE-1]]:8}:".data()"
52a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:18-[[@LINE-2]]:18}:".data()"
53a046d187SMalavikaSamak }
54a046d187SMalavikaSamak 
condition_check_two_usafe_buffers()55a046d187SMalavikaSamak void condition_check_two_usafe_buffers() {
563a67b912SZiqing Luo   int* p = new int[10];
57*fde4b80cSjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:7}:"std::span<int>"
58a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
59a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}"
60a046d187SMalavikaSamak 
613a67b912SZiqing Luo   int* q = new int[10];
62*fde4b80cSjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:7}:"std::span<int>"
63a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
64a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}"
65a046d187SMalavikaSamak 
66a046d187SMalavikaSamak   int tmp = p[5];
67a046d187SMalavikaSamak   tmp = q[5];
68a046d187SMalavikaSamak 
69a046d187SMalavikaSamak   if(p == q) {}
70a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:".data()"
71a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:".data()"
72a046d187SMalavikaSamak }
73a046d187SMalavikaSamak 
unsafe_method_invocation_single_param()74a046d187SMalavikaSamak void unsafe_method_invocation_single_param() {
753a67b912SZiqing Luo   int* p = new int[10];
76*fde4b80cSjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:7}:"std::span<int>"
77a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
78a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}"
79a046d187SMalavikaSamak 
80a046d187SMalavikaSamak   int tmp = p[5];
81a046d187SMalavikaSamak   foo(p);
82a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:8-[[@LINE-1]]:8}:".data()"
83a046d187SMalavikaSamak 
84a046d187SMalavikaSamak }
85a046d187SMalavikaSamak 
unsafe_method_invocation_single_param_array(int idx)869a1e6373Sjkorous-apple void unsafe_method_invocation_single_param_array(int idx) {
87e06f3522Sjkorous-apple   int p[32];
88e06f3522Sjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:12}:"std::array<int, 32> p"
89e06f3522Sjkorous-apple 
909a1e6373Sjkorous-apple   int tmp = p[idx];
91e06f3522Sjkorous-apple   foo(p);
92e06f3522Sjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:8-[[@LINE-1]]:8}:".data()"
93e06f3522Sjkorous-apple }
94e06f3522Sjkorous-apple 
safe_method_invocation_single_param()95a046d187SMalavikaSamak void safe_method_invocation_single_param() {
963a67b912SZiqing Luo   int* p = new int[10];
9786cd2fbdSjkorous-apple   // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:{{.*}}-[[@LINE-1]]:{{.*}}}
98a046d187SMalavikaSamak   foo(p);
99a046d187SMalavikaSamak }
100a046d187SMalavikaSamak 
safe_method_invocation_single_param_array()101e06f3522Sjkorous-apple void safe_method_invocation_single_param_array() {
102e06f3522Sjkorous-apple   int p[10];
103e06f3522Sjkorous-apple   foo(p);
104e06f3522Sjkorous-apple   // CHECK-NO: fix-it:"{{.*}}":{[[@LINE-1]]:{{.*}}-[[@LINE-1]]:{{.*}}}:".data()"
105e06f3522Sjkorous-apple }
106e06f3522Sjkorous-apple 
unsafe_method_invocation_double_param()107a046d187SMalavikaSamak void unsafe_method_invocation_double_param() {
1083a67b912SZiqing Luo   int* p = new int[10];
109*fde4b80cSjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:7}:"std::span<int>"
110a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
111a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}"
112a046d187SMalavikaSamak 
113a046d187SMalavikaSamak   int tmp = p[5];
114a046d187SMalavikaSamak   m1(p, p, 10);
115a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:".data()"
116a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:10}:".data()"
117a046d187SMalavikaSamak 
118a046d187SMalavikaSamak   auto q = new int[10];
119a046d187SMalavikaSamak 
120a046d187SMalavikaSamak   m1(p, q, 4);
121a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:".data()"
122a046d187SMalavikaSamak 
123a046d187SMalavikaSamak   m1(q, p, 9);
124a046d187SMalavikaSamak   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:10}:".data()"
125a046d187SMalavikaSamak 
126a046d187SMalavikaSamak   m1(q, q, 8);
127a046d187SMalavikaSamak }
128a046d187SMalavikaSamak 
unsafe_method_invocation_double_param_array(int idx)1299a1e6373Sjkorous-apple void unsafe_method_invocation_double_param_array(int idx) {
130e06f3522Sjkorous-apple   int p[14];
131e06f3522Sjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:12}:"std::array<int, 14> p"
132e06f3522Sjkorous-apple 
133e06f3522Sjkorous-apple   int q[40];
134e06f3522Sjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:12}:"std::array<int, 40> q"
135e06f3522Sjkorous-apple 
1369a1e6373Sjkorous-apple   q[idx] = p[idx];
137e06f3522Sjkorous-apple 
138e06f3522Sjkorous-apple   m1(p, p, 10);
139e06f3522Sjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:7}:".data()"
140e06f3522Sjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:10}:".data()"
141e06f3522Sjkorous-apple }
142e06f3522Sjkorous-apple 
unsafe_access_in_lamda()14327c10337SRashmi Mudduluru void unsafe_access_in_lamda() {
1443a67b912SZiqing Luo   int* p = new int[10];
145*fde4b80cSjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:7}:"std::span<int>"
14627c10337SRashmi Mudduluru   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
14727c10337SRashmi Mudduluru   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}"
14827c10337SRashmi Mudduluru 
14927c10337SRashmi Mudduluru   auto my_lambda = [&](){
15027c10337SRashmi Mudduluru     p[5] = 10;
15127c10337SRashmi Mudduluru   };
15227c10337SRashmi Mudduluru 
15327c10337SRashmi Mudduluru   foo(p);
15427c10337SRashmi Mudduluru   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:8-[[@LINE-1]]:8}:".data()"
15527c10337SRashmi Mudduluru }
15627c10337SRashmi Mudduluru 
fixits_in_lamda()15727c10337SRashmi Mudduluru void fixits_in_lamda() {
1583a67b912SZiqing Luo   int* p = new int[10];
159*fde4b80cSjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:7}:"std::span<int>"
16027c10337SRashmi Mudduluru   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
16127c10337SRashmi Mudduluru   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}"
16227c10337SRashmi Mudduluru 
16327c10337SRashmi Mudduluru   auto my_lambda = [&](){
16427c10337SRashmi Mudduluru     foo(p);
16527c10337SRashmi Mudduluru     // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:10}:".data()"
16627c10337SRashmi Mudduluru   };
16727c10337SRashmi Mudduluru 
16827c10337SRashmi Mudduluru   p[5] = 10;
16927c10337SRashmi Mudduluru }
17027c10337SRashmi Mudduluru 
17127c10337SRashmi Mudduluru // FIXME: Emit fixits for lambda captured variables
fixits_in_lambda_capture()17227c10337SRashmi Mudduluru void fixits_in_lambda_capture() {
17327c10337SRashmi Mudduluru   auto p = new int[10];
17427c10337SRashmi Mudduluru   // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> p"
17527c10337SRashmi Mudduluru   // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
17627c10337SRashmi Mudduluru   // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}"
17727c10337SRashmi Mudduluru 
17827c10337SRashmi Mudduluru   auto my_lambda = [p](){ // No fixits emitted here.
17927c10337SRashmi Mudduluru     foo(p);
18027c10337SRashmi Mudduluru   };
18127c10337SRashmi Mudduluru 
18227c10337SRashmi Mudduluru   p[5] = 10;
18327c10337SRashmi Mudduluru }
18427c10337SRashmi Mudduluru 
fixits_in_lambda_capture_reference()18527c10337SRashmi Mudduluru void fixits_in_lambda_capture_reference() {
18627c10337SRashmi Mudduluru   auto p = new int[10];
18727c10337SRashmi Mudduluru   // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> p"
18827c10337SRashmi Mudduluru   // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
18927c10337SRashmi Mudduluru   // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}"
19027c10337SRashmi Mudduluru 
19127c10337SRashmi Mudduluru   auto my_lambda = [&p](){ // No fixits emitted here.
19227c10337SRashmi Mudduluru     foo(p);
19327c10337SRashmi Mudduluru   };
19427c10337SRashmi Mudduluru 
19527c10337SRashmi Mudduluru   p[5] = 10;
19627c10337SRashmi Mudduluru }
19727c10337SRashmi Mudduluru 
fixits_in_lambda_capture_rename()19827c10337SRashmi Mudduluru void fixits_in_lambda_capture_rename() {
19927c10337SRashmi Mudduluru   auto p = new int[10];
20027c10337SRashmi Mudduluru   // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:11}:"std::span<int> p"
20127c10337SRashmi Mudduluru   // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-2]]:12-[[@LINE-2]]:12}:"{"
20227c10337SRashmi Mudduluru   // CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:23}:", 10}"
20327c10337SRashmi Mudduluru 
20427c10337SRashmi Mudduluru   auto my_lambda = [x = p](){ // No fixits emitted here.
20527c10337SRashmi Mudduluru     foo(x);
20627c10337SRashmi Mudduluru   };
20727c10337SRashmi Mudduluru 
20827c10337SRashmi Mudduluru   p[5] = 10;
20927c10337SRashmi Mudduluru }
210e06f3522Sjkorous-apple 
ptr_comparison(int * ptr,unsigned idx)211e06f3522Sjkorous-apple bool ptr_comparison(int* ptr, unsigned idx) {
212e06f3522Sjkorous-apple   int arr[10];
213e06f3522Sjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:14}:"std::array<int, 10> arr"
214e06f3522Sjkorous-apple   arr[idx] = idx;
215e06f3522Sjkorous-apple 
216e06f3522Sjkorous-apple   return arr > ptr;
217e06f3522Sjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:13-[[@LINE-1]]:13}:".data()"
218e06f3522Sjkorous-apple }
219e06f3522Sjkorous-apple 
ptr_distance(int * ptr,unsigned idx)220e06f3522Sjkorous-apple int long long ptr_distance(int* ptr, unsigned idx) {
221e06f3522Sjkorous-apple   int arr[10];
222e06f3522Sjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:14}:"std::array<int, 10> arr"
223e06f3522Sjkorous-apple   arr[idx] = idx;
224e06f3522Sjkorous-apple 
225e06f3522Sjkorous-apple   int long long dist = arr - ptr;
226e06f3522Sjkorous-apple   // CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:27-[[@LINE-1]]:27}:".data()"
227e06f3522Sjkorous-apple   return dist;
228e06f3522Sjkorous-apple }
229