Изменение константной переменной с ключевым словом volatile
Я отвечалвопрос и сделал эту тестовую программу.
#include <stdio.h>
int main()
{
volatile const int v = 5;
int * a = &v;
*a =4;
printf("%d\n", v);
return 0;
}
Без ключевого слова volatile код оптимизирует (скомпилированный с -O3 apple clang 4.2) изменение var, и оно работает как положено, а переменная const корректно изменяется.
Мне было интересно, знает ли более опытный разработчик C, есть ли часть стандарта, которая говорит, что это небезопасно или UB.
ОБНОВИТЬ: @EricPostpischil дал мне эту цитату стандартов
Программа не может изменять свой собственный объект, определенный с помощью типа с константой, согласно C 2011 (N1570) 6.7.3 6: «Если предпринята попытка изменить объект, определенный с помощью типа с константой, путем использования lvalue с неконстантный тип, поведение не определено ». Внешний агент может изменить объект, имеющий тип с изменяемым типом, согласно 6.7.3 7:« Объект с типом с определенным типом может быть изменен способами, неизвестными реализация или имеют другие неизвестные побочные эффекты
Моя программа нарушает первое правило, но я подумал, что второе правило может освободить программу от первого.
ОБНОВЛЕНИЕ 2:
Объект, имеющий тип volatile-qualified, может быть изменен способами, неизвестными реализации или иметь другие неизвестные побочные эффекты. Поэтому любое выражение, относящееся к такому объекту, должно оцениваться строго в соответствии с правилами абстрактной машины, как описано в 5.1.2.3. Кроме того, в каждой точке последовательности значение, которое в последний раз хранится в объекте, должно соответствовать значению, предписанному абстрактной машиной, за исключением случаев, когда оно изменено неизвестными факторами, упомянутыми ранее.134). -определенной.
Если вы посмотрите на эту цитату, вы увидите, что переменная должна быть оценена в соответствии с определенными правилами, я не прочитал весь раздел5.1.2.3
но я считаю, что это может пролить свет на проблему.