312 lines
5.3 KiB
C++
312 lines
5.3 KiB
C++
|
// RUN: %clang_analyze_cc1 -triple x86_64-unknown-linux -std=c++14 -analyzer-checker=optin.performance -analyzer-config optin.performance.Padding:AllowedPad=2 -verify %s
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct IntSandwich' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
i, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
struct IntSandwich {
|
||
|
char c1;
|
||
|
int i;
|
||
|
char c2;
|
||
|
};
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct TurDuckHen' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
i, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
struct TurDuckHen {
|
||
|
char c1;
|
||
|
struct IntSandwich i;
|
||
|
char c2;
|
||
|
};
|
||
|
|
||
|
#pragma pack(push)
|
||
|
#pragma pack(2)
|
||
|
// expected-warning@+11{{\
|
||
|
Excessive padding in 'struct SmallIntSandwich' (4 padding bytes, where 0 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
i1, \
|
||
|
i2, \
|
||
|
i3, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
c3, \
|
||
|
c4, \
|
||
|
}}
|
||
|
struct SmallIntSandwich {
|
||
|
char c1;
|
||
|
int i1;
|
||
|
char c2;
|
||
|
int i2;
|
||
|
char c3;
|
||
|
int i3;
|
||
|
char c4;
|
||
|
};
|
||
|
#pragma pack(pop)
|
||
|
|
||
|
union SomeUnion { // no-warning
|
||
|
char c;
|
||
|
short s;
|
||
|
int i;
|
||
|
};
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct HoldsAUnion' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
u, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
struct HoldsAUnion {
|
||
|
char c1;
|
||
|
union SomeUnion u;
|
||
|
char c2;
|
||
|
};
|
||
|
|
||
|
struct SmallCharArray { // no-warning
|
||
|
char c[5];
|
||
|
};
|
||
|
|
||
|
struct MediumIntArray { // no-warning
|
||
|
int i[5];
|
||
|
};
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct StructSandwich' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
m, \
|
||
|
s, \
|
||
|
s2, \
|
||
|
}}
|
||
|
struct StructSandwich {
|
||
|
struct SmallCharArray s;
|
||
|
struct MediumIntArray m;
|
||
|
struct SmallCharArray s2;
|
||
|
};
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'TypedefSandwich' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
i, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
typedef struct {
|
||
|
char c1;
|
||
|
int i;
|
||
|
char c2;
|
||
|
} TypedefSandwich;
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct StructAttrAlign' (10 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
i, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
struct StructAttrAlign {
|
||
|
char c1;
|
||
|
int i;
|
||
|
char c2;
|
||
|
} __attribute__((aligned(8)));
|
||
|
|
||
|
// expected-warning@+8{{\
|
||
|
Excessive padding in 'struct OverlyAlignedChar' (8185 padding bytes, where 4089 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
c, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
x, \
|
||
|
}}
|
||
|
struct OverlyAlignedChar {
|
||
|
char c1;
|
||
|
int x;
|
||
|
char c2;
|
||
|
char c __attribute__((aligned(4096)));
|
||
|
};
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct HoldsOverlyAlignedChar' (8190 padding bytes, where 4094 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
o, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
struct HoldsOverlyAlignedChar {
|
||
|
char c1;
|
||
|
struct OverlyAlignedChar o;
|
||
|
char c2;
|
||
|
};
|
||
|
|
||
|
void internalStructFunc() {
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct X' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
t, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
struct X {
|
||
|
char c1;
|
||
|
int t;
|
||
|
char c2;
|
||
|
};
|
||
|
struct X obj;
|
||
|
}
|
||
|
|
||
|
void typedefStructFunc() {
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'S' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
t, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
typedef struct {
|
||
|
char c1;
|
||
|
int t;
|
||
|
char c2;
|
||
|
} S;
|
||
|
S obj;
|
||
|
}
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct DefaultAttrAlign' (22 padding bytes, where 6 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
i, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
struct DefaultAttrAlign {
|
||
|
char c1;
|
||
|
long long i;
|
||
|
char c2;
|
||
|
} __attribute__((aligned));
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct SmallArrayShortSandwich' (2 padding bytes, where 0 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
s, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
struct SmallArrayShortSandwich {
|
||
|
char c1;
|
||
|
short s;
|
||
|
char c2;
|
||
|
} ShortArray[20];
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct SmallArrayInFunc' (2 padding bytes, where 0 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
s, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
struct SmallArrayInFunc {
|
||
|
char c1;
|
||
|
short s;
|
||
|
char c2;
|
||
|
};
|
||
|
|
||
|
void arrayHolder() {
|
||
|
struct SmallArrayInFunc Arr[15];
|
||
|
}
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'class VirtualIntSandwich' (10 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
i, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
class VirtualIntSandwich {
|
||
|
virtual void foo() {}
|
||
|
char c1;
|
||
|
int i;
|
||
|
char c2;
|
||
|
};
|
||
|
|
||
|
// constructed so as not to have tail padding
|
||
|
// expected-warning@+8{{\
|
||
|
Excessive padding in 'class InnerPaddedB' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
i1, \
|
||
|
i2, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
class InnerPaddedB {
|
||
|
char c1;
|
||
|
int i1;
|
||
|
char c2;
|
||
|
int i2;
|
||
|
};
|
||
|
|
||
|
class Empty {}; // no-warning
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'class LotsOfSpace' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
i, \
|
||
|
e1, \
|
||
|
e2, \
|
||
|
}}
|
||
|
class LotsOfSpace {
|
||
|
Empty e1;
|
||
|
int i;
|
||
|
Empty e2;
|
||
|
};
|
||
|
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct TypedefSandwich2' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
t, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
typedef struct TypedefSandwich2 {
|
||
|
char c1;
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'TypedefSandwich2::NestedTypedef' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
i, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
typedef struct {
|
||
|
char c1;
|
||
|
int i;
|
||
|
char c2;
|
||
|
} NestedTypedef;
|
||
|
NestedTypedef t;
|
||
|
char c2;
|
||
|
} TypedefSandwich2;
|
||
|
|
||
|
template <typename T>
|
||
|
struct Foo {
|
||
|
// expected-warning@+7{{\
|
||
|
Excessive padding in 'struct Foo<int>::Nested' (6 padding bytes, where 2 is optimal). \
|
||
|
Optimal fields order: \
|
||
|
t, \
|
||
|
c1, \
|
||
|
c2, \
|
||
|
}}
|
||
|
struct Nested {
|
||
|
char c1;
|
||
|
T t;
|
||
|
char c2;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
struct Holder { // no-warning
|
||
|
Foo<int>::Nested t1;
|
||
|
Foo<char>::Nested t2;
|
||
|
};
|