Пример ошибки, вызванной увеличением значения указателя NULL в UB
Этот код:
int *p = nullptr;
p++;
вызвать неопределенное поведение, как это обсуждалось вЯвляется ли увеличение нулевого указателя хорошо определенным?
Но когда я объясняю ребятам, почему они должны избегать UB, кроме того, что он говорит, что это плохо, потому что UB означает, что что-то может произойти, мне нравится иметь пример, демонстрирующий это. У меня есть тонны их для доступа к массиву за пределами, но я не мог найти ни одного для этого.
Я даже пытался
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;
}
в отдельном модуле компиляции, надеясь, что оптимизирующий компилятор пропустит тест, потому что когдаp
ноль, строкаint *p2 = p + 1;
UB, и компиляторы могут предполагать, что код не содержит UB.
Но gcc 4.8.2 (у меня нет полезного gcc 4.9) и clang 3.4.1 оба дают положительное значение!
Может ли кто-нибудь предложить более умный код или другой оптимизирующий компилятор, чтобы продемонстрировать проблему при увеличении нулевого указателя?