2016-06-10 3 views
-1

Есть некоторые трюки, практикующие программисты на С ++, знают, как «Scope Guard» и, возможно, другие, связанные с ссылками на временные.Есть ли хороший способ уничтожить стек вызывающего в C++?

Я не практикующий программист на С ++, но я хотел бы спросить (из любопытства), если есть способ, которым сторонняя библиотека может каким-то образом повредить стек вызывающих. Может быть, это связано с внезапными деструкторами или какой-то другой магией, охватывающей всю жизнь?

+1

Конечно, сторонняя библиотека может легко сдуть стек вызывающего абонента. Для написания багги-кода не требуется много навыков. Настоящий навык заключается в написании кода без ошибок. Это сложная часть. –

+0

'exit (0)' стремится уничтожить стек (и что-то еще). На самом деле, я не думаю, что это хороший вопрос. – MSalters

+0

@MSalters Благодарим вас за отзыв. Не стесняйтесь закрыть вопрос. Мое первоначальное намерение было больше связано с ссылками на возвращаемые временные и деструкторы и т. Д. – rostamn739

ответ

3

путь библиотека третья сторона может повредить стек позвонившим

Когда код с третьим проходом часть библиотеки - будь то инициализация рутина для динамически загружаемой библиотеки, что загрузчик ОС знает, позвонить, или явный вызов из кода клиентского приложения - обычно (в большинстве моделей безопасности ОС/реализаций) имеется столько возможностей, чтобы вставлять стек (или любую другую память) в качестве самого клиентского приложения; например:

void library_code() 
{ 
    char x; 
    char* p = &x; 
    *(p - 2) = 23; // undefined behaviour - may do nothing or anything, 
        // but usually overwrites stack or SIGSEGVs 
    *(p + 54) = 99; // stacks might grow up or down, so may have to + or - 
        // from &x to address in-use stack memory... 
} 
+0

Спасибо! Я предполагаю, что это в равной степени относится к конкретной области вызывающего абонента (или, скажем, к кадру) стека вызовов. Не могли бы вы привести пример с участием областей/lifetime/RAII? :) – rostamn739

+1

Стек имеет тенденцию быть областью непрерывной памяти, а не разделенными адресами; фреймы - это просто байты, используемые в настоящее время определенной функцией в текущем стеке вызовов, в котором может быть восстановлено несколько сохраненных регистров CPU/GPU после вызова, а также адрес возврата, за которым следует функциональные параметры и локальные переменные что компилятор решил поставить стек. Re scopes/lifetime/RAII - любой деструктор объекта, размещенного в стеке, может выполнять один и тот же тип разбиения стека с помощью указателя 'this'. –

Смежные вопросы