Beispiel für einen durch UB verursachten Fehler beim Inkrementieren eines NULL-Zeigers

Dieser Code:

int *p = nullptr;
p++;

Ursache undefiniertes Verhalten, wie es in @ besprochen wur Wird ein Nullzeiger inkrementiert, der genau definiert ist?

Aber wenn ich meinen Kollegen erkläre, warum sie UB meiden sollten, sage ich nicht nur, dass es schlecht ist, weil UB bedeutet, dass alles passieren kann. Ich hätte gerne ein Beispiel, das es demonstriert. Ich habe Tonnen von ihnen für den Zugriff auf ein Array über die Grenzen hinaus, aber ich konnte kein einziges dafür finden.

Ich habe es sogar versucht

int testptr(int *p) {
    intptr_t ip;
    int *p2 = p + 1;
    ip = (intptr_t) p2;
    if (p == nullptr) {
        ip *= 2;
    }
    else {
        ip *= -2;
    } return (int) ip;
}

in einer separaten Kompilierungseinheit in der Hoffnung, dass ein optimierender Compiler den Test überspringen würde, weil wennp ist null, Zeileint *p2 = p + 1; ist UB, und Compiler dürfen davon ausgehen, dass der Code kein UB enthält.

Aber gcc 4.8.2 (ich habe kein brauchbares gcc 4.9) und clang 3.4.1 antworten beide auf einen positiven Wert!

Kann jemand etwas clevereren Code oder einen anderen optimierenden Compiler vorschlagen, um ein Problem beim Inkrementieren eines Nullzeigers aufzuzeigen?