Modyfikowanie zmiennej const za pomocą słowa kluczowego volatile

Odpowiadałem apytanie i wykonałem ten program testowy.

#include <stdio.h>
int main()
{
    volatile const int v = 5;
    int * a = &v;
    *a =4;
    printf("%d\n", v);
    return 0;
}

Bez słowa kluczowego volatile kod optymalizuje (skompilowany z -O3 apple clang 4.2) zmianę odmiany, z tym, że działa zgodnie z oczekiwaniami i zmienna stała jest poprawnie modyfikowana.

Zastanawiałem się, czy bardziej doświadczony programista C wie, czy istnieje część standardu, który mówi, że jest to niebezpieczne lub UB.

AKTUALIZACJA: @EricPostpischil podał mi ten standard

Program nie może modyfikować własnego obiektu zdefiniowanego za pomocą typu kwalifikowanego zgodnie z C 2011 (N1570) 6.7.3 6: „Jeśli podjęta zostanie próba zmodyfikowania obiektu zdefiniowanego za pomocą typu o stałej wartości za pomocą wartości l z typ inny niż stały, zachowanie jest niezdefiniowane. ”Agent zewnętrzny może zmodyfikować obiekt, który ma typ kwalifikowany lotnie, zgodnie z 6.7.3 7:„ Obiekt, który ma typ kwalifikujący się do lotnych, może być modyfikowany w sposób nieznany dla wdrożenie lub inne nieznane skutki uboczne

Mój program łamie pierwszą zasadę, ale myślałem, że druga reguła może zwolnić program od pierwszego.

AKTUALIZACJA 2:

Obiekt o typie kwalifikującym się do lotnych może być modyfikowany w sposób nieznany dla implementacji lub mieć inne nieznane skutki uboczne. Dlatego wszelkie wyrażenia odnoszące się do takiego obiektu należy oceniać ściśle zgodnie z zasadami abstrakcyjnej maszyny, jak opisano w 5.1.2.3. Ponadto, w każdym punkcie sekwencji, wartość ostatnio przechowywana w obiekcie musi zgadzać się z wartością zalecaną przez maszynę abstrakcyjną, z wyjątkiem tego, że została zmodyfikowana przez nieznane czynniki wymienione wcześniej.134) Co stanowi dostęp do obiektu, który ma typ kwalifikowanego lotnego, jest implementacją -zdefiniowane.

Jeśli spojrzysz na ten cytat, zobaczysz, że var musi być oceniany zgodnie z pewnymi zasadami, nie przeczytałem całej sekcji5.1.2.3 ale wierzę, że może to rzucić nieco światła na tę kwestię.

questionAnswers(2)

yourAnswerToTheQuestion