O excesso de número inteiro causa comportamento indefinido devido a corrupção de memória?

Li recentemente que o excesso de número inteiro assinado em C e C ++ causa um comportamento indefinido:

Se durante a avaliação de uma expressão, o resultado não for matematicamente definido ou não estiver no intervalo de valores representáveis para seu tipo, o comportamento será indefinido.

Atualmente, estou tentando entender o motivo do comportamento indefinido aqui. Eu pensei que comportamento indefinido ocorre aqui porque o número inteiro começa a manipular a memória em torno de si quando fica grande demais para caber no tipo subjacente.

Decidi escrever um pequeno programa de teste no Visual Studio 2015 para testar essa teoria com o seguinte código:

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

Eu usei uma estrutura aqui para evitar problemas de proteção do Visual Studio no modo de depuração, como o preenchimento temporário de variáveis de pilha e assim por diante. O loop interminável deve causar vários estouros detest.testVale, de fato, embora sem outras consequências além do próprio estouro.

Dei uma olhada no despejo de memória durante a execução dos testes de estouro com o seguinte resultado (test.testVal tinha um endereço de memória de0x001CFAFC):

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

Como você vê, a memória em torno do int que está continuamente transbordando permaneceu "intacta". Eu testei isso várias vezes com saída semelhante. Nunca houve nenhuma memória em torno do transbordamento int danificado.

o que acontece aqui? Por que não há danos causados à memória em torno da variáveltest.testVal? Como isso pode causar um comportamento indefinido?

Estou tentando entender meu erro e por que não há corrupção de memória durante um estouro de número inteiro.

questionAnswers(6)

yourAnswerToTheQuestion