6.31.1 Атрибуты общих функций
Следующие атрибуты поддерживаются на большинстве целевых платформ.
alias ("target")-
Атрибут
aliasзаставляет объявление генерироваться как псевдоним для другого символа, который должен быть указан. Например,void __f () { /* Do something. */; } void f () __attribute__ ((weak, alias ("__f")));определяет ‘f’ как слабый псевдоним для ‘__f’. В C++, должно использоваться закодированное имя целевой платформы. Ошибка возникает, если ‘__f’ не определено в том же трансляционном блоке.
Для этого атрибута требуется поддержка ассемблера и объектных файлов, и он может быть недоступен на всех целевых платформах.
aligned (alignment)-
Этот атрибут задаёт минимальное выравнивание для функции, измеряемое в байтах.
Вы не можете использовать этот атрибут для уменьшения выравнивания функции, только для его увеличения. Однако, когда вы явно задаёте выравнивание функции, это переопределяет эффект опции -falign-functions (см. Параметры оптимизации) для этой функции.
Обратите внимание, что эффективность атрибутов
alignedможет быть ограничена внутренними ограничениями вашего компоновщика. На многих системах компоновщик может только обеспечить выравнивание функций до определенного максимального значения. (Для некоторых компоновщиков максимальное поддерживаемое выравнивание может быть очень малым.) Обратитесь к документации вашего компоновщика для получения дополнительной информации.Атрибут
alignedтакже может использоваться для переменных и полей (см. Атрибуты переменных). alloc_align-
Атрибут
alloc_alignиспользуется для указания компилятору, что возвращаемое значение функции указывает на память, где минимальное выравнивание возвращаемого указателя задаётся одним из параметров функции. GCC использует эту информацию для улучшения анализа выравнивания указателей.Параметр функции, обозначающий выравнивание выделенной памяти, задаётся одним целочисленным аргументом, число которого является аргументом атрибута. Нумерация аргументов начинается с единицы.
Например,
void* my_memalign(size_t, size_t) __attribute__((alloc_align(1)))
объявляет, что
my_memalignвозвращает память с минимальным выравниванием, заданным параметром 1. alloc_size-
Атрибут
alloc_sizeиспользуется для указания компилятору, что возвращаемое значение функции указывает на память, где размер задаётся одним или двумя параметрами функции. GCC использует эту информацию для повышения корректности__builtin_object_size.Параметр(ы) функции, обозначающий(ие) выделенный размер, задаются одним или двумя целочисленными аргументами, предоставленными атрибуту. Размер выделенной памяти либо равен значению единственного указанного параметра функции, либо равен произведению двух указанных параметров функции. Нумерация аргументов начинается с единицы.
Например,
void* my_calloc(size_t, size_t) __attribute__((alloc_size(1,2))) void* my_realloc(void*, size_t) __attribute__((alloc_size(2)))
объявляет, что
my_callocвозвращает память размером, равным произведению параметров 1 и 2, аmy_reallocвозвращает память размером, равным параметру 2. always_inline-
В общем случае функции не включаются встраиваемыми, если не указана оптимизация. Для функций, объявленных встраиваемыми, этот атрибут встраивает функцию независимо от любых ограничений, которые иначе применяются к встраиванию. Невозможность встроить такую функцию диагностируется как ошибка. Обратите внимание, что если такая функция вызывается косвенно, компилятор может или не может встроить её в зависимости от уровня оптимизации, и невозможность встроить косвенный вызов может или не может быть диагностирована.
artificial-
Этот атрибут полезен для небольших встраиваемых обёртки, которые при возможности должны отображаться во время отладки как единица. В зависимости от формата отладочной информации он либо помечает функцию как искусственную, либо использует местоположение вызывающей функции для всех инструкций внутри встраиваемого тела.
assume_aligned-
Атрибут
assume_alignedиспользуется для указания компилятору, что возвращаемое значение функции указывает на память, где минимальное выравнивание возвращаемого указателя задаётся первым аргументом. Если атрибут имеет два аргумента, второй аргумент — это смещение несовпадения.Например
void* my_alloc1(size_t) __attribute__((assume_aligned(16))) void* my_alloc2(size_t) __attribute__((assume_aligned(32, 8)))
объявляет, что
my_alloc1возвращает 16-байтовый выровненный указатель, аmy_alloc2возвращает указатель, чьё значение по модулю 32 равно 8. bnd_instrument-
Атрибут
bnd_instrumentдля функций используется для информирования компилятора о том, что функция должна быть инструментирована при компиляции с опцией -fchkp-instrument-marked-only. bnd_legacy-
Атрибут
bnd_legacyдля функций используется для информирования компилятора о том, что функция не должна быть инструментирована при компиляции с опцией -fcheck-pointer-bounds. cold-
Атрибут
coldдля функций используется для информирования компилятора о том, что функция, скорее всего, не будет выполнена. Функция оптимизируется по размеру, а не по скорости, и на многих платформах она размещается в специальной подсекции секции текста, так что все холодные функции находятся близко друг к другу, улучшая локальность кода для нехолодных частей программы. Пути, ведущие к вызовам холодных функций в коде, отмечаются механизмом предсказания ветвлений как маловероятные. Поэтому полезно помечать функции, используемые для обработки маловероятных условий, такие какperror, как холодные, чтобы улучшить оптимизацию горячих функций, которые в редких случаях вызывают помеченные функции.Если доступна обратная связь с профилем через -fprofile-use, холодные функции автоматически обнаруживаются, и этот атрибут игнорируется.
const-
Многие функции не проверяют никаких значений, кроме своих аргументов, и не имеют эффектов, кроме возвращаемого значения. В основном это просто немного более строгий класс, чем атрибут
pureниже, так как функции не разрешено читать глобальную память.Обратите внимание, что функция, имеющая указательные аргументы и проверяющая данные, к которым указывают эти аргументы, не должна быть объявлена как
const. Аналогично, функция, вызывающая не-constфункцию, обычно не должна бытьconstФункцияconst, обычно, не должна возвращатьvoid. constructordestructorconstructor (priority)destructor (priority)-
Атрибут
constructorвызывает функцию автоматически перед тем, как выполнение войдёт вmain (). Аналогично, атрибутdestructorвызывает функцию автоматически после того, какmain ()завершится или будет вызваноexit (). Функции с этими атрибутами полезны для инициализации данных, которые неявно используются во время выполнения программы.Вы можете указать необязательный целочисленный приоритет для управления порядком выполнения конструкторов и деструкторов. Конструктор с меньшим номером приоритета выполняется перед конструктором с большим номером приоритета; обратное соотношение справедливо для деструкторов. Таким образом, если у вас есть конструктор, который выделяет ресурс, и деструктор, который освобождает тот же ресурс, обе функции, как правило, имеют одинаковый приоритет. Приоритеты конструкторов и деструкторов совпадают с приоритетами объектов C++ на уровне пространства имён (см. Атрибуты C++).
Эти атрибуты в настоящее время не реализованы для Objective-C.
deprecateddeprecated (msg)-
Атрибут
deprecatedприводит к появлению предупреждения, если функция используется где-либо в исходном файле. Это полезно для идентификации функций, которые, как ожидается, будут удалены в будущей версии программы. Предупреждение также включает местоположение объявления устаревшей функции, что позволяет пользователям легко найти дополнительную информацию о том, почему функция устарела или что им следует делать вместо этого. Обратите внимание, что предупреждения появляются только при использовании:int old_fn () __attribute__ ((deprecated)); int old_fn (); int (*fn_ptr)() = old_fn;
приводит к появлению предупреждения на строке 3, но не на строке 2. Необязательный аргумент msg, который должен быть строкой, выводится в предупреждении, если он присутствует.
Атрибут
deprecatedтакже может использоваться для переменных и типов (см. Атрибуты переменных, см. Атрибуты типов). error ("message")warning ("message")-
Если атрибут
errorилиwarningиспользуется в объявлении функции, и вызов такой функции не исключается через удаление неиспользуемого кода или другие оптимизации, диагностируется ошибка или предупреждение (соответственно), включающее сообщение. Это полезно для проверки во время компиляции, особенно в сочетании с__builtin_constant_pи встраиваемыми функциями, где проверка аргументов встраиваемой функции невозможна с помощьюextern char [(condition) ? 1 : -1];уловок.Хотя можно оставить функцию неопределённой и тем самым вызвать ошибку компоновки (для определения функции с сообщением в разделе
.gnu.warning*), при использовании этих атрибутов проблема диагностируется раньше и с точным местоположением вызова, даже в случае присутствия встраиваемых функций или при отсутствии вывода отладочной информации. externally_visible-
Этот атрибут, прикреплённый к глобальной переменной или функции, делает опцию командной строки -fwhole-program недействительной, так что объект остаётся видимым за пределами текущей единицы компиляции.
Если -fwhole-program используется вместе с -flto и
goldиспользуется в качестве плагина компоновщика, атрибутыexternally_visibleавтоматически добавляются к функциям (ещё не к переменным из-за текущей проблемыgold), к которым осуществляется доступ за пределами объектов LTO в соответствии с файлом разрешений, созданнымgold. Для других компоновщиков, которые не могут создать файл разрешений, явные атрибутыexternally_visibleвсё ещё необходимы. flatten-
В общем случае встраивание в функцию ограничено. Для функции, помеченной этим атрибутом, каждый вызов внутри этой функции встраивается, если это возможно. Будет ли сама функция рассматриваться для встраивания, зависит от её размера и текущих параметров встраивания.
format (archetype, string-index, first-to-check)
-
Атрибут
formatуказывает, что функция принимает аргументы типаprintf,scanf,strftimeилиstrfmonстиля, которые должны быть проверены на соответствие строке формата. Например, объявление:extern int my_printf (void *my_object, const char *my_format, ...) __attribute__ ((format (printf, 2, 3)));приводит к тому, что компилятор проверяет аргументы в вызовах функции
my_printfна соответствие строке форматаprintfстиляmy_format.Параметр archetype определяет, как интерпретируется строка формата, и должен быть
printf,scanf,strftime,gnu_printf,gnu_scanf,gnu_strftimeилиstrfmon. (Можно также использовать__printf__,__scanf__,__strftime__или__strfmon__. ) На целевых платформах MinGW также присутствуютms_printf,ms_scanfиms_strftime. Значения archetype, такие какprintf, относятся к форматам, поддерживаемым системной библиотекой C runtime, в то время как значения, начинающиеся с 'gnu_', всегда относятся к форматам, поддерживаемым GNU C Library. На целевых платформах Microsoft Windows значения, начинающиеся с 'ms_', относятся к форматам, поддерживаемым библиотекой msvcrt.dll. Параметр string-index указывает, какой аргумент является аргументом строки формата (начиная с 1), а first-to-check — номер первого аргумента для проверки на соответствие строке формата. Для функций, где аргументы недоступны для проверки (например,vprintf), укажите третий параметр как ноль. В этом случае компилятор проверяет только соответствие строки формата. Для форматовstrftimeтретий параметр должен быть равен нулю. Поскольку у нестатических методов C++ есть неявный аргументthis, аргументы таких методов следует считать с двух, а не с одного, при указании значений для string-index и first-to-check.В приведённом примере строка формата (
my_format) является вторым аргументом функцииmy_print, а аргументы для проверки начинаются с третьего аргумента, поэтому правильные параметры для атрибута format — 2 и 3.Атрибут
formatпозволяет идентифицировать собственные функции, принимающие строки формата в качестве аргументов, чтобы GCC мог проверять вызовы этих функций на ошибки. Компилятор всегда (если не используется -ffreestanding или -fno-builtin) проверяет форматы для стандартных функций библиотекиprintf,fprintf,sprintf,scanf,fscanf,sscanf,strftime,vprintf,vfprintfиvsprintf, когда такие предупреждения запрошены (с помощью -Wformat), поэтому нет необходимости изменять заголовочный файл stdio.h. В режиме C99 также проверяются функцииsnprintf,vsnprintf,vscanf,vfscanfиvsscanf. За исключением строго совместимых режимов стандарта C, также проверяется функция X/Openstrfmon, а такжеprintf_unlockedиfprintf_unlocked. См. Параметры, управляющие диалектом C.Для диалектов Objective-C распознаётся
NSString(или__NSString__) в том же контексте. Объявления, включающие эти атрибуты format, анализируются для правильности синтаксиса, однако результат проверки таких строк формата пока не определён и не выполняется этой версией компилятора.Целевая платформа может также предоставлять дополнительные типы проверок формата. См. Проверки формата, специфичные для конкретных целевых платформ.
format_arg (string-index)-
Атрибут
format_argуказывает, что функция принимает строку формата для функции стиляprintf,scanf,strftimeилиstrfmonи модифицирует её (например, для перевода на другой язык), так что результат может быть передан функции стиляprintf,scanf,strftimeилиstrfmon(с остальными аргументами функции формата такими же, как и для немодифицированной строки). Например, объявление:extern char * my_dgettext (char *my_domain, const char *my_format) __attribute__ ((format_arg (2)));приводит к тому, что компилятор проверяет аргументы в вызовах функции типа
printf,scanf,strftimeилиstrfmon, где аргументом строки формата является вызов функцииmy_dgettext, на соответствие строке форматаmy_format. Если атрибутformat_argне был указан, компилятор мог бы определить только то, что аргумент строки формата не является константой; это вызвало бы предупреждение при использовании -Wformat-nonliteral, но вызовы нельзя было бы проверить без атрибута.Параметр string-index указывает, какой аргумент является аргументом строки формата (начиная с единицы). Поскольку у нестатических методов C++ есть неявный аргумент
this, аргументы таких методов следует считать с двух.Атрибут
format_argпозволяет идентифицировать собственные функции, модифицирующие строки формата, чтобы GCC мог проверять вызовы функции типаprintf,scanf,strftimeилиstrfmon, операнды которых являются вызовом одной из собственных функций. Компилятор всегда обрабатываетgettext,dgettext, иdcgettextтаким образом, за исключением случаев, когда строгая поддержка стандарта ISO C запрошена с помощью -ansi или соответствующего параметра -std, или используется -ffreestanding или -fno-builtin. См. Параметры, управляющие диалектом C.Для диалектов Objective-C атрибут
format-argможет ссылаться наNSStringссылку для совместимости с атрибутомformatвыше.Целевая платформа также может допускать дополнительные типы в атрибутах
format-arg. См. Проверки формата, специфичные для конкретных целевых платформ. gnu_inline-
Этот атрибут следует использовать с функцией, также объявленной с ключевым словом
inline. Он сообщает GCC рассматривать функцию так, как будто она определена в режиме gnu90, даже при компиляции в режиме C99 или gnu99.Если функция объявлена
extern, то это определение функции используется только для встраивания. В любом случае функция не компилируется как самостоятельная функция, даже если вы явно берёте её адрес. Такой адрес становится внешней ссылкой, как если бы вы только объявили функцию, но не определили её. Это почти соответствует макросу. Способ использования заключается в размещении определения функции в заголовочном файле с этим атрибутом и размещении другой копии функции безexternв файле библиотеки. Определение в заголовочном файле вызывает встраивание большинства вызовов функции. Если какие-либо вызовы функции остаются, они ссылаются на единственную копию в библиотеке. Обратите внимание, что два определения функций могут быть не совсем одинаковыми, хотя если они не имеют одинакового эффекта, ваша программа может работать необычно.В C, если функция не
externи неstatic, то функция компилируется как самостоятельная функция, а также встраивается при возможности.Вот как GCC традиционно обрабатывал функции, объявленные
inline. Поскольку ISO C99 определяет другую семантику дляinline, этот атрибут функции предоставляется как переходная мера и как полезная функция сама по себе. Этот атрибут доступен в GCC 4.1.3 и более поздних версиях. Он доступен, если определён один из препроцессорных макросов__GNUC_GNU_INLINE__или__GNUC_STDC_INLINE__. См. Функция inline такая же быстрая, как макрос.В C++, этот атрибут никак не зависит от
extern, но для включения его специального поведения всё равно требуется ключевое словоinline. hot-
Атрибут
hotдля функции используется для информирования компилятора о том, что функция является горячей точкой в скомпилированной программе. Функция оптимизируется более агрессивно, и на многих целевых платформах она размещается в специальном разделе секции текста, так что все горячие функции находятся рядом, улучшая локальность.Когда доступна обратная связь профилей через -fprofile-use, горячие функции автоматически обнаруживаются, и этот атрибут игнорируется.
ifunc ("resolver")-
Атрибут
ifuncиспользуется для маркировки функции как косвенной функции, используя расширение типа символа STT_GNU_IFUNC к стандарту ELF. Это позволяет динамически определить значение символа во время загрузки, и для конкретного процессора или других системных характеристик, определённых тогда, может быть выбран оптимизированный вариант процедуры. Для использования этого атрибута сначала определите доступные реализующие функции и функцию разрешения, возвращающую указатель на выбранную реализующую функцию. Объявления реализующих функций должны соответствовать API реализуемой функции, объявление функции разрешения должно быть функцией, возвращающей указатель на функцию типа void, возвращающую void:void *my_memcpy (void *dst, const void *src, size_t len) { … } static void (*resolve_memcpy (void)) (void) { return my_memcpy; // we'll just always select this routine }Экспортируемый заголовочный файл, объявляющий вызываемую пользователем функцию, должен содержать:
extern void *memcpy (void *, const void *, size_t);
позволяя пользователю вызывать её как обычную функцию, не зная о реализации. Наконец, косвенная функция должна быть определена в том же модуле трансляции, что и функция разрешения:
void *memcpy (void *, const void *, size_t) __attribute__ ((ifunc ("resolve_memcpy")));Косвенные функции не могут быть слабыми. Для использования этой функции необходимы утилиты binutils версии 2.20.1 или выше и GNU C Library версии 2.11.1 или выше.
interruptinterrupt_handler-
Многие бэкэнды GCC поддерживают атрибуты для указания того, что функция является обработчиком прерываний, что сообщает компилятору генерировать последовательности входа и выхода из функции, отличные от последовательностей обычных функций. Точная синтаксис и поведение зависят от целевой платформы; подробности см. в соответствующих подразделах.
leaf
-
Вызовы внешних функций с этим атрибутом должны возвращаться в текущий модуль компиляции только с помощью оператора return или обработки исключений. В частности, функция-лист не может вызывать функции обратного вызова, переданные ей из текущего модуля компиляции, напрямую вызывать функции, экспортированные модулем, или
longjmpв модуль. Функции-листы все еще могут вызывать функции из других модулей компиляции, и поэтому они не обязательно являются листами в том смысле, что они не содержат никаких вызовов функций вообще.Этот атрибут предназначен для функций библиотек для улучшения анализа потока данных. Компилятор принимает подсказку о том, что любые данные, не покидающие текущий модуль компиляции, не могут использоваться или изменяться функцией-листом. Например, функция
sinявляется функцией-листом, ноqsort— нет.Обратите внимание, что функции-листы могут косвенно запускать обработчик сигналов, определенный в текущем модуле компиляции, который использует статические переменные. Аналогично, при использовании ленивого разрешения символов функции-листы могут вызывать косвенные функции, функция разрешения или функция реализации которых определены в текущем модуле компиляции и используют статические переменные. Нет стандартного способа написать такой обработчик сигналов, функцию разрешения или функцию реализации, и лучше всего вы можете сделать, это убрать атрибут
leafили пометить все такие статические переменныеvolatile. Наконец, для систем на основе ELF, которые поддерживают интерпозицию символов, следует соблюдать осторожность, чтобы функции, определенные в текущем модуле компиляции, не интерпозировали другие символы неожиданным образом на основе определенного режима стандартов и определенных макросов проверок функций; в противном случае будет добавлен непреднамеренный обратный вызов.Этот атрибут не влияет на функции, определенные в текущем модуле компиляции. Это позволяет легко объединить несколько модулей компиляции в один, например, с помощью оптимизации на этапе компоновки. По этой причине этот атрибут запрещено применять к типам для аннотирования косвенных вызовов.
malloc-
Это сообщает компилятору, что функция является функцией типа
malloc, т. е. что указатель P, возвращаемый функцией, не может ссылаться на какой-либо другой указатель, действительный при возвращении функции, и, кроме того, ни один указатель на действительные объекты не появляется в любом хранилище, адресуемом P.Использование этого атрибута может улучшить оптимизацию. Функции, подобные
mallocиcalloc, обладают этим свойством, потому что они возвращают указатель на неинициализированное или обнуленное хранилище. Однако функции, подобныеrealloc, не обладают этим свойством, так как они могут возвращать указатель на хранилище, содержащее указатели. no_icf-
Этот атрибут функции предотвращает объединение функции с другой семантически эквивалентной функцией.
no_instrument_function-
Если указано -finstrument-functions, для большинства функций, скомпилированных пользователем, генерируются профилирующие вызовы функций при входе и выходе. Функции с этим атрибутом не инструментируются таким образом.
no_reorder-
Не переупорядочивайте функции или переменные, помеченные
no_reorderдруг относительно друга или верхнеуровневые инструкции ассемблера в исполняемом файле. Фактический порядок в программе будет зависеть от командной строки компоновщика. Статические переменные, помеченные таким образом, также не удаляются. Это оказывает аналогичное действие, как опция -fno-toplevel-reorder, но применяется только к помеченным символам. no_sanitize_addressno_address_safety_analysis-
Атрибут
no_sanitize_addressдля функций используется для информирования компилятора о том, что он не должен инструментировать обращения к памяти в функции при компиляции с опцией -fsanitize=address.no_address_safety_analysis— устаревший псевдоним атрибутаno_sanitize_address, в новом коде следует использоватьno_sanitize_address. no_sanitize_thread-
Атрибут
no_sanitize_threadдля функций используется для информирования компилятора о том, что он не должен инструментировать обращения к памяти в функции при компиляции с опцией -fsanitize=thread. no_sanitize_undefined-
Атрибут
no_sanitize_undefinedдля функций используется для информирования компилятора о том, что он не должен проверять неопределенное поведение в функции при компиляции с опцией -fsanitize=undefined. no_split_stack-
Если задана опция -fsplit-stack, у функций есть небольшой пролог, который определяет, следует ли разделять стек. Функции с атрибутом
no_split_stackне имеют этого пролога и поэтому могут работать только с небольшим объемом доступной памяти стека. no_stack_limit-
Этот атрибут локально переопределяет опции командной строки -fstack-limit-register и -fstack-limit-symbol; он имеет эффект отключения проверки предела стека в функции, к которой он применяется.
noclone-
Этот атрибут функции предотвращает рассмотрение функции для клонирования — механизма, который создает специализированные копии функций и который (в настоящее время) выполняется межпроцедурной постоянной проработкой.
noinline-
Этот атрибут функции предотвращает рассмотрение функции для встраивания. Если функция не имеет побочных эффектов, существуют оптимизации, отличные от встраивания, которые приводят к оптимизации вызовов функций, хотя вызов функции активен. Чтобы предотвратить оптимизацию таких вызовов, поместите
asm ("");(см. Расширенный ассемблер) в вызываемую функцию, чтобы служить специальным побочным эффектом.
nonnull (arg-index, …)-
Атрибут
nonnullуказывает, что некоторые параметры функции должны быть указателями, не равными нулю. Например, объявление:extern void * my_memcpy (void *dest, const void *src, size_t len) __attribute__((nonnull (1, 2)));заставляет компилятор проверять, что в вызовах
my_memcpyаргументы dest и src не равны нулю. Если компилятор определяет, что указатель с нулевым значением передается в слот аргумента, помеченный как не равный нулю, и опция -Wnonnull включена, выводится предупреждение. Компилятор также может выбрать выполнение оптимизаций на основе знания о том, что определенные аргументы функций никогда не будут нулевыми.Если для атрибута
nonnullне указан список индексов аргументов, все указатели-аргументы помечаются как не равные нулю. Для иллюстрации, следующее объявление эквивалентно предыдущему примеру:extern void * my_memcpy (void *dest, const void *src, size_t len) __attribute__((nonnull)); noplt-
Атрибут
nopltявляется обратной стороной опции -fno-plt. Вызовы функций, помеченных этим атрибутом в позиционно-независимом коде, не используют PLT./* Externally defined function foo. */ int foo () __attribute__ ((noplt)); int main (/* … */) { /* … */ foo (); /* … */ }
Атрибут
nopltдля функцииfooсообщает компилятору, что функцияfooопределена внешним образом и что вызовfooдолжен избегать PLT в позиционно-независимом коде.В позиционно-зависимом коде некоторые целевые платформы также преобразуют вызовы функций, помеченных как не использующие PLT, в использование GOT вместо него.
noreturn-
Некоторые стандартные функции библиотеки, такие как
abortиexit, не могут возвращаться. GCC автоматически знает об этом. Некоторые программы определяют свои собственные функции, которые никогда не возвращаются. Вы можете объявить ихnoreturnдля сообщения об этом факте компилятору. Например,void fatal () __attribute__ ((noreturn)); void fatal (/* … */) { /* … */ /* Print error message. */ /* … */ exit (1); }
Ключевое слово
noreturnсообщает компилятору, чтоfatalне может возвратиться. Тогда он может оптимизировать, не учитывая то, что произойдёт, еслиfatalвернётся. Это делает код немного лучше. Более важно, что это помогает избежать ложных предупреждений о неинициализированных переменных.Ключевое слово
noreturnне влияет на исключительный путь, когда он применим: функция, помеченнаяnoreturn, всё равно может возвратиться вызывающей функции, выбросив исключение или вызвавlongjmp.Не предполагайте, что регистры, сохранённые вызывающей функцией, восстанавливаются перед вызовом функции
noreturn.Не имеет смысла, чтобы функция
noreturnимела тип возвращаемого значения, отличный отvoid. nothrow-
Атрибут
nothrowиспользуется для информирования компилятора о том, что функция не может выбросить исключение. Например, большинство функций в стандартной библиотеке C гарантированно не выбросят исключение, за исключениемqsortиbsearch, принимающих указатели на функции в качестве аргументов. optimize-
Атрибут
optimizeиспользуется для указания того, что функция должна компилироваться с различными параметрами оптимизации, чем указанные в командной строке. Аргументы могут быть числами или строками. Числа считаются уровнем оптимизации. Строки, начинающиеся сO, предполагаются параметрами оптимизации, а остальные — предполагаются используемыми с префиксом-f. Вы также можете использовать директиву ‘#pragma GCC optimize’ для установки параметров оптимизации, влияющих на более чем одну функцию. Подробности о директиве ‘#pragma GCC optimize’ см. в разделе Функционально-специфические опции директивы #pragma.Это может использоваться, например, для того, чтобы часто выполняемые функции компилировались с более агрессивными параметрами оптимизации, которые создают более быстрый и больший код, в то время как другие функции могут компилироваться с менее агрессивными параметрами.
pure
-
Многие функции не имеют эффектов, кроме возвращаемого значения, и их возвращаемое значение зависит только от параметров и/или глобальных переменных. Такая функция может быть подвергнута оптимизации устранения общих подвыражений и оптимизации циклов так же, как и арифметический оператор. Эти функции должны быть объявлены с атрибутом
pure. Например,int square (int) __attribute__ ((pure));
указывает, что гипотетическая функция
squareможно вызывать меньше раз, чем указано в программе.Некоторые общие примеры чистых функций —
strlenилиmemcmp. Интересными нечистыми функциями являются функции с бесконечными циклами или те, которые зависят от переменных volatile или других системных ресурсов, которые могут измениться между двумя последовательными вызовами (например,feofв многопоточной среде). returns_nonnull-
Атрибут
returns_nonnullуказывает, что возвращаемое значение функции должно быть указателем, отличным от нуля. Например, объявление:extern void * mymalloc (size_t len) __attribute__((returns_nonnull));
позволяет компилятору оптимизировать вызывающие функции, зная, что возвращаемое значение никогда не будет нулевым.
returns_twice-
Атрибут
returns_twiceсообщает компилятору, что функция может возвращать значение более одного раза. Компилятор гарантирует, что все регистры будут освобождены перед вызовом такой функции, и выводит предупреждение о переменных, которые могут быть изменены после второго возврата из функции. Примеры таких функций —setjmpиvfork. Соответствующая функция типаlongjmp, если она есть, может потребовать маркировки атрибутомnoreturn. section ("section-name")-
Обычно компилятор помещает сгенерированный код в секцию
text. Иногда, однако, вам требуются дополнительные секции или вы хотите, чтобы определенные функции появлялись в специальных секциях. Атрибутsectionуказывает, что функция находится в определенной секции. Например, объявление:extern void foobar (void) __attribute__ ((section ("bar")));помещает функцию
foobarв секциюbar.Некоторые форматы файлов не поддерживают произвольные секции, поэтому атрибут
sectionнедоступен на всех платформах. Если вам нужно отобразить все содержимое модуля в определённой секции, воспользуйтесь возможностями компоновщика. sentinel-
Этот атрибут функции гарантирует, что параметр в вызове функции является явным
NULL. Атрибут действителен только для функций с переменным числом аргументов. По умолчанию указатель находится на нулевой позиции, в качестве последнего параметра вызова функции. Если в атрибут передаётся необязательный целочисленный аргумент P, указатель должен находиться на позиции P, считая обратный отсчёт от конца списка аргументов.__attribute__ ((sentinel)) is equivalent to __attribute__ ((sentinel(0)))
Атрибут автоматически устанавливается с позицией 0 для встроенных функций
execlиexeclp. Для встроенной функцииexecleатрибут устанавливается с позицией 1.Действительным
NULLв этом контексте является ноль с любым типом указателя. Если ваша система определяет макросNULLс целочисленным типом, вам нужно добавить явное приведение типов. GCC заменяетstddef.hна копию, которая соответствующим образом переопределяет NULL.Предупреждения о пропущенных или неправильных указателях включены с помощью -Wformat.
simdsimd("mask")-
Этот атрибут позволяет создавать одну или несколько версий функции, которые могут обрабатывать несколько аргументов с помощью инструкций SIMD из одного вызова. Указание этого атрибута позволяет компилятору предположить, что такие версии доступны во время компоновки (приведены в той же или другой единице трансляции). Сгенерированные версии зависят от целевой платформы и описаны в соответствующем документе Vector ABI. Для целевой платформы x86_64 этот документ можно найти здесь.
Необязательный аргумент mask может иметь значение
notinbranchилиinbranch, и соответственно указывает компилятору генерировать немаскированные или маскированные копии. По умолчанию генерируются все копии.Атрибут не должен использоваться совместно с атрибутом Cilk Plus
vectorдля той же функции.Если атрибут указан и
#pragma omp declare simdприсутствует в объявлении, а также задан флаг -fopenmp или -fopenmp-simd, то атрибут игнорируется. stack_protect-
Этот атрибут добавляет код защиты стека к функции, если установлены флаги -fstack-protector, -fstack-protector-strong или -fstack-protector-explicit.
target (options)-
Несколько целевых бэкэндов реализуют атрибут
targetдля указания того, что функция должна компилироваться с различными параметрами целевой платформы, отличными от заданных в командной строке. Это может быть использовано, например, для компиляции функций с другим набором команд (архитектурой набора команд), отличным от стандартного. Также можно использовать директиву «#pragma GCC target» для установки параметров компиляции для нескольких функций. См. Function Specific Option Pragmas для получения подробной информации о директиве «#pragma GCC target».Например, на x86 можно объявить одну функцию с атрибутом
target("sse4.1,arch=core2")и другую сtarget("sse4a,arch=amdfam10"). Это эквивалентно компиляции первой функции с параметрами -msse4.1 и -march=core2, а второй — с -msse4a и -march=amdfam10. Вам нужно убедиться, что функция вызывается только на машине, поддерживающей конкретный набор команд, для которого она скомпилирована (например, используяcpuidна x86 для определения используемых битов функций и семейства архитектуры).int core2_func (void) __attribute__ ((__target__ ("arch=core2"))); int sse3_func (void) __attribute__ ((__target__ ("sse3")));Вы можете использовать несколько строк, разделённых запятыми, для указания нескольких параметров, или разделить параметры запятой (',') в одной строке.
Поддерживаемые параметры зависят от каждой целевой платформы; обратитесь к x86 Function Attributes, PowerPC Function Attributes, ARM Function Attributes и Nios II Function Attributes для получения подробной информации.
target_clones (options)-
Атрибут
target_clonesиспользуется для указания того, что функция должна быть клонирована в несколько версий, скомпилированных с различными параметрами целевой платформы, отличными от заданных в командной строке. Поддерживаемые параметры и ограничения аналогичны атрибутуtarget.Например, на x86 можно скомпилировать функцию с
target_clones("sse4.1,avx"). GCC создаёт две копии функции, одну, скомпилированную с -msse4.1, и другую — с -mavx. Также создаётся функция-разрешитель (см. атрибутifuncвыше), которая динамически выбирает копию, подходящую для текущей архитектуры. unused-
Этот атрибут, прикреплённый к функции, означает, что функция может быть неиспользуемой. GCC не выводит предупреждение для этой функции.
used-
Этот атрибут, прикреплённый к функции, означает, что код должен быть сгенерирован для функции, даже если кажется, что на неё нет ссылок. Это полезно, например, когда функция используется только в ассемблерном коде.
При применении к члену функции шаблона класса C++, этот атрибут также означает, что функция будет проинстанцирована, если сам класс будет проинстанцирован.
visibility ("visibility_type")
-
Этот атрибут влияет на связь объявления, к которому он прикреплен. Он может быть применён к переменным (см. Общие атрибуты переменных) и типам (см. Общие атрибуты типов), а также к функциям.
Поддерживаются четыре значения visibility_type: default, hidden, protected или internal visibility.
void __attribute__ ((visibility ("protected"))) f () { /* Do something. */; } int i __attribute__ ((visibility ("hidden")));Возможные значения visibility_type соответствуют настройкам видимости в формате ELF gABI.
default-
Видимость по умолчанию — это обычный случай для формата файла объекта. Это значение доступно для атрибута видимости, чтобы переопределить другие параметры, которые могут изменить предполагаемую видимость сущностей.
В формате ELF видимость по умолчанию означает, что объявление видно другим модулям и, в разделяемых библиотеках, означает, что объявленная сущность может быть переопределена.
В Darwin видимость по умолчанию означает, что объявление видно другим модулям.
Видимость по умолчанию соответствует «внешней связи» в языке.
hidden-
Скрытая видимость указывает, что объявленная сущность имеет новый тип связи, который мы называем «скрытой связью». Два объявления объекта со скрытой связью относятся к одному объекту, если они находятся в одном разделяемом объекте.
internal-
Видимость «внутренняя» похожа на скрытую видимость, но с дополнительной семантикой, специфичной для процессора. Если не указано иное psABI, GCC определяет внутреннюю видимость как то, что функция никогда не вызывается из другого модуля. Сравните это со скрытыми функциями, которые, хотя и не могут быть непосредственно упомянуты другими модулями, могут быть упомянуты косвенно через указатели на функции. Указывая, что функция не может быть вызвана извне модуля, GCC может, например, опустить загрузку регистра PIC, поскольку известно, что вызывающая функция загрузила правильное значение.
protected-
Защищенная видимость аналогична видимости по умолчанию, за исключением того, что она указывает на то, что ссылки внутри определяющего модуля связываются с определением в этом модуле. То есть, объявленная сущность не может быть переопределена другим модулем.
Все виды видимости поддерживаются во многих, но не во всех, целях ELF (поддерживаются, когда ассемблер поддерживает псевдокоманду «.visibility»). Видимость по умолчанию поддерживается везде. Скрытая видимость поддерживается на целевых платформах Darwin.
Атрибут видимости следует применять только к объявлениям, которые в противном случае имели бы внешнюю связь. Атрибут следует применять последовательно, так чтобы одна и та же сущность не объявлялась с разными настройками атрибута.
В C++, атрибут видимости применяется как к типам, так и к функциям и объектам, потому что в C++ типы имеют связь. Класс не должен иметь большую видимость, чем его нестатические типы данных членов и базовые классы, а члены класса по умолчанию имеют видимость своего класса. Кроме того, объявление без явной видимости ограничено видимостью его типа.
В C++ вы можете пометить методы-члены и статические переменные-члены класса атрибутом видимости. Это полезно, если вы знаете, что определённый метод или статическая переменная-член должны использоваться только из одного разделяемого объекта; в таком случае вы можете пометить его как скрытый, в то время как остальная часть класса имеет видимость по умолчанию. Следует проявлять осторожность, чтобы избежать нарушения Правила одного определения; например, обычно не имеет смысла помечать встроенный метод как скрытый, не помечая весь класс как скрытый.
Объявление пространства имён C++ также может иметь атрибут видимости.
namespace nspace1 __attribute__ ((visibility ("protected"))) { /* Do something. */; }Этот атрибут применяется только к телу конкретного пространства имён, а не к другим определениям того же пространства имён; это эквивалентно использованию ‘#pragma GCC visibility’ до и после определения пространства имён (см. Атрибуты видимости).
В C++, если аргумент шаблона имеет ограниченную видимость, это ограничение подразумевается распространяться на экземпляры шаблона. В противном случае экземпляры и специализации шаблонов по умолчанию имеют видимость своего шаблона.
Если у шаблона и содержащего класса есть явная видимость, используется видимость шаблона.
warn_unused_result-
Атрибут
warn_unused_resultвызывает вызов предупреждения, если вызывающая функция с этим атрибутом не использует своё возвращаемое значение. Это полезно для функций, где проверка результата является либо проблемой безопасности, либо всегда ошибкой, например,realloc.int fn () __attribute__ ((warn_unused_result)); int foo () { if (fn () < 0) return -1; fn (); return 0; }приводит к появлению предупреждения на строке 5.
weak-
Атрибут
weakвызывает вывод объявления как слабого символа, а не глобального. Это в первую очередь полезно для определения функций библиотек, которые могут быть переопределены в пользовательском коде, хотя также может быть использовано с объявлениями, не являющимися функциями. Слабые символы поддерживаются для целей ELF, а также для целей a.out при использовании GNU ассемблера и компоновщика. weakrefweakref ("target")-
Атрибут
weakrefпомечает объявление как слабое обращение. Без аргументов он должен сопровождаться атрибутомalias, назначающим целевой символ. Дополнительно, target может быть указан в качестве аргумента дляweakref. В любом случае,weakrefнеявно помечает объявление какweak. Без target, заданного в качестве аргумента дляweakrefили дляalias,weakrefэквивалентноweak.static int x() __attribute__ ((weakref ("y"))); /* is equivalent to... */ static int x() __attribute__ ((weak, weakref, alias ("y"))); /* and to... */ static int x() __attribute__ ((weakref)); static int x() __attribute__ ((alias ("y")));Слабое обращение — это псевдоним, который сам по себе не требует предоставления определения для целевого символа. Если целевой символ ссылается только через слабые обращения, тогда он становится
weakнеопределённым символом. Однако, если он непосредственно ссылается, то такие сильные ссылки преобладают, и определение для символа необходимо, не обязательно в одном и том же блоке трансляции.Эффект эквивалентен перемещению всех ссылок на псевдоним в отдельный блок трансляции, переименованию псевдонима в целевой символ, объявлению его как слабого, компиляции двух отдельных блоков трансляции и выполнению перезагружаемой компоновки над ними.
В настоящее время объявление, к которому прикреплён
weakref, может быть толькоstatic.
Далее: Атрибуты функций AArch64, Назад: Атрибуты функций [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Common-Function-Attributes.html