Ändern einer const-Variablen mit dem Schlüsselwort volatile

Ich antwortete aFrage und machte dieses Testprogramm.

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

Ohne das Schlüsselwort volatile optimiert der Code (kompiliert mit -O3 apple clang 4.2) die Änderung des var away, wobei es wie erwartet funktioniert und die Variable const korrekt geändert wird.

Ich habe mich gefragt, ob ein erfahrener C-Entwickler weiß, ob es einen Teil des Standards gibt, der besagt, dass dies unsicher oder UB ist.

AKTUALISIEREN: @ EricPostpischil gab mir dieses Standard-Zitat

Ein Programm darf sein eigenes Objekt, das mit einem konstanten qualifizierten Typ definiert ist, nicht gemäß C 2011 (N1570) 6.7.3 6 ändern: „Wenn versucht wird, ein Objekt, das mit einem konstanten qualifizierten Typ definiert ist, durch Verwendung eines Werts mit zu ändern Wenn der Typ nicht const-qualifiziert ist, ist das Verhalten undefiniert. “Ein externer Agent kann ein Objekt mit einem flüchtig qualifizierten Typ gemäß 6.7.3 ändern. 7:„ Ein Objekt mit einem flüchtig qualifizierten Typ kann auf eine Weise geändert werden, die dem nicht bekannt ist Implementierung oder andere unbekannte Nebenwirkungen haben

Mein Programm verstößt gegen die erste Regel, aber ich dachte, dass die zweite Regel ein Programm von der ersten ausnehmen könnte.

UPDATE 2:

Ein Objekt mit einem flüchtig qualifizierten Typ kann auf eine der Implementierung unbekannte Weise modifiziert werden oder andere unbekannte Nebenwirkungen haben. Daher muss jeder Ausdruck, der sich auf ein solches Objekt bezieht, streng nach den Regeln der abstrakten Maschine bewertet werden, wie in 5.1.2.3 beschrieben. Außerdem muss an jedem Sequenzpunkt der zuletzt im Objekt gespeicherte Wert mit dem von der abstrakten Maschine vorgegebenen Wert übereinstimmen, sofern er nicht durch die zuvor genannten unbekannten Faktoren geändert wurde.134) Als Zugriff auf ein Objekt mit flüchtig qualifiziertem Typ gilt die Implementierung -definiert.

Wenn Sie sich dieses Zitat ansehen, sehen Sie, dass die Variable nach bestimmten Regeln ausgewertet werden muss. Ich habe nicht den gesamten Abschnitt durchgelesen5.1.2.3 aber ich glaube, dass dies etwas Licht in die Sache bringen könnte.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage