Я предполагаю, что речь идет об использовании канареечного значения для обнаружения попыток использования переполнения буфера стека.
Стек (он же канарское значение) не проверяется, пока функция не вернется.Таким образом, сначала выполняется printf
, а затем выполняется проверка стека.
Другими словами, доступ «вне границ» не обнаруживается в тот момент, когда это происходит.Таким образом, программа продолжается до тех пор, пока функция не вернется.
Вы можете поместить код, вызывающий сбой, в такую функцию, как:
void foo()
{
int x[1];
x[1] = 3; // expected SIGABRT here
printf("x[1] = %d\n",x[1]);
}
int main()
{
foo();
printf("Back in main\n");
return 0;
}
, чтобы посмотреть, завершится ли работа программы перед выводом «Back in main»