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