|
|
|
|
|
by crote
28 days ago
|
|
The problem is that the function call as a whole is UB. Having the original example compile to the equivalent of volatile int x;
int a = x;
int b = x;
printf("%x %d\n", a, b);
is equally valid as volatile int x;
int a = x;
int b = x;
printf("%x %d\n", b, a);
, and neither needs to have the same output as your proposed fix.C could've specified something like "arguments are evaluated left-to-right" or "if two arguments have the same expression, the expression is [only evaluated once]/[always evaluated twice]". But it didn't, so the developer is left gingerly navigating a minefield every time they use volatile. |
|
Of course the developer is navigating a minefield every time they use volatile, that's why it's called "volatile" - an English word otherwise only commonly used in chemistry, where it means "stuff that wants to go boom".