7.7 Внутренние интерфейсы очистки стека
Очистка стека предполагает взаимодействие между контекстом 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-15.3.0/gcc/Stack-Scrubbing.html