Пример ошибки, вызванной увеличением значения указателя 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 оба дают положительное значение!

Может ли кто-нибудь предложить более умный код или другой оптимизирующий компилятор, чтобы продемонстрировать проблему при увеличении нулевого указателя?

Ответы на вопрос(0)

Ваш ответ на вопрос