C "beobachtbares Verhalten" im Kontext von UB "undefiniertes Verhalten"

(Die Frage wurde ursprünglich von Kommentaren unter dieser Antwort an @ gestell Gibt es in dieser Producer-Consumer-Implementierung Rennbedingungen? wird hier jedoch streng aus der C-Perspektive ohne Nebenläufigkeit oder Multithreading gefragt.)

Betrachten Sie diesen minimalen Code:

#define BUFSIZ 10
char buf[BUFSIZ];

void f(int *pn)
{
    buf[*pn]++;
    *pn = (*pn + 1) % BUFSIZ;
}

int main()
{
    int n = 0;
    f(&n);
    return n; 
}

Frage: Würde das C"als ob"it @ -Regeln kann der Compiler den Code wie folgt umschreiben?

void f(int *pn)
{
    int n = *pn;
    *pn = (*pn + 1) % BUFSIZ;
    buf[n]++;
}

uf der einen Seite würde das oben Gesagte das beobachtbare Verhalten des Programms in seiner geschriebenen Form nicht änder

Auf der anderen Seite,f könnte mit einem ungültigen Index aufgerufen werden, möglicherweise von einer anderen Übersetzungseinheit:

int g()
{
    int n = -1001;
    f(&n);
}

In diesem letzteren Fall würden beide Codevarianten UB aufrufen, wenn auf das außerhalb der Grenzen liegende Array-Element zugegriffen wird. Der ursprüngliche Code würde jedoch @ verlasse*pn bei dem Wert, der an @ übergeben wif (= -1001), während der umgeschriebene Code erst nach Änderung von @ in UB-land überge*pn (bis0).

Würde ein solcher Unterschied als "beobachtbar" gelten oder gibt es im C-Standard irgendetwas, das diese Art von Codeumschreibung / -optimierung ausdrücklich zulässt oder ausschließt?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage