Spec-Zone.ru › GCC 11

Next: Использование инструкций векторов через встроенные функции, Previous: Имена функций в виде строк, Up: Расширения для семейства языков C [Оглавление][Индекс]

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. Такие вызовы следует выполнять только в ситуациях отладки.

Next: Использование инструкций векторов через встроенные функции, Previous: Имена функций в виде строк, Up: Расширения для семейства языков C [Оглавление][Индекс]

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API