В clang, как вы используете атрибуты оптимизации для каждой функции?

Я пытаюсь скомпилировать определенную функцию без оптимизации с помощью clang , чтобы предотвратить оптимизацию определенных вызовов, связанных с безопасностью, от memset() .

Согласно документации, которую можно найти здесь , существует атрибут optnone который позволяет это. Кроме того, здесь можно найти пример .

К сожалению, (по крайней мере, в приведенной ниже версии clang , в OS X 10.9.5), это вызывает предупреждения компилятора, как видно из этого примера:

 $ clang --version Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn) Target: x86_64-apple-darwin13.4.0 Thread model: posix $ cat optnone.c #include  __attribute__((optnone)) void* always_memset(void *b, int c, size_t len) { return memset(b, c, len); } $ clang -Wall -O3 -c -o optnone.o optnone.c optnone.c:3:16: warning: unknown attribute 'optnone' ignored [-Wattributes] __attribute__((optnone)) void* ^ 1 warning generated. 

Я также пробовал использовать #pragma clang optimize off , но это вызвало unknown pragma ignored предупреждение unknown pragma ignored прагмы.

Кто-нибудь знает, почему это не работает? Я пропустил необходимое условие для использования этой функции? (Я также пытался использовать различные разные параметры -std= , включая c11 , gnu11 , c99 и gnu99 , но ничего не изменило поведения.)

    Как гласит документация клана,

    Clang поддерживает пространство имен атрибутов gnu GCC. Все атрибуты GCC, которые принимаются с синтаксисом __attribute__((foo)) , также принимаются как [[gnu::foo]] . Это распространяется только на атрибуты, указанные GCC (см. Список атрибутов функции GCC, атрибуты переменной GCC и атрибуты типа GCC). Как и в случае реализации GCC, эти атрибуты должны соответствовать идентификатору declarator в объявлении, что означает, что они должны идти либо в начале объявления, либо сразу после объявления имени.

    Пытаться

     void* always_memset(void *b, int c, size_t len) [[gnu::optimize(0)]] 

    или

     void* always_memset(void *b, int c, size_t len) __attribute__ ((optimize("0"))); 

    Как сказал @dulacc в своем комментарии, __attribute__ ((optnone)) работает над clang 9.0.0 на High Sierra Mac.

    Давайте будем гением компьютера.