6.48 Получение адреса возврата или фрейма функции
Эти функции могут использоваться для получения информации о вызывающих функциях.
- Встроенная функция: void * __builtin_return_address (unsigned int level)
-
Эта функция возвращает адрес возврата текущей функции или одной из вызывающих функций. Аргумент level — это количество фреймов для сканирования вверх по стеку вызовов. Значение
0возвращает адрес возврата текущей функции, значение1возвращает адрес возврата вызывающей функции и так далее. При встраивании ожидаемое поведение заключается в том, что функция возвращает адрес функции, к которой происходит возврат. Для решения этой проблемы используйте атрибут функцииnoinline.Аргумент level должен быть константным целым числом.
На некоторых машинах может быть невозможно определить адрес возврата любой функции, кроме текущей; в таких случаях или когда вершина стека достигнута, эта функция возвращает
0или случайное значение. Кроме того,__builtin_frame_addressможет использоваться для определения того, достигнута ли вершина стека.Дополнительная постобработка возвращаемого значения может потребоваться, см.
__builtin_extract_return_addr.Вызов этой функции с ненулевым аргументом может иметь непредсказуемые последствия, включая аварийное завершение вызывающей программы. В результате вызовы, которые считаются небезопасными, диагностируются при включенном параметре -Wframe-address. Такие вызовы должны выполняться только в ситуациях отладки.
- Встроенная функция: void * __builtin_extract_return_addr (void *addr)
-
Адрес, возвращаемый
__builtin_return_address, может потребоваться пропустить через эту функцию, чтобы получить фактический закодированный адрес. Например, на 31-разрядной платформе S/390 старший бит должен быть замаскирован, а на платформах SPARC должен быть добавлен смещение для получения истинного следующего выполняемого инструкции.Если исправление не требуется, эта функция просто пропускает addr.
- Встроенная функция: void * __builtin_frob_return_address (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. Такие вызовы должны выполняться только в ситуациях отладки.
Далее: Расширения векторов, Предыдущее: Имена функций, Наверх: Расширения C [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Return-Address.html