C Программа прекращена только после ее выполнения в GCC. - PullRequest
0 голосов
/ 20 мая 2018

Я преднамеренно сделал доступ к индексу вне привязки в моей программе, который приведен ниже:

#include<stdio.h>

int main()
{
    int x[1];

    x[1] = 3; // expected SIGABRT here
    printf("x[1] = %d\n",x[1]);

    return 0;
}

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

x[1] = 3
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)

Я знаю, что C не имеет функции проверки вне границ.Мой вопрос: почему он не завершился после выполнения x [1] = 3, не перейдя к следующему утверждению?

1 Ответ

0 голосов
/ 20 мая 2018

Я предполагаю, что речь идет об использовании канареечного значения для обнаружения попыток использования переполнения буфера стека.

Стек (он же канарское значение) не проверяется, пока функция не вернется.Таким образом, сначала выполняется 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»

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