...
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.
...
This example compiles without warning on Microsoft Visual Studio 2012 2013 when compiled in C mode (/TC) but causes errors when compiled in C++ mode (/TP).
...