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