Files
codeql/cpp/ql/test/library-tests/padding/cpp.cpp
2018-08-02 17:53:23 +01:00

279 lines
5.5 KiB
C++

#include "size_asserts.h"
CASSERT_MSVC(sizeof(wchar_t) == 2);
CASSERT_GCC(sizeof(wchar_t) == 4);
struct ReferencesAndPointers {
// 0
char c1;
// 1
// Pad 7(GCC64, MSVC64); 3(GCC32, MSVC32)
// 8(GCC64, MSVC64); 4(GCC32, MSVC32)
short& r2;
// 16(GCC64, MSVC64); 8(GCC32, MSVC32)
wchar_t wc3;
// 18(GCC64, MSVC64); 10(GCC32, MSVC32)
// Pad 6(GCC64, MSVC64); 2(GCC32, MSVC32)
// 24(GCC64, MSVC64); 12(GCC32, MSVC32)
long long* p4;
// 32(GCC64, MSVC64); 16(GCC32, MSVC32)
};
CASSERT_MSVC64(sizeof(struct ReferencesAndPointers) == 32);
CASSERT_MSVC32(sizeof(struct ReferencesAndPointers) == 16);
CASSERT_GCC64(sizeof(struct ReferencesAndPointers) == 32);
CASSERT_GCC32(sizeof(struct ReferencesAndPointers) == 16);
enum E {
E_None
};
CASSERT(sizeof(E) == sizeof(int));
enum E_char : char {
E_char_None
};
CASSERT(sizeof(E_char) == sizeof(char));
enum E_short : short {
E_short_None
};
CASSERT(sizeof(E_short) == sizeof(short));
enum E_int : int {
E_int_None
};
CASSERT(sizeof(E_int) == sizeof(int));
enum E_long : long {
E_long_None
};
CASSERT(sizeof(E_long) == sizeof(long));
enum E_longlong : long long {
E_longlong_None
};
CASSERT(sizeof(E_longlong) == sizeof(long long));
enum class EC {
None
};
CASSERT(sizeof(EC) == sizeof(int));
enum class EC_char : char {
None
};
CASSERT(sizeof(EC_char) == sizeof(char));
enum class EC_short : short {
None
};
CASSERT(sizeof(EC_short) == sizeof(short));
enum class EC_int : int {
None
};
CASSERT(sizeof(EC_int) == sizeof(int));
enum class EC_long : long {
None
};
CASSERT(sizeof(EC_long) == sizeof(long));
enum class EC_longlong : long long {
None
};
CASSERT(sizeof(EC_longlong) == sizeof(long long));
struct Enums_Packed {
// 0
E_longlong ell;
// 8
E_long el;
// 16(GCC64); 12(GCC32, MSVC)
E_int ei;
// 20(GCC64); 16(GCC32, MSVC)
E e;
// 24(GCC64); 20(GCC32, MSVC)
E_short es;
// 26(GCC64); 22(GCC32, MSVC)
E_char ec;
// 27(GCC64); 23(GCC32, MSVC)
// Pad 5(GCC64); 1(GCC32, MSVC)
// 32(GCC64); 24(GCC32, MSVC)
};
CASSERT_GCC64(sizeof(Enums_Packed) == 32);
CASSERT_GCC32(sizeof(Enums_Packed) == 24);
CASSERT_MSVC(sizeof(Enums_Packed) == 24);
struct Enums_MixedBitfields {
// 0
E_short ei1 : 8;
// 1
short s2 : 8;
// 2
};
CASSERT_GCC(sizeof(Enums_MixedBitfields) == 2);
CASSERT_MSVC(sizeof(Enums_MixedBitfields) == 2);
struct Enums_MixedBitfields_Padded {
// 0
E_short ei1 : 8;
// 1
// Pad 1(MSVC); 0(GCC)
// 2(MSVC); 1(GCC)
unsigned char uc2 : 8;
// 3(MSVC); 2(GCC)
// Pad 1(MSVC); 0(GCC)
// 4(MSVC); 2(GCC)
};
CASSERT_GCC(sizeof(Enums_MixedBitfields_Padded) == 2);
CASSERT_MSVC(sizeof(Enums_MixedBitfields_Padded) == 4);
struct Base_Empty {
// 0
// Pad 1
// 1
};
CASSERT(sizeof(Base_Empty) == 1);
struct Derived_EmptyBase : Base_Empty {
// 0
// Base class Base_Empty (Empty Base Optimization)
// 0
int n1;
// 4
};
CASSERT(sizeof(Derived_EmptyBase) == 4);
struct Base_NoPadding {
// 0
int n1;
// 4
};
CASSERT(sizeof(Base_NoPadding) == 4);
struct Derived_NoBasePadding : Base_NoPadding {
// 0
// Base class Base_NoPadding
// 4
int n2;
// 8
};
CASSERT(sizeof(Derived_NoBasePadding) == 8);
struct Base_Padding {
// 0
float f1;
// 4
short s1;
// 6
// Pad 2
// 8
};
CASSERT(sizeof(Base_Padding) == 8);
struct Derived_BasePadding : Base_Padding {
// 0
// Base class Base_Padding
// 8
short s2;
// 10
// Pad 2
// 12
};
CASSERT(sizeof(Derived_BasePadding) == 12);
struct Intermediate_NoFields : Base_NoPadding {
// 0
// Base class Base_NoPadding
// 4
};
CASSERT(sizeof(Intermediate_NoFields) == 4);
struct Derived_NonEmptyBaseWithNoFields : Intermediate_NoFields {
// 0
// Base class Intermediate_NoFields
// 4
int n2;
// 8
};
CASSERT(sizeof(Derived_NonEmptyBaseWithNoFields) == 8);
struct MultipleInheritance : Base_NoPadding, Base_Padding {
int n3;
};
CASSERT(sizeof(MultipleInheritance) == 16);
struct StaticMemberVariables {
// 0
static int s_n1;
// 0
float f1;
// 4
static int s_n2;
// 4
};
CASSERT(sizeof(StaticMemberVariables) == 4);
struct VirtualInheritance : virtual Base_NoPadding {
int n3;
};
struct Derived_EmptyBase_Conflict1 : Base_Empty {
// 0
// Base class Base_Empty (GCC Only: no Empty Base Optimization due to conflict with m1)
// 1(GCC); 0(MSVC)
Base_Empty m1;
// 2(GCC); 1(MSVC)
};
CASSERT_GCC(sizeof(Derived_EmptyBase_Conflict1) == 2);
CASSERT_MSVC(sizeof(Derived_EmptyBase_Conflict1) == 1);
struct Derived_EmptyBase_Conflict2 : Base_Empty {
// 0
// Base class Base_Empty (GCC Only: no Empty Base Optimization due to conflict with m1)
// 1(GCC); 0(MSVC)
// Pad 3(GCC); 0(MSVC)
// 4(GCC); 0(MSVC)
Derived_EmptyBase m1;
// 8(GCC); 4(MSVC)
};
CASSERT_GCC(sizeof(Derived_EmptyBase_Conflict2) == 8);
CASSERT_MSVC(sizeof(Derived_EmptyBase_Conflict2) == 4);
struct Base_Empty2 : Base_Empty {
// 0
// Base class Base_Empty (Empty Base Optimization)
// 0
// Pad 1
// 1
};
CASSERT(sizeof(Base_Empty2) == 1);
struct Derived_EmptyBase_Conflict3 : Base_Empty2 {
// 0
// Base class Base_Empty2 (GCC Only: no Empty Base Optimization due to conflict with m1)
// 1(GCC); 0(MSVC)
Base_Empty m1;
// 2(GCC); 1(MSVC)
};
CASSERT_GCC(sizeof(Derived_EmptyBase_Conflict3) == 2);
CASSERT_MSVC(sizeof(Derived_EmptyBase_Conflict3) == 1);
struct Base_NoPaddingButSmallAlignment {
// 0
short s1;
// 2
};
CASSERT(sizeof(Base_NoPaddingButSmallAlignment) == 2);
struct Derived_NoBasePaddingButNeedsAlignmentPadding : Base_NoPaddingButSmallAlignment {
// 0
// Base class Base_NoPaddingButSmallAlignment
// 2
// Pad 2
// 4
int n1;
// 8
};
CASSERT(sizeof(Derived_NoBasePaddingButNeedsAlignmentPadding) == 8);