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