Exemplo de erro causado por UB ao incrementar um ponteiro NULL
Este código:
int *p = nullptr;
p++;
causar comportamento indefinido, conforme discutido emO incremento de um ponteiro nulo está bem definido?
Mas, ao explicar aos colegas por que eles devem evitar o UB, além de dizer que é ruim porque o UB significa que qualquer coisa pode acontecer, eu gosto de ter um exemplo demonstrando isso. Eu tenho toneladas deles para acessar uma matriz além dos limites, mas não consegui encontrar uma única para isso.
Eu até tentei
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;
}
em uma unidade de compilação separada, esperando que um compilador otimizador pule o teste porque, quandop
é nulo, linhaint *p2 = p + 1;
é UB, e os compiladores podem assumir que o código não contém UB.
Mas o gcc 4.8.2 (não tenho o gcc 4.9 utilizável) e o clang 3.4.1 respondem a um valor positivo!
Alguém poderia sugerir um código mais inteligente ou outro compilador de otimização para exibir um problema ao incrementar um ponteiro nulo?