Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Analyzer][VLASizeChecker] Check for VLA size overflow.
Summary: Variable-length array (VLA) should have a size that fits into a size_t value. According to the standard: "std::size_t can store the maximum size of a theoretically possible object of any type (including array)" (this is applied to C too). The size expression is evaluated at the definition of the VLA type even if this is a typedef. The evaluation of the size expression in itself might cause problems if it overflows. Reviewers: Szelethus, baloghadamsoftware, martong, gamesh411 Reviewed By: Szelethus, martong, gamesh411 Subscribers: whisperity, rnkovacs, xazax.hun, baloghadamsoftware, szepet, a.sidorin, mikhail.ramalho, Szelethus, donat.nagy, dkrupp, gamesh411, Charusso, martong, ASDenysPetrov, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D79330
- Loading branch information
Showing
2 changed files
with
130 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
// RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu -analyzer-checker=core -verify %s | ||
|
||
typedef unsigned long size_t; | ||
#define BIGINDEX 65536U | ||
|
||
size_t check_VLA_overflow_sizeof(unsigned int x) { | ||
if (x == BIGINDEX) { | ||
// We expect here that size_t is a 64 bit value. | ||
// Size of this array should be the first to overflow. | ||
size_t s = sizeof(char[x][x][x][x]); // expected-warning{{Declared variable-length array (VLA) has too large size [core.VLASize]}} | ||
return s; | ||
} | ||
return 0; | ||
} | ||
|
||
void check_VLA_overflow_typedef() { | ||
unsigned int x = BIGINDEX; | ||
typedef char VLA[x][x][x][x]; // expected-warning{{Declared variable-length array (VLA) has too large size [core.VLASize]}} | ||
} | ||
|
||
void check_VLA_no_overflow() { | ||
unsigned int x = BIGINDEX; | ||
typedef char VLA[x][x][x][x - 1]; | ||
typedef char VLA1[0xffffffffu]; | ||
} |