6.51 Получение адреса возврата или кадра функции ¶
Эти функции могут использоваться для получения информации о вызывающих функциях.
-
Встроенная функция:
void *__builtin_return_address(unsigned int level)¶ -
Эта функция возвращает адрес возврата текущей функции или одной из вызывающих её функций. Аргумент level – это количество кадров, которые нужно просмотреть вверх по стеку вызовов. Значение
0даёт адрес возврата текущей функции, значение1– адрес возврата вызывающей функции, и так далее. При инлайнинге ожидаемым поведением является возврат адреса функции, к которой происходит возврат. Для решения этой проблемы используйте атрибут функцииnoinline.Аргумент level должен быть целым константным значением.
На некоторых машинах может быть невозможно определить адрес возврата любой функции, кроме текущей; в таких случаях или при достижении вершины стека эта функция возвращает неопределённое значение. Кроме того,
__builtin_frame_addressможет использоваться для определения достижения вершины стека.Дополнительная пост-обработка возвращаемого значения может потребоваться, см.
__builtin_extract_return_addr.Представление адреса возврата в памяти может отличаться от адреса, возвращённого
__builtin_return_address. Например, на AArch64 сохранённый адрес может быть искажён подписью адреса возврата, в то время как адрес, возвращаемый__builtin_return_address, не является таковым.Вызов этой функции с ненулевым аргументом может иметь непредсказуемые последствия, включая сбой вызывающей программы. В результате вызовы, которые считаются небезопасными, диагностируются при использовании опции -Wframe-address. Такие вызовы следует выполнять только в ситуациях отладки.
На целевых платформах, где адреса кода представимы в виде
void *,void *addr = __builtin_extract_return_addr (__builtin_return_address (0));
даёт адрес кода, куда вернётся текущая функция. Например, такой адрес может использоваться с
dladdrили другими интерфейсами, которые работают с адресами кода.
-
Встроенная функция:
void *__builtin_extract_return_addr(void *addr)¶ -
Адрес, возвращённый
__builtin_return_address, может потребоваться передать через эту функцию, чтобы получить фактический закодированный адрес. Например, на 31-битной платформе S/390 старший бит должен быть замаскирован, или на платформах SPARC для получения истинного следующего выполняемого инструкцией адреса требуется добавить смещение.Если коррекция не требуется, эта функция просто пропускает addr.
-
Встроенная функция:
void *__builtin_frob_return_addr(void *addr)¶ Эта функция выполняет обратное преобразование
__builtin_extract_return_addr.
-
Встроенная функция:
void *__builtin_frame_address(unsigned int level)¶ -
Эта функция аналогична
__builtin_return_address, но возвращает адрес кадра функции, а не адрес возврата функции. Вызов__builtin_frame_addressсо значением0возвращает адрес кадра текущей функции, значение1– адрес кадра вызывающей функции и так далее.Кадр – это область в стеке, которая хранит локальные переменные и сохранённые регистры. Адрес кадра обычно является адресом первого слова, помещённого в стек функцией. Однако точное определение зависит от процессора и соглашения о вызовах. Если процессор имеет выделенный регистр указателя кадра, и функция имеет кадр, то
__builtin_frame_addressвозвращает значение регистра указателя кадра.На некоторых машинах может быть невозможно определить адрес кадра любой функции, кроме текущей; в таких случаях или при достижении вершины стека эта функция возвращает
0, если указатель кадра первого кадра правильно инициализирован кодом запуска.Вызов этой функции с ненулевым аргументом может иметь непредсказуемые последствия, включая сбой вызывающей программы. В результате вызовы, которые считаются небезопасными, диагностируются при использовании опции -Wframe-address. Такие вызовы следует выполнять только в ситуациях отладки.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/Return-Address.html