Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Wiki Markup
As described in-depth in [DCL34-C. Use volatile for data that cannot be cached|guideline [DCL34-C. Use volatile for data that cannot be cached], a {{volatile}}\-qualified variable "shall be evaluated strictly according to the rules of the abstract machine" \[[ISO/IEC 9899:1999|AA. Bibliography#ISO/IEC 9899-1999]\].  In other words, the {{volatile}} qualifier is used to instruct the compiler to not make caching optimizations about a variable.

Wiki Markup
However, as demonstrated in \[[Eide and Regehr|AA. Bibliography#Eide and Regehr]\], all tested compilers generated some percentage of incorrect compiled code with regards to {{volatile}} accesses.  Therefore, it is necessary to know how your compiler behaves when the standard {{volatile}} behavior is required.  There is also a workaround that eliminates some or all of these errors \[[Eide and Regehr|AA. Bibliography#Eide and Regehr]\].

...

Wiki Markup
Because the variable {{x}} is {{volatile}}\-qualified, it should be accessed ten times in this program.  However, as shown in the compiled object code, it is only accessed once due to a loop-hoisting optimization \[[Eide and Regehr|AA. Bibliography#Eide and Regehr]\]:

...

Wiki Markup
Eide and Regehr tested a workaround by wrapping {{volatile}} accesses with function calls.  They describe it with the intuition that "we can replace an action that compilers empirically get wrong by a different action --- a function call --- thataction—a function call—that compilers can get right" \[[Eide and Regehr|AA. Bibliography#Eide and Regehr]\].  For example, the workaround for the noncompliant code example would be:

Code Block
bgColor#ccccff
int vol_read_int(volatile int *vp) {
  return *vp;
}
volatile int *vol_id_int(volatile int *vp) {
  return vp;
}

const volatile int x;
volatile int y;
void foo(void) {
  for(*vol_id_int(&y) = 0; vol_read_int(&y) < 10; *vol_id_int(&y) = vol_read_int(&y) + 1) {
    int z = vol_read_int(&x);
  }
}

Wiki Markup
The workarounds proposed in \[[Eide and Regehr|AA. Bibliography#Eide and Regehr]\] fix many of the {{volatile}}\-access bugs in the tested compilers.&nbsp; However, compilers are always changing so critical sections of code should be compiled as if for deployment and the compiled object code should be inspected for the correct behavior.

...