...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <stdio.h> void func(void) { static volatile int **ipp; static int *ip; static volatile int i = 0; printf("i = %d.\n", i); ipp = &ip; /* Produces warnings in modern compilers */ ipp = (int**) &ip; /* Constraint violation, also produces warnings */ *ipp = &i; /* Valid */ if (*ip != 0) { /* Valid */ /* ... */ } } |
The assignment ipp = &ip
is unsafe because it would allow the valid code that follows to reference the value of the volatile object i
through the non-volatile-qualified reference ip
. In this example, the compiler may optimize out the entire if
block because i != 0
must be false if i
is not volatile.
...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <stdio.h> void func(void) { static volatile int **ipp; static volatile int *ip; static volatile int i = 0; printf("i = %d.\n", i); ipp = &ip; *ipp = &i; if (*ip != 0) { /* ... */ } } |
Risk Assessment
Casting away volatile allows access to an object through a nonvolatile reference and can result in undefined and perhaps unintended program behavior.
...