Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -triple x86_64-unknown-linux -std=c++14 -analyze -analyzer-checker=optin.performance -analyzer-config optin.performance.Padding:AllowedPad=2 -verify %s
      2 
      3 // expected-warning@+1{{Excessive padding in 'struct IntSandwich' (6 padding bytes, where 2 is optimal)}}
      4 struct IntSandwich {
      5   char c1;
      6   int i;
      7   char c2;
      8 };
      9 
     10 // expected-warning@+1{{Excessive padding in 'struct TurDuckHen' (6 padding bytes, where 2 is optimal)}}
     11 struct TurDuckHen {
     12   char c1;
     13   struct IntSandwich i;
     14   char c2;
     15 };
     16 
     17 #pragma pack(push)
     18 #pragma pack(2)
     19 // expected-warning@+1{{Excessive padding in 'struct SmallIntSandwich' (4 padding bytes, where 0 is optimal)}}
     20 struct SmallIntSandwich {
     21   char c1;
     22   int i1;
     23   char c2;
     24   int i2;
     25   char c3;
     26   int i3;
     27   char c4;
     28 };
     29 #pragma pack(pop)
     30 
     31 union SomeUnion { // no-warning
     32   char c;
     33   short s;
     34   int i;
     35 };
     36 
     37 // expected-warning@+1{{Excessive padding in 'struct HoldsAUnion' (6 padding bytes, where 2 is optimal)}}
     38 struct HoldsAUnion {
     39   char c1;
     40   union SomeUnion u;
     41   char c2;
     42 };
     43 
     44 struct SmallCharArray { // no-warning
     45   char c[5];
     46 };
     47 
     48 struct MediumIntArray { // no-warning
     49   int i[5];
     50 };
     51 
     52 // expected-warning@+1{{Excessive padding in 'struct StructSandwich' (6 padding bytes, where 2 is optimal)}}
     53 struct StructSandwich {
     54   struct SmallCharArray s;
     55   struct MediumIntArray m;
     56   struct SmallCharArray s2;
     57 };
     58 
     59 // expected-warning@+1{{Excessive padding in 'TypedefSandwich' (6 padding bytes, where 2 is optimal)}}
     60 typedef struct {
     61   char c1;
     62   int i;
     63   char c2;
     64 } TypedefSandwich;
     65 
     66 // expected-warning@+1{{Excessive padding in 'struct StructAttrAlign' (10 padding bytes, where 2 is optimal)}}
     67 struct StructAttrAlign {
     68   char c1;
     69   int i;
     70   char c2;
     71 } __attribute__((aligned(8)));
     72 
     73 // expected-warning@+1{{Excessive padding in 'struct OverlyAlignedChar' (8185 padding bytes, where 4089 is optimal)}}
     74 struct OverlyAlignedChar {
     75   char c1;
     76   int x;
     77   char c2;
     78   char c __attribute__((aligned(4096)));
     79 };
     80 
     81 // expected-warning@+1{{Excessive padding in 'struct HoldsOverlyAlignedChar' (8190 padding bytes, where 4094 is optimal)}}
     82 struct HoldsOverlyAlignedChar {
     83   char c1;
     84   struct OverlyAlignedChar o;
     85   char c2;
     86 };
     87 
     88 void internalStructFunc() {
     89   // expected-warning@+1{{Excessive padding in 'struct X' (6 padding bytes, where 2 is optimal)}}
     90   struct X {
     91     char c1;
     92     int t;
     93     char c2;
     94   };
     95   struct X obj;
     96 }
     97 
     98 void typedefStructFunc() {
     99   // expected-warning@+1{{Excessive padding in 'S' (6 padding bytes, where 2 is optimal)}}
    100   typedef struct {
    101     char c1;
    102     int t;
    103     char c2;
    104   } S;
    105   S obj;
    106 }
    107 
    108 // expected-warning@+1{{Excessive padding in 'struct DefaultAttrAlign' (22 padding bytes, where 6 is optimal)}}
    109 struct DefaultAttrAlign {
    110   char c1;
    111   long long i;
    112   char c2;
    113 } __attribute__((aligned));
    114 
    115 // expected-warning@+1{{Excessive padding in 'struct SmallArrayShortSandwich' (2 padding bytes, where 0 is optimal)}}
    116 struct SmallArrayShortSandwich {
    117   char c1;
    118   short s;
    119   char c2;
    120 } ShortArray[20];
    121 
    122 // expected-warning@+1{{Excessive padding in 'struct SmallArrayInFunc' (2 padding bytes, where 0 is optimal)}}
    123 struct SmallArrayInFunc {
    124   char c1;
    125   short s;
    126   char c2;
    127 };
    128 
    129 void arrayHolder() {
    130   struct SmallArrayInFunc Arr[15];
    131 }
    132 
    133 // expected-warning@+1{{Excessive padding in 'class VirtualIntSandwich' (10 padding bytes, where 2 is optimal)}}
    134 class VirtualIntSandwich {
    135   virtual void foo() {}
    136   char c1;
    137   int i;
    138   char c2;
    139 };
    140 
    141 // constructed so as not to have tail padding
    142 // expected-warning@+1{{Excessive padding in 'class InnerPaddedB' (6 padding bytes, where 2 is optimal)}}
    143 class InnerPaddedB {
    144   char c1;
    145   int i1;
    146   char c2;
    147   int i2;
    148 };
    149 
    150 class Empty {}; // no-warning
    151 
    152 // expected-warning@+1{{Excessive padding in 'class LotsOfSpace' (6 padding bytes, where 2 is optimal)}}
    153 class LotsOfSpace {
    154   Empty e1;
    155   int i;
    156   Empty e2;
    157 };
    158 
    159 // expected-warning@+1{{Excessive padding in 'TypedefSandwich2' (6 padding bytes, where 2 is optimal)}}
    160 typedef struct {
    161   char c1;
    162   // expected-warning@+1{{Excessive padding in 'TypedefSandwich2::NestedTypedef' (6 padding bytes, where 2 is optimal)}}
    163   typedef struct {
    164     char c1;
    165     int i;
    166     char c2;
    167   } NestedTypedef;
    168   NestedTypedef t;
    169   char c2;
    170 } TypedefSandwich2;
    171 
    172 template <typename T>
    173 struct Foo {
    174   // expected-warning@+1{{Excessive padding in 'struct Foo<int>::Nested' (6 padding bytes, where 2 is optimal)}}
    175   struct Nested {
    176     char c1;
    177     T t;
    178     char c2;
    179   };
    180 };
    181 
    182 struct Holder { // no-warning
    183   Foo<int>::Nested t1;
    184   Foo<char>::Nested t2;
    185 };
    186