xref: /llvm-project/clang/test/SemaCXX/warn-unsafe-buffer-usage-fixits-deref-simple-ptr-arith.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 \
4b7bdf199SArtem Dergachev // RUN:            -fsyntax-only %s 2>&1 | FileCheck %s
56a0f2e53Sziqingluo-90 
66a0f2e53Sziqingluo-90 // TODO test we don't mess up vertical whitespace
76a0f2e53Sziqingluo-90 // TODO test different whitespaces
86a0f2e53Sziqingluo-90 // TODO test different contexts
96a0f2e53Sziqingluo-90   // when it's on the right side
106a0f2e53Sziqingluo-90 
basic()116a0f2e53Sziqingluo-90 void basic() {
126a0f2e53Sziqingluo-90   int *ptr;
13*fde4b80cSjkorous-apple // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
146a0f2e53Sziqingluo-90   *(ptr+5)=1;
1587b8c85bSRashmi Mudduluru // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:5}:""
1687b8c85bSRashmi Mudduluru // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:8-[[@LINE-2]]:9}:"["
1787b8c85bSRashmi Mudduluru // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:10-[[@LINE-3]]:11}:"]"
186a0f2e53Sziqingluo-90 }
196a0f2e53Sziqingluo-90 
206a0f2e53Sziqingluo-90 // The weird preceding semicolon ensures that we preserve that range intact.
char_ranges()216a0f2e53Sziqingluo-90 void char_ranges() {
226a0f2e53Sziqingluo-90   int *p;
23*fde4b80cSjkorous-apple   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
246a0f2e53Sziqingluo-90 
256a0f2e53Sziqingluo-90   ;* ( p + 5 ) = 1;
2687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:8}:""
2787b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:9-[[@LINE-2]]:12}:"["
2887b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:13-[[@LINE-3]]:15}:"]"
296a0f2e53Sziqingluo-90 
306a0f2e53Sziqingluo-90   ;*   (p+5)= 1;
3187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:9}:""
3287b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:11}:"["
3387b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:13}:"]"
346a0f2e53Sziqingluo-90 
356a0f2e53Sziqingluo-90   ;*(   p+5)= 1;
3687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:9}:""
3787b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:11}:"["
3887b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:13}:"]"
396a0f2e53Sziqingluo-90 
406a0f2e53Sziqingluo-90   ;*(   p+5)= 1;
4187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:9}:""
4287b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:11}:"["
4387b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:13}:"]"
446a0f2e53Sziqingluo-90 
456a0f2e53Sziqingluo-90   ;*( p   +5)= 1;
4687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:7}:""
4787b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:8-[[@LINE-2]]:12}:"["
4887b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:13-[[@LINE-3]]:14}:"]"
496a0f2e53Sziqingluo-90 
506a0f2e53Sziqingluo-90   ;*(p+   5)= 1;
5187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
5287b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:7-[[@LINE-2]]:11}:"["
5387b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:13}:"]"
546a0f2e53Sziqingluo-90 
556a0f2e53Sziqingluo-90   ;*(p+ 5   )= 1;
5687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
5787b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:7-[[@LINE-2]]:9}:"["
5887b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:10-[[@LINE-3]]:14}:"]"
596a0f2e53Sziqingluo-90 
606a0f2e53Sziqingluo-90   ;*(p+ 5)   = 1;
6187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
6287b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:7-[[@LINE-2]]:9}:"["
6387b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:10-[[@LINE-3]]:11}:"]"
646a0f2e53Sziqingluo-90 
656a0f2e53Sziqingluo-90   ;   *(p+5)= 1;
6687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:9}:""
6787b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:11}:"["
6887b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:12-[[@LINE-3]]:13}:"]"
696a0f2e53Sziqingluo-90 
706a0f2e53Sziqingluo-90   ;*(p+123456)= 1;
7187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
7287b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:7-[[@LINE-2]]:8}:"["
7387b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:14-[[@LINE-3]]:15}:"]"
746a0f2e53Sziqingluo-90 
756a0f2e53Sziqingluo-90   ;*   (p+123456)= 1;
7687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:9}:""
7787b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:11}:"["
7887b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:17-[[@LINE-3]]:18}:"]"
796a0f2e53Sziqingluo-90 
806a0f2e53Sziqingluo-90   ;*(   p+123456)= 1;
8187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:9}:""
8287b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:11}:"["
8387b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:17-[[@LINE-3]]:18}:"]"
846a0f2e53Sziqingluo-90 
856a0f2e53Sziqingluo-90   ;*(   p+123456)= 1;
8687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:9}:""
8787b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:11}:"["
8887b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:17-[[@LINE-3]]:18}:"]"
896a0f2e53Sziqingluo-90 
906a0f2e53Sziqingluo-90   ;*(p   +123456)= 1;
9187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
9287b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:7-[[@LINE-2]]:11}:"["
9387b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:17-[[@LINE-3]]:18}:"]"
946a0f2e53Sziqingluo-90 
956a0f2e53Sziqingluo-90   ;*(p+   123456)= 1;
9687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
9787b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:7-[[@LINE-2]]:11}:"["
9887b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:17-[[@LINE-3]]:18}:"]"
996a0f2e53Sziqingluo-90 
1006a0f2e53Sziqingluo-90   ;*(p+123456   )= 1;
10187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
10287b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:7-[[@LINE-2]]:8}:"["
10387b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:14-[[@LINE-3]]:18}:"]"
1046a0f2e53Sziqingluo-90 
1056a0f2e53Sziqingluo-90   ;*(p+123456)   = 1;
10687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
10787b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:7-[[@LINE-2]]:8}:"["
10887b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:14-[[@LINE-3]]:15}:"]"
1096a0f2e53Sziqingluo-90 
1106a0f2e53Sziqingluo-90   int *ptrrrrrr;
111*fde4b80cSjkorous-apple   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:"std::span<int> "
1126a0f2e53Sziqingluo-90 
1136a0f2e53Sziqingluo-90   ;* ( ptrrrrrr + 123456 )= 1;
11487b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:8}:""
11587b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:16-[[@LINE-2]]:19}:"["
11687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:25-[[@LINE-3]]:27}:"]"
1176a0f2e53Sziqingluo-90 
1186a0f2e53Sziqingluo-90   ;*   (ptrrrrrr+123456)= 1;
11987b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:9}:""
12087b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:17-[[@LINE-2]]:18}:"["
12187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:24-[[@LINE-3]]:25}:"]"
1226a0f2e53Sziqingluo-90 
1236a0f2e53Sziqingluo-90   ;*(   ptrrrrrr+123456)= 1;
12487b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:9}:""
12587b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:17-[[@LINE-2]]:18}:"["
12687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:24-[[@LINE-3]]:25}:"]"
1276a0f2e53Sziqingluo-90 
1286a0f2e53Sziqingluo-90   ;*(   ptrrrrrr+123456)= 1;
12987b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:9}:""
13087b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:17-[[@LINE-2]]:18}:"["
13187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:24-[[@LINE-3]]:25}:"]"
1326a0f2e53Sziqingluo-90 
1336a0f2e53Sziqingluo-90   ;*(ptrrrrrr   +123456)= 1;
13487b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
13587b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:14-[[@LINE-2]]:18}:"["
13687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:24-[[@LINE-3]]:25}:"]"
1376a0f2e53Sziqingluo-90 
1386a0f2e53Sziqingluo-90   ;*(ptrrrrrr+   123456)= 1;
13987b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
14087b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:14-[[@LINE-2]]:18}:"["
14187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:24-[[@LINE-3]]:25}:"]"
1426a0f2e53Sziqingluo-90 
1436a0f2e53Sziqingluo-90   ;*(ptrrrrrr+123456   )= 1;
14487b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
14587b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:14-[[@LINE-2]]:15}:"["
14687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:21-[[@LINE-3]]:25}:"]"
1476a0f2e53Sziqingluo-90 
1486a0f2e53Sziqingluo-90   ;*(ptrrrrrr+123456)   = 1;
14987b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:4-[[@LINE-1]]:6}:""
15087b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:14-[[@LINE-2]]:15}:"["
15187b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:21-[[@LINE-3]]:22}:"]"
1526a0f2e53Sziqingluo-90 }
1536a0f2e53Sziqingluo-90 
base_on_rhs()1546a0f2e53Sziqingluo-90 void base_on_rhs() {
1556a0f2e53Sziqingluo-90   int* ptr;
1566a0f2e53Sziqingluo-90   *(10 + ptr) = 1;
15787b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:5}:""
15887b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:7-[[@LINE-2]]:10}:"["
15987b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:13-[[@LINE-3]]:14}:"]"
1606a0f2e53Sziqingluo-90 }
1616a0f2e53Sziqingluo-90 
many_parens()1626a0f2e53Sziqingluo-90 void many_parens() {
1636a0f2e53Sziqingluo-90   int* ptr;
1646a0f2e53Sziqingluo-90   *(( (10 + ptr)) ) = 1;
16587b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:8}:""
16687b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:10-[[@LINE-2]]:13}:"["
16787b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:16-[[@LINE-3]]:20}:"]"
1686a0f2e53Sziqingluo-90 }
1696a0f2e53Sziqingluo-90 
lvaue_to_rvalue()1706a0f2e53Sziqingluo-90 void lvaue_to_rvalue() {
1716a0f2e53Sziqingluo-90   int * ptr;
1726a0f2e53Sziqingluo-90   int tmp = *(ptr + 10);
17387b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:13-[[@LINE-1]]:15}:""
17487b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-2]]:18-[[@LINE-2]]:21}:"["
17587b8c85bSRashmi Mudduluru   // CHECK: fix-it:"{{.*}}":{[[@LINE-3]]:23-[[@LINE-3]]:24}:"]"
1766a0f2e53Sziqingluo-90 }
1776a0f2e53Sziqingluo-90 
1786a0f2e53Sziqingluo-90 // Fixits emitted for the cases below would be incorrect.
1796a0f2e53Sziqingluo-90 // CHECK-NOT: fix-it:
1806a0f2e53Sziqingluo-90 // Array subsctipt opertor of std::span accepts unsigned integer.
negative()1816a0f2e53Sziqingluo-90 void negative() {
1826a0f2e53Sziqingluo-90   int* ptr;
1836a0f2e53Sziqingluo-90   *(ptr + -5) = 1; // skip
1846a0f2e53Sziqingluo-90 }
1856a0f2e53Sziqingluo-90 
subtraction()1866a0f2e53Sziqingluo-90 void subtraction() {
1876a0f2e53Sziqingluo-90   int* ptr;
1886a0f2e53Sziqingluo-90   *(ptr - 5) = 1; // skip
1896a0f2e53Sziqingluo-90 }
1906a0f2e53Sziqingluo-90 
subtraction_of_negative()1916a0f2e53Sziqingluo-90 void subtraction_of_negative() {
1926a0f2e53Sziqingluo-90   int* ptr;
1936a0f2e53Sziqingluo-90   *(ptr - -5) = 1; // FIXME: implement fixit (uncommon case - low priority)
1946a0f2e53Sziqingluo-90 }
1956a0f2e53Sziqingluo-90 
1966a0f2e53Sziqingluo-90 
bindingDecl(int * p,int * q)1976a0f2e53Sziqingluo-90 void bindingDecl(int *p, int *q) {
1986a0f2e53Sziqingluo-90   int * a[2] = {p, q};
1996a0f2e53Sziqingluo-90   auto [x, y] = a;
2006a0f2e53Sziqingluo-90 
2016a0f2e53Sziqingluo-90   *(x + 1) = 1; // FIXME: deal with `BindingDecl`s
2026a0f2e53Sziqingluo-90 }
203