Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[analyzer] Allow padding checker to traverse simple class hierarchies
The existing padding checker skips classes that have any base classes. This patch allows the checker to traverse very simple cases: classes that have no fields and have exactly one base class. This is important mostly in the case of array declarations. Patch by Max Bernstein! Test plan: make check-all Differential revision: https://reviews.llvm.org/D53206 llvm-svn: 345558
- Loading branch information
1 parent
7c180fa
commit e2f0734
Showing
2 changed files
with
58 additions
and
8 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,28 @@ | ||
// RUN: %clang_analyze_cc1 -std=c++14 -analyzer-checker=optin.performance -analyzer-config optin.performance.Padding:AllowedPad=20 -verify %s | ||
|
||
// A class that has no fields and one base class should visit that base class | ||
// instead. Note that despite having excess padding of 2, this is flagged | ||
// because of its usage in an array of 100 elements below (`ais'). | ||
// TODO: Add a note to the bug report with BugReport::addNote() to mention the | ||
// variable using the class and also mention what class is inherting from what. | ||
// expected-warning@+1{{Excessive padding in 'struct FakeIntSandwich'}} | ||
struct FakeIntSandwich { | ||
char c1; | ||
int i; | ||
char c2; | ||
}; | ||
|
||
struct AnotherIntSandwich : FakeIntSandwich { // no-warning | ||
}; | ||
|
||
// But we don't yet support multiple base classes. | ||
struct IntSandwich {}; | ||
struct TooManyBaseClasses : FakeIntSandwich, IntSandwich { // no-warning | ||
}; | ||
|
||
AnotherIntSandwich ais[100]; | ||
|
||
struct Empty {}; | ||
struct DoubleEmpty : Empty { // no-warning | ||
Empty e; | ||
}; |