Does integer overflow cause undefined behavior because of memory corruption?

Я недавно прочитал, что целочисленное переполнение со знаком в C и C ++ вызывает неопределенное поведение:

Если во время вычисления выражения результат не определен математически или не находится в диапазоне представимых значений для его типа, поведение не определено.

В настоящее время я пытаюсь понять причину неопределенного поведения здесь. Я думал, что здесь происходит неопределенное поведение, потому что целое число начинает манипулировать памятью вокруг себя, когда она становится слишком большой, чтобы соответствовать базовому типу.

Поэтому я решил написать небольшую тестовую программу в Visual Studio 2015, чтобы проверить эту теорию с помощью следующего кода:

#include <stdio.h>
#include <limits.h>

struct TestStruct
{
    char pad1[50];
    int testVal;
    char pad2[50];
};

int main()
{
    TestStruct test;
    memset(&test, 0, sizeof(test));

    for (test.testVal = 0; ; test.testVal++)
    {
        if (test.testVal == INT_MAX)
            printf("Overflowing\r\n");
    }

    return 0;
}

Я использовал здесь структуру, чтобы предотвратить любые защитные проблемы Visual Studio в режиме отладки, такие как временное заполнение переменных стека и так далее. Бесконечный цикл должен вызывать несколько переполненийtest.testValи это действительно так, хотя и без каких-либо последствий, кроме самого переполнения.

Я посмотрел на дамп памяти при выполнении тестов переполнения со следующим результатом (test.testVal имел адрес памяти0x001CFAFC):

0x001CFAE5  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x001CFAFC  94 53 ca d8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Как видите, память вокруг int, которая постоянно переполняется, осталась «неповрежденной». Я проверял это несколько раз с похожим результатом. Никогда не было никакой памяти вокруг переполненного int.

Что здесь происходит? Почему не происходит повреждение памяти вокруг переменнойtest.testVal? Как это может вызвать неопределенное поведение?

Я пытаюсь понять свою ошибку и почему не происходит повреждение памяти во время целочисленного переполнения.

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

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