Skip to content

Commit ee22665

Browse files
committed
EXP36-C: Add test case
1 parent efb286d commit ee22665

File tree

1 file changed

+156
-0
lines changed
  • c/cert/test/rules/EXP36-C

1 file changed

+156
-0
lines changed

c/cert/test/rules/EXP36-C/test.c

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
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

Comments
 (0)