1267ad430SZoltán Porkoláb // RUN: %check_clang_tidy %s bugprone-sizeof-expression %t
2267ad430SZoltán Porkoláb 
3267ad430SZoltán Porkoláb #define offsetof(type, member) __builtin_offsetof(type, member)
4267ad430SZoltán Porkoláb 
5267ad430SZoltán Porkoláb typedef __SIZE_TYPE__ size_t;
6267ad430SZoltán Porkoláb typedef __WCHAR_TYPE__ wchar_t;
7267ad430SZoltán Porkoláb 
8267ad430SZoltán Porkoláb extern void *memset(void *Dest, int Ch, size_t Count);
9267ad430SZoltán Porkoláb extern size_t strlen(const char *Str);
10267ad430SZoltán Porkoláb extern size_t wcslen(const wchar_t *Str);
11267ad430SZoltán Porkoláb extern char *strcpy(char *Dest, const char *Src);
12267ad430SZoltán Porkoláb extern wchar_t *wcscpy(wchar_t *Dest, const wchar_t *Src);
13267ad430SZoltán Porkoláb extern int scanf(const char *Format, ...);
14267ad430SZoltán Porkoláb extern int wscanf(const wchar_t *Format, ...);
15267ad430SZoltán Porkoláb 
16267ad430SZoltán Porkoláb extern void sink(const void *P);
17267ad430SZoltán Porkoláb 
18267ad430SZoltán Porkoláb enum { BufferSize = 1024 };
19267ad430SZoltán Porkoláb 
20267ad430SZoltán Porkoláb void bad1a(void) {
21267ad430SZoltán Porkoláb   int Buffer[BufferSize];
22267ad430SZoltán Porkoláb 
23267ad430SZoltán Porkoláb   int *P = &Buffer[0];
24267ad430SZoltán Porkoláb   int *Q = P;
25267ad430SZoltán Porkoláb   while (Q < P + sizeof(Buffer)) {
26267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: suspicious usage of 'sizeof(...)' in pointer arithmetic; this scaled value will be scaled again by the '+' operator [bugprone-sizeof-expression]
27267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-2]]:16: note: '+' in pointer arithmetic internally scales with 'sizeof(int)' == {{[0-9]+}}
28267ad430SZoltán Porkoláb     *Q++ = 0;
29267ad430SZoltán Porkoláb   }
30267ad430SZoltán Porkoláb }
31267ad430SZoltán Porkoláb 
32267ad430SZoltán Porkoláb void bad1b(void) {
33267ad430SZoltán Porkoláb   typedef int Integer;
34267ad430SZoltán Porkoláb   Integer Buffer[BufferSize];
35267ad430SZoltán Porkoláb 
36267ad430SZoltán Porkoláb   Integer *P = &Buffer[0];
37267ad430SZoltán Porkoláb   Integer *Q = P;
38267ad430SZoltán Porkoláb   while (Q < P + sizeof(Buffer)) {
39267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: suspicious usage of 'sizeof(...)' in pointer arithmetic; this scaled value will be scaled again by the '+' operator
40267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-2]]:16: note: '+' in pointer arithmetic internally scales with 'sizeof(Integer)' == {{[0-9]+}}
41267ad430SZoltán Porkoláb     *Q++ = 0;
42267ad430SZoltán Porkoláb   }
43267ad430SZoltán Porkoláb }
44267ad430SZoltán Porkoláb 
45267ad430SZoltán Porkoláb void good1(void) {
46267ad430SZoltán Porkoláb   int Buffer[BufferSize];
47267ad430SZoltán Porkoláb 
48267ad430SZoltán Porkoláb   int *P = &Buffer[0];
49267ad430SZoltán Porkoláb   int *Q = P;
50267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
51267ad430SZoltán Porkoláb     *Q++ = 0;
52267ad430SZoltán Porkoláb   }
53267ad430SZoltán Porkoláb }
54267ad430SZoltán Porkoláb 
55267ad430SZoltán Porkoláb void bad2(void) {
56267ad430SZoltán Porkoláb   int Buffer[BufferSize];
57267ad430SZoltán Porkoláb   int *P = Buffer;
58267ad430SZoltán Porkoláb 
59267ad430SZoltán Porkoláb   while (P < Buffer + sizeof(Buffer)) {
60267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: suspicious usage of 'sizeof(...)' in pointer arithmetic; this scaled value will be scaled again by the '+' operator
61267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-2]]:21: note: '+' in pointer arithmetic internally scales with 'sizeof(int)' == {{[0-9]+}}
62267ad430SZoltán Porkoláb     *P++ = 0;
63267ad430SZoltán Porkoláb   }
64267ad430SZoltán Porkoláb }
65267ad430SZoltán Porkoláb 
66267ad430SZoltán Porkoláb void good2(void) {
67267ad430SZoltán Porkoláb   int Buffer[BufferSize];
68267ad430SZoltán Porkoláb   int *P = Buffer;
69267ad430SZoltán Porkoláb 
70267ad430SZoltán Porkoláb   while (P < Buffer + BufferSize) {
71267ad430SZoltán Porkoláb     *P++ = 0;
72267ad430SZoltán Porkoláb   }
73267ad430SZoltán Porkoláb }
74267ad430SZoltán Porkoláb 
75267ad430SZoltán Porkoláb struct S {
76267ad430SZoltán Porkoláb   long A, B, C;
77267ad430SZoltán Porkoláb };
78267ad430SZoltán Porkoláb 
79267ad430SZoltán Porkoláb void bad3a(struct S *S) {
80267ad430SZoltán Porkoláb   const size_t Offset = offsetof(struct S, B);
81267ad430SZoltán Porkoláb   struct S *P = S;
82267ad430SZoltán Porkoláb 
83267ad430SZoltán Porkoláb   // This is not captureable by Tidy because the size/offset expression is
84267ad430SZoltán Porkoláb   // not a direct child of the pointer arithmetics.
85267ad430SZoltán Porkoláb   memset(P + Offset, 0, sizeof(struct S) - Offset);
86267ad430SZoltán Porkoláb }
87267ad430SZoltán Porkoláb 
88267ad430SZoltán Porkoláb void good3a(struct S *S) {
89267ad430SZoltán Porkoláb   const size_t Offset = offsetof(struct S, B);
90267ad430SZoltán Porkoláb   char *P = (char*)S;
91267ad430SZoltán Porkoláb 
92267ad430SZoltán Porkoláb   // This is not captureable by Tidy because the size/offset expression is
93267ad430SZoltán Porkoláb   // not a direct child of the pointer arithmetics.
94267ad430SZoltán Porkoláb   memset(P + Offset, 0, sizeof(struct S) - Offset);
95267ad430SZoltán Porkoláb }
96267ad430SZoltán Porkoláb 
97267ad430SZoltán Porkoláb void bad3b(struct S *S) {
98267ad430SZoltán Porkoláb   memset(S + offsetof(struct S, B), 0,
99267ad430SZoltán Porkoláb          sizeof(struct S) - offsetof(struct S, B));
100267ad430SZoltán Porkoláb   // CHECK-MESSAGES: :[[@LINE-2]]:12: warning: suspicious usage of 'offsetof(...)' in pointer arithmetic; this scaled value will be scaled again by the '+' operator
101267ad430SZoltán Porkoláb   // CHECK-MESSAGES: :[[@LINE-3]]:12: note: '+' in pointer arithmetic internally scales with 'sizeof(struct S)' == {{[0-9]+}}
102267ad430SZoltán Porkoláb }
103267ad430SZoltán Porkoláb 
104267ad430SZoltán Porkoláb void good3b(struct S *S) {
105267ad430SZoltán Porkoláb   char *P = (char*)S;
106267ad430SZoltán Porkoláb   memset(P + offsetof(struct S, B), 0,
107267ad430SZoltán Porkoláb          sizeof(struct S) - offsetof(struct S, B));
108267ad430SZoltán Porkoláb }
109267ad430SZoltán Porkoláb 
110267ad430SZoltán Porkoláb void bad3c(void) {
111267ad430SZoltán Porkoláb   struct S Buffer[BufferSize];
112267ad430SZoltán Porkoláb 
113267ad430SZoltán Porkoláb   struct S *P = &Buffer[0];
114267ad430SZoltán Porkoláb   struct S *Q = P;
115267ad430SZoltán Porkoláb   while (Q < P + sizeof(Buffer)) {
116267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: suspicious usage of 'sizeof(...)' in pointer arithmetic; this scaled value will be scaled again by the '+' operator
117267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-2]]:16: note: '+' in pointer arithmetic internally scales with 'sizeof(struct S)' == {{[0-9]+}}
118267ad430SZoltán Porkoláb     sink(Q++);
119267ad430SZoltán Porkoláb   }
120267ad430SZoltán Porkoláb }
121267ad430SZoltán Porkoláb 
122267ad430SZoltán Porkoláb void bad4(void) {
123267ad430SZoltán Porkoláb   int Buffer[BufferSize];
124267ad430SZoltán Porkoláb 
125267ad430SZoltán Porkoláb   int *P = &Buffer[0];
126267ad430SZoltán Porkoláb   int *Q = P;
127267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
128267ad430SZoltán Porkoláb     *Q = 0;
129267ad430SZoltán Porkoláb     Q += sizeof(*Q);
130267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: suspicious usage of 'sizeof(...)' in pointer arithmetic; this scaled value will be scaled again by the '+=' operator
131267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-2]]:7: note: '+=' in pointer arithmetic internally scales with 'sizeof(int)' == {{[0-9]+}}
132267ad430SZoltán Porkoláb   }
133267ad430SZoltán Porkoláb }
134267ad430SZoltán Porkoláb 
135267ad430SZoltán Porkoláb void silenced4(void) {
136267ad430SZoltán Porkoláb   char Buffer[BufferSize];
137267ad430SZoltán Porkoláb 
138267ad430SZoltán Porkoláb   char *P = &Buffer[0];
139267ad430SZoltán Porkoláb   char *Q = P;
140267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
141267ad430SZoltán Porkoláb     *Q = 0;
142267ad430SZoltán Porkoláb     Q += sizeof(*Q);
143267ad430SZoltán Porkoláb   }
144267ad430SZoltán Porkoláb }
145267ad430SZoltán Porkoláb 
146267ad430SZoltán Porkoláb void good4(void) {
147267ad430SZoltán Porkoláb   char Buffer[BufferSize];
148267ad430SZoltán Porkoláb 
149267ad430SZoltán Porkoláb   char *P = &Buffer[0];
150267ad430SZoltán Porkoláb   char *Q = P;
151267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
152267ad430SZoltán Porkoláb     *Q = 0;
153267ad430SZoltán Porkoláb     Q += 1;
154267ad430SZoltán Porkoláb   }
155267ad430SZoltán Porkoláb }
156267ad430SZoltán Porkoláb 
157267ad430SZoltán Porkoláb void good5aa(void) {
158267ad430SZoltán Porkoláb   int Buffer[BufferSize];
159267ad430SZoltán Porkoláb 
160267ad430SZoltán Porkoláb   int *P = &Buffer[0];
161267ad430SZoltán Porkoláb   int *Q = P;
162267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
163267ad430SZoltán Porkoláb     *Q = 0;
164267ad430SZoltán Porkoláb     Q += ( sizeof(Buffer) / sizeof(Buffer[0]) );
165267ad430SZoltán Porkoláb   }
166267ad430SZoltán Porkoláb }
167267ad430SZoltán Porkoláb 
168267ad430SZoltán Porkoláb void good5ab(void) {
169267ad430SZoltán Porkoláb   int Buffer[BufferSize];
170267ad430SZoltán Porkoláb 
171267ad430SZoltán Porkoláb   int *P = &Buffer[0];
172267ad430SZoltán Porkoláb   int *Q = P;
173267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
174267ad430SZoltán Porkoláb     *Q = 0;
175267ad430SZoltán Porkoláb     Q = Q + ( sizeof(Buffer) / sizeof(Buffer[0]) );
176267ad430SZoltán Porkoláb   }
177267ad430SZoltán Porkoláb }
178267ad430SZoltán Porkoláb 
179267ad430SZoltán Porkoláb void good5ba(void) {
180267ad430SZoltán Porkoláb   int Buffer[BufferSize];
181267ad430SZoltán Porkoláb 
182267ad430SZoltán Porkoláb   int *P = &Buffer[0];
183267ad430SZoltán Porkoláb   int *Q = P;
184267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
185267ad430SZoltán Porkoláb     *Q = 0;
186267ad430SZoltán Porkoláb     Q -= ( sizeof(Buffer) / sizeof(Buffer[0]) );
187267ad430SZoltán Porkoláb   }
188267ad430SZoltán Porkoláb }
189267ad430SZoltán Porkoláb 
190267ad430SZoltán Porkoláb void good5bb(void) {
191267ad430SZoltán Porkoláb   int Buffer[BufferSize];
192267ad430SZoltán Porkoláb 
193267ad430SZoltán Porkoláb   int *P = &Buffer[0];
194267ad430SZoltán Porkoláb   int *Q = P;
195267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
196267ad430SZoltán Porkoláb     *Q = 0;
197267ad430SZoltán Porkoláb     Q = Q - ( sizeof(Buffer) / sizeof(Buffer[0]) );
198267ad430SZoltán Porkoláb   }
199267ad430SZoltán Porkoláb }
200267ad430SZoltán Porkoláb 
201267ad430SZoltán Porkoláb void bad6(void) {
202267ad430SZoltán Porkoláb   int Buffer[BufferSize];
203267ad430SZoltán Porkoláb 
204267ad430SZoltán Porkoláb   int *P = &Buffer[0];
205267ad430SZoltán Porkoláb   int *Q = P;
206267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
207267ad430SZoltán Porkoláb     *Q = 0;
208267ad430SZoltán Porkoláb     Q = Q + sizeof(*Q);
209267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: suspicious usage of 'sizeof(...)' in pointer arithmetic; this scaled value will be scaled again by the '+' operator
210267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-2]]:11: note: '+' in pointer arithmetic internally scales with 'sizeof(int)' == {{[0-9]+}}
211267ad430SZoltán Porkoláb   }
212267ad430SZoltán Porkoláb }
213267ad430SZoltán Porkoláb 
214267ad430SZoltán Porkoláb void silenced6(void) {
215267ad430SZoltán Porkoláb   char Buffer[BufferSize];
216267ad430SZoltán Porkoláb 
217267ad430SZoltán Porkoláb   char *P = &Buffer[0];
218267ad430SZoltán Porkoláb   char *Q = P;
219267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
220267ad430SZoltán Porkoláb     *Q = 0;
221267ad430SZoltán Porkoláb     Q = Q + sizeof(*Q);
222267ad430SZoltán Porkoláb   }
223267ad430SZoltán Porkoláb }
224267ad430SZoltán Porkoláb 
225267ad430SZoltán Porkoláb void good6(void) {
226267ad430SZoltán Porkoláb   char Buffer[BufferSize];
227267ad430SZoltán Porkoláb 
228267ad430SZoltán Porkoláb   char *P = &Buffer[0];
229267ad430SZoltán Porkoláb   char *Q = P;
230267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
231267ad430SZoltán Porkoláb     *Q = 0;
232267ad430SZoltán Porkoláb     Q = Q + 1;
233267ad430SZoltán Porkoláb   }
234267ad430SZoltán Porkoláb }
235267ad430SZoltán Porkoláb 
236267ad430SZoltán Porkoláb void silenced7(void) {
237267ad430SZoltán Porkoláb   char Buffer[BufferSize];
238267ad430SZoltán Porkoláb 
239267ad430SZoltán Porkoláb   char *P = &Buffer[0];
240267ad430SZoltán Porkoláb   const char *Q = P;
241267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
242267ad430SZoltán Porkoláb     sink(Q);
243267ad430SZoltán Porkoláb     Q = Q + sizeof(*Q);
244267ad430SZoltán Porkoláb   }
245267ad430SZoltán Porkoláb }
246267ad430SZoltán Porkoláb 
247267ad430SZoltán Porkoláb void good7(void) {
248267ad430SZoltán Porkoláb   char Buffer[BufferSize];
249267ad430SZoltán Porkoláb 
250267ad430SZoltán Porkoláb   char *P = &Buffer[0];
251267ad430SZoltán Porkoláb   const char *Q = P;
252267ad430SZoltán Porkoláb   while (Q < P + BufferSize) {
253267ad430SZoltán Porkoláb     sink(Q);
254267ad430SZoltán Porkoláb     Q = Q + 1;
255267ad430SZoltán Porkoláb   }
256267ad430SZoltán Porkoláb }
257267ad430SZoltán Porkoláb 
258267ad430SZoltán Porkoláb void bad8(void) {
259267ad430SZoltán Porkoláb   int Buffer[BufferSize];
260267ad430SZoltán Porkoláb 
261267ad430SZoltán Porkoláb   int *P = &Buffer[0];
262267ad430SZoltán Porkoláb   int *Q = P;
263267ad430SZoltán Porkoláb   while (Q >= P) {
264267ad430SZoltán Porkoláb     *Q = 0;
265267ad430SZoltán Porkoláb     Q = Q - sizeof(*Q);
266267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: suspicious usage of 'sizeof(...)' in pointer arithmetic; this scaled value will be scaled again by the '-' operator
267267ad430SZoltán Porkoláb     // CHECK-MESSAGES: :[[@LINE-2]]:11: note: '-' in pointer arithmetic internally scales with 'sizeof(int)' == {{[0-9]+}}
268267ad430SZoltán Porkoláb   }
269267ad430SZoltán Porkoláb }
270267ad430SZoltán Porkoláb 
271267ad430SZoltán Porkoláb void silenced8(void) {
272267ad430SZoltán Porkoláb   char Buffer[BufferSize];
273267ad430SZoltán Porkoláb 
274267ad430SZoltán Porkoláb   char *P = &Buffer[0];
275267ad430SZoltán Porkoláb   char *Q = P;
276267ad430SZoltán Porkoláb   while (Q >= P) {
277267ad430SZoltán Porkoláb     *Q = 0;
278267ad430SZoltán Porkoláb     Q = Q - sizeof(*Q);
279267ad430SZoltán Porkoláb   }
280267ad430SZoltán Porkoláb }
281267ad430SZoltán Porkoláb 
282267ad430SZoltán Porkoláb void good8(void) {
283267ad430SZoltán Porkoláb   char Buffer[BufferSize];
284267ad430SZoltán Porkoláb 
285267ad430SZoltán Porkoláb   char *P = &Buffer[0];
286267ad430SZoltán Porkoláb   char *Q = P;
287267ad430SZoltán Porkoláb   while (Q >= P) {
288267ad430SZoltán Porkoláb     *Q = 0;
289267ad430SZoltán Porkoláb     Q = Q - 1;
290267ad430SZoltán Porkoláb   }
291267ad430SZoltán Porkoláb }
292267ad430SZoltán Porkoláb 
293267ad430SZoltán Porkoláb void good9(void) {
294267ad430SZoltán Porkoláb   int Buffer[BufferSize];
295267ad430SZoltán Porkoláb 
296267ad430SZoltán Porkoláb   int *P = &Buffer[0];
297267ad430SZoltán Porkoláb   int *Q = P + BufferSize;
298267ad430SZoltán Porkoláb   int N = Q - P;
299267ad430SZoltán Porkoláb   while (N >= 0) {
300267ad430SZoltán Porkoláb     Q[N] = 0;
301267ad430SZoltán Porkoláb     N = N - 1;
302267ad430SZoltán Porkoláb   }
303267ad430SZoltán Porkoláb }
304267ad430SZoltán Porkoláb 
305267ad430SZoltán Porkoláb void good10(void) {
306267ad430SZoltán Porkoláb   int Buffer[BufferSize];
307267ad430SZoltán Porkoláb 
308267ad430SZoltán Porkoláb   int *P = &Buffer[0];
309267ad430SZoltán Porkoláb   int *Q = Buffer + BufferSize;
310267ad430SZoltán Porkoláb   int I = sizeof(*P) - sizeof(*Q);
311267ad430SZoltán Porkoláb 
312267ad430SZoltán Porkoláb   sink(&I);
313267ad430SZoltán Porkoláb }
314267ad430SZoltán Porkoláb 
315267ad430SZoltán Porkoláb void good11(void) {
316267ad430SZoltán Porkoláb   int Buffer[BufferSize];
317267ad430SZoltán Porkoláb 
318267ad430SZoltán Porkoláb   int *P = &Buffer[0];
319267ad430SZoltán Porkoláb   int *Q = Buffer + BufferSize;
320267ad430SZoltán Porkoláb   int I = sizeof(Q) - sizeof(*P);
321267ad430SZoltán Porkoláb 
322267ad430SZoltán Porkoláb   sink(&I);
323267ad430SZoltán Porkoláb }
324267ad430SZoltán Porkoláb 
325267ad430SZoltán Porkoláb void bad12(void) {
326267ad430SZoltán Porkoláb   wchar_t Message[BufferSize];
327267ad430SZoltán Porkoláb   wcscpy(Message, L"Message: ");
328267ad430SZoltán Porkoláb   wscanf(L"%s", Message + wcslen(Message) * sizeof(wchar_t));
329267ad430SZoltán Porkoláb   // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: suspicious usage of 'sizeof(...)' in pointer arithmetic; this scaled value will be scaled again by the '+' operator
330267ad430SZoltán Porkoláb   // CHECK-MESSAGES: :[[@LINE-2]]:25: note: '+' in pointer arithmetic internally scales with 'sizeof(wchar_t)' == {{[0-9]+}}
331267ad430SZoltán Porkoláb }
332267ad430SZoltán Porkoláb 
333267ad430SZoltán Porkoláb void silenced12(void) {
334267ad430SZoltán Porkoláb   char Message[BufferSize];
335267ad430SZoltán Porkoláb   strcpy(Message, "Message: ");
336267ad430SZoltán Porkoláb   scanf("%s", Message + strlen(Message) * sizeof(char));
337267ad430SZoltán Porkoláb }
338267ad430SZoltán Porkoláb 
339267ad430SZoltán Porkoláb void nomatch12(void) {
340267ad430SZoltán Porkoláb   char Message[BufferSize];
341267ad430SZoltán Porkoláb   strcpy(Message, "Message: ");
342267ad430SZoltán Porkoláb   scanf("%s", Message + strlen(Message));
343267ad430SZoltán Porkoláb }
344267ad430SZoltán Porkoláb 
345267ad430SZoltán Porkoláb void good12(void) {
346267ad430SZoltán Porkoláb   wchar_t Message[BufferSize];
347267ad430SZoltán Porkoláb   wcscpy(Message, L"Message: ");
348267ad430SZoltán Porkoláb   wscanf(L"%s", Message + wcslen(Message));
349267ad430SZoltán Porkoláb }
350267ad430SZoltán Porkoláb 
351267ad430SZoltán Porkoláb void good13(void) {
352267ad430SZoltán Porkoláb   int Buffer[BufferSize];
353267ad430SZoltán Porkoláb 
354267ad430SZoltán Porkoláb   int *P = &Buffer[0];
355*1c38c46bSwhisperity   while (P < Buffer + sizeof(Buffer) / sizeof(int)) {
356267ad430SZoltán Porkoláb     // NO-WARNING: Calculating the element count of the buffer here, which is
357267ad430SZoltán Porkoláb     // safe with this idiom (as long as the types don't change).
358267ad430SZoltán Porkoláb     ++P;
359267ad430SZoltán Porkoláb   }
360267ad430SZoltán Porkoláb 
361*1c38c46bSwhisperity   while (P < Buffer + sizeof(Buffer) / sizeof(Buffer[0])) {
362267ad430SZoltán Porkoláb     // NO-WARNING: Calculating the element count of the buffer here, which is
363267ad430SZoltán Porkoláb     // safe with this idiom.
364267ad430SZoltán Porkoláb     ++P;
365267ad430SZoltán Porkoláb   }
366267ad430SZoltán Porkoláb 
367*1c38c46bSwhisperity   while (P < Buffer + sizeof(Buffer) / sizeof(*P)) {
368267ad430SZoltán Porkoláb     // NO-WARNING: Calculating the element count of the buffer here, which is
369267ad430SZoltán Porkoláb     // safe with this idiom.
370267ad430SZoltán Porkoláb     ++P;
371267ad430SZoltán Porkoláb   }
372267ad430SZoltán Porkoláb }
373*1c38c46bSwhisperity 
374*1c38c46bSwhisperity void situational14(int *Buffer, size_t BufferSize) {
375*1c38c46bSwhisperity   int *P = &Buffer[0];
376*1c38c46bSwhisperity   while (P < Buffer + BufferSize / sizeof(*Buffer)) {
377*1c38c46bSwhisperity     // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: suspicious usage of 'sizeof(...)' in pointer arithmetic; this scaled value will be scaled again by the '+' operator
378*1c38c46bSwhisperity     // CHECK-MESSAGES: :[[@LINE-2]]:21: note: '+' in pointer arithmetic internally scales with 'sizeof(int)' == {{[0-9]+}}
379*1c38c46bSwhisperity     ++P;
380*1c38c46bSwhisperity   }
381*1c38c46bSwhisperity }
382