Почему GDB показывает, что состояние завершено нормально, когда индекс массива выходит за пределы? - PullRequest
0 голосов
/ 10 февраля 2020
void main()
{
        int arr[3] = {1,2,3,4,5,6};
        for(int i=0;i<6;i++)
        {
                printf("arr is %d\n", arr[i]);
        }
}

Вот вывод из GDB:

Starting program: /home/mayank/practice/test1 
arr is 1
arr is 2
arr is 3
arr is -1192452352
arr is 1079472019
arr is 1431652464

[Inferior 1 (process 29328) exited normally]
(gdb) 

1 Ответ

1 голос
/ 10 февраля 2020

Если вы обращаетесь к массиву вне границ, вы получаете неопределенное поведение. И неопределенное поведение - это просто: undefined . Ничего не может произойти, или ваша программа может взломать sh, все зависит или нет, если Луна находится в седьмом доме, или знаменитые носовые демоны могут вас беспокоить.

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

Пока вы не дадите GDB указывать вашему приложению следить за обращениями за пределами массива, GDB не заметит этого.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...