Ejemplo de error causado por UB de incrementar un puntero NULL

Este código:

int *p = nullptr;
p++;

causar un comportamiento indefinido como se discutió en¿Incrementar un puntero nulo está bien definido?

Pero al explicar a los compañeros por qué deberían evitar UB, además de decir que es malo porque UB significa que cualquier cosa podría suceder, me gusta tener algún ejemplo que lo demuestre. Tengo toneladas de ellos para acceder a una matriz más allá de los límites, pero no pude encontrar uno solo para eso.

Incluso intenté

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;
}

en una unidad de compilación separada con la esperanza de que un compilador optimizador omita la prueba porque cuandop es nulo, líneaint *p2 = p + 1; es UB, y los compiladores pueden asumir que el código no contiene UB.

Pero gcc 4.8.2 (no tengo gcc 4.9 utilizable) y clang 3.4.1 ¡ambos responden un valor positivo!

¿Podría alguien sugerir un código más inteligente u otro compilador de optimización para exhibir un problema al incrementar un puntero nulo?

Respuestas a la pregunta(4)

Su respuesta a la pregunta