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