6.53 Внутренние интерфейсы очистки стека
Очистка стека предполагает взаимодействие между контекстом strub, т.е. функцией, кадр стека которой должен быть обнулен, и её вызывающими функциями. Вызывающая функция инициализирует отметку стека, контекст strub обновляет отметку в соответствии с использованием стека, а вызывающая функция обнуляет её после того, как получит управление обратно, будь то возвращением вызываемой функции или возникновением исключения.
Каждый из этих шагов выполняется с помощью отдельного встроенного вызова функции. Вызовы этих встроенных функций добавляются автоматически в ответ на атрибуты strub и параметры командной строки; их явно не ожидается вызывать из исходного кода.
Функции, реализующие встроенные функции, доступны в libgcc, но в зависимости от уровня оптимизации они расширяются внутри, корректируются с учётом встраивания и иногда объединяются/откладываются (например, передавая предоставленную вызывающей функцией отметку стека вызываемым функциям, воздерживаясь от стирания областей стека, которые вызывающая функция будет использовать), чтобы разрешить вызовы хвостов и оптимизировать размер кода.
-
Встроенная функция:
void__builtin___strub_enter(void **wmptr) Эта функция инициализирует переменную отметки стека watermark текущим верхом стека. Вызов этой встроенной функции вставляется перед входом в контекст
strub. Она остаётся как вызов функции, если оптимизация не включена.
-
Встроенная функция:
void__builtin___strub_update(void **wmptr) Эта функция обновляет переменную отметки стека watermark текущим верхом стека, если он превосходит предыдущую отметку. Вызов этой встроенной функции вставляется внутри контекстов
strub, когда может быть использовано дополнительное пространство стека. Она остаётся как вызов функции на уровнях оптимизации ниже 2.
-
Встроенная функция:
void__builtin___strub_leave(void **wmptr) Эта функция перезаписывает область памяти между текущим верхом стека и адресом, отмеченным watermark. Вызов этой встроенной функции вставляется после выхода из контекста
strub. Она остаётся как вызов функции на уровнях оптимизации ниже 3, и она защищена условием на уровне 2.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/Stack-Scrubbing.html