Я не вижу смысла с вами спорить. Насчёт volatile указателей пример я вам привел. Продублирую и тут:
#include <stdio.h>
void main( void )
{
int x = 123;
*(volatile int*)&x;
}
Результат компиляции с оптимизациями:
main:
0080BA 81 RET
По вашей логике компилятор не имел права оптимизировать присвоение переменной и обращение к ней по указателю, т.к. указатель помечен как volatile.
Однако на деле компилятор выбросил весь код из main, вместе c volatile указателем. И по моей логике это соответствует стандарту. И вот почему.
Переменная локальная и никем кроме main использоваться не может. Указатель на неё тоже локальный и за пределами main никому не доступен. Соответственно выкидывание кода ни на что не влияет. Что оптимизатор и сделал - просто выбросил весь код, вместе с volatile указателем. И на поведении кода это никак не отразилось, он как ничего не делал, так и не делает. Несмотря на volatile.