Skip to content

Commit efb286d

Browse files
committed
EXP32-C: Add test case
1 parent 0656a18 commit efb286d

File tree

1 file changed

+38
-0
lines changed
  • c/cert/test/rules/EXP32-C

1 file changed

+38
-0
lines changed

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
volatile int *volatile_f();
2+
3+
void test_cast_away_volatile() {
4+
volatile int *l1 = volatile_f(); // COMPLIANT
5+
int *l2 = (int *)l1; // NON_COMPLIANT
6+
int *l3 = (int *)volatile_f(); // NON_COMPLIANT
7+
*l2; // Volatile object is accessed through a non-volatile pointer
8+
}
9+
10+
void test_volatile_lost_by_assignment() {
11+
static volatile int val = 0;
12+
static int *non_compliant_pointer;
13+
static volatile int **compliant_pointer_to_pointer;
14+
compliant_pointer_to_pointer = &non_compliant_pointer; // NON_COMPLIANT
15+
*compliant_pointer_to_pointer = &val;
16+
*non_compliant_pointer; // Volatile object is accessed through a non-volatile
17+
// pointer
18+
}
19+
20+
void test_volatile_lost_by_assignment_and_cast() {
21+
static volatile int val = 0;
22+
static int *non_compliant_pointer;
23+
static volatile int **compliant_pointer_to_pointer;
24+
compliant_pointer_to_pointer =
25+
(int **)&non_compliant_pointer; // NON_COMPLIANT
26+
*compliant_pointer_to_pointer = &val;
27+
*non_compliant_pointer; // Volatile object is accessed through a non-volatile
28+
// pointer
29+
}
30+
31+
void test_volatile_not_lost_by_assignment_and_cast() {
32+
static volatile int val = 0;
33+
static volatile int *compliant_pointer;
34+
static volatile int **compliant_pointer_to_pointer;
35+
compliant_pointer_to_pointer = &compliant_pointer; // COMPLIANT
36+
*compliant_pointer_to_pointer = &val;
37+
*compliant_pointer; // Volatile object is accessed through a volatile pointer
38+
}

0 commit comments

Comments
 (0)