1
+ #include <stdalign.h>
2
+ #include <stddef.h>
3
+
4
+ void test_direct_cast_alignment () {
5
+ char c1 = 1 ; // assuming 1-byte alignment
6
+ (char * )& c1 ; // COMPLIANT
7
+ (short * )& c1 ; // NON_COMPLIANT
8
+ (int * )& c1 ; // NON_COMPLIANT
9
+ (long * )& c1 ; // NON_COMPLIANT
10
+ (float * )& c1 ; // NON_COMPLIANT
11
+ (double * )& c1 ; // NON_COMPLIANT
12
+
13
+ short s1 = 1 ; // assuming 2-byte alignment
14
+ (char * )& s1 ; // COMPLIANT
15
+ (short * )& s1 ; // COMPLIANT
16
+ (int * )& s1 ; // NON_COMPLIANT
17
+ (long * )& s1 ; // NON_COMPLIANT
18
+ (float * )& c1 ; // NON_COMPLIANT
19
+ (double * )& c1 ; // NON_COMPLIANT
20
+
21
+ int i1 = 1 ; // assuming 4-byte alignment
22
+ (char * )& i1 ; // COMPLIANT
23
+ (short * )& i1 ; // COMPLIANT
24
+ (int * )& i1 ; // COMPLIANT
25
+ (float * )& c1 ; // COMPLIANT
26
+ (long * )& i1 ; // NON_COMPLIANT - assuming 8 byte alignment for longs
27
+ (double * )& c1 ; // NON_COMPLIANT
28
+
29
+ float f1 = 1 ; // assuming 4-byte alignment
30
+ (char * )& f1 ; // COMPLIANT
31
+ (short * )& f1 ; // COMPLIANT
32
+ (int * )& f1 ; // COMPLIANT
33
+ (float * )& f1 ; // COMPLIANT
34
+ (long * )& f1 ; // NON_COMPLIANT
35
+ (double * )& f1 ; // NON_COMPLIANT
36
+
37
+ long l1 = 1 ; // assuming 8-byte alignment
38
+ (char * )& l1 ; // COMPLIANT
39
+ (short * )& l1 ; // COMPLIANT
40
+ (int * )& l1 ; // COMPLIANT
41
+ (float * )& c1 ; // COMPLIANT
42
+ (long * )& l1 ; // COMPLIANT
43
+ (double * )& c1 ; // COMPLIANT
44
+
45
+ double d1 = 1 ; // assuming 8-byte alignment
46
+ (char * )& d1 ; // COMPLIANT
47
+ (short * )& d1 ; // COMPLIANT
48
+ (int * )& d1 ; // COMPLIANT
49
+ (float * )& d1 ; // COMPLIANT
50
+ (long * )& d1 ; // COMPLIANT
51
+ (double * )& d1 ; // COMPLIANT
52
+ }
53
+
54
+ void custom_aligned_types () {
55
+ alignas(int ) char c1 = 1 ;
56
+ (char * )& c1 ; // COMPLIANT
57
+ (short * )& c1 ; // COMPLIANT
58
+ (int * )& c1 ; // COMPLIANT
59
+ (float * )& c1 ; // COMPLIANT
60
+ (long * )& c1 ; // NON_COMPLIANT
61
+ (double * )& c1 ; // NON_COMPLIANT
62
+
63
+ alignas(32 ) char c2 = 1 ;
64
+ (char * )& c2 ; // COMPLIANT
65
+ (short * )& c2 ; // COMPLIANT
66
+ (int * )& c2 ; // COMPLIANT
67
+ (float * )& c2 ; // COMPLIANT
68
+ (long * )& c2 ; // NON_COMPLIANT
69
+ (double * )& c2 ; // NON_COMPLIANT
70
+ }
71
+
72
+ void test_via_void_direct () {
73
+ char c1 = 1 ;
74
+ void * v1 = & c1 ;
75
+ (char * )v1 ; // COMPLIANT
76
+ (short * )v1 ; // NON_COMPLIANT
77
+ (int * )v1 ; // NON_COMPLIANT
78
+ (float * )v1 ; // NON_COMPLIANT
79
+ (long * )v1 ; // NON_COMPLIANT
80
+ (double * )v1 ; // NON_COMPLIANT
81
+
82
+ short s1 = 1 ;
83
+ void * v2 = & s1 ;
84
+ (char * )v2 ; // COMPLIANT
85
+ (short * )v2 ; // COMPLIANT
86
+ (int * )v2 ; // NON_COMPLIANT
87
+ (float * )v2 ; // NON_COMPLIANT
88
+ (long * )v2 ; // NON_COMPLIANT
89
+ (double * )v2 ; // NON_COMPLIANT
90
+
91
+ int i1 = 1 ;
92
+ void * v3 = & i1 ;
93
+ (char * )v3 ; // COMPLIANT
94
+ (short * )v3 ; // COMPLIANT
95
+ (int * )v3 ; // COMPLIAN
96
+ (float * )v3 ; // COMPLIANT
97
+ (long * )v3 ; // NON_COMPLIANT - assuming 8 byte alignment for longs
98
+ (double * )v3 ; // NON_COMPLIANT - but only on x64
99
+
100
+ float f1 = 1 ;
101
+ void * v4 = & f1 ;
102
+ (char * )v4 ; // COMPLIANT
103
+ (short * )v4 ; // COMPLIANT
104
+ (int * )v4 ; // COMPLIANT
105
+ (float * )v4 ; // COMPLIANT
106
+ (long * )v4 ; // NON_COMPLIANT - assuming 8 byte alignment for longs
107
+ (double * )v4 ; // NON_COMPLIANT
108
+
109
+ long l1 = 1 ;
110
+ void * v5 = & l1 ;
111
+ (char * )v5 ; // COMPLIANT
112
+ (short * )v5 ; // COMPLIANT
113
+ (int * )v5 ; // COMPLIANT
114
+ (float * )v5 ; // COMPLIANT
115
+ (long * )v5 ; // COMPLIANT
116
+ (double * )v5 ; // COMPLIANT
117
+
118
+ double d1 = 1 ;
119
+ void * v6 = & d1 ;
120
+ (char * )v6 ; // COMPLIANT
121
+ (short * )v6 ; // COMPLIANT
122
+ (int * )v6 ; // COMPLIANT
123
+ (float * )v6 ; // COMPLIANT
124
+ (long * )v6 ; // COMPLIANT
125
+ (double * )v6 ; // COMPLIANT
126
+ }
127
+
128
+ int * cast_away (void * v ) {
129
+ return (int * )v ; // compliance depends on context
130
+ }
131
+
132
+ void test_via_void_indirect () {
133
+ char c1 = 1 ;
134
+ cast_away ((void * )c1 ); // NON_COMPLIANT
135
+
136
+ int i1 = 1 ;
137
+ cast_away ((void * )i1 ); // COMPLIANT
138
+ }
139
+
140
+ struct S1 {
141
+ char c1 ;
142
+ unsigned char data [8 ];
143
+ };
144
+
145
+ struct S2 {
146
+ char c1 ;
147
+ alignas(size_t ) unsigned char data [8 ];
148
+ };
149
+
150
+ void test_struct_alignment () {
151
+ S1 s1 ;
152
+ (size_t * )& s1 .data ; // NON_COMPLIANT
153
+
154
+ S2 s2 ;
155
+ (size_t * )& s2 .data ; // COMPLIANT
156
+ }
0 commit comments