Spec-Zone.ru › GCC 6

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

Spec-Zone.ru

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