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_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-9.5.0/gcc/Return-Address.html