En clang, ¿cómo se usan los atributos de optimización por función?

Estoy tratando de comstackr una función específica sin optimización utilizando clang , para evitar que se memset() las llamadas relacionadas con la seguridad a memset() .

De acuerdo con la documentación que se puede encontrar aquí , existe un atributo optnone que permite esto. Además, un ejemplo se puede encontrar aquí .

Lamentablemente, (al menos en la versión inferior de clang , en OS X 10.9.5), esto está causando advertencias en el comstackdor, como se puede ver en este ejemplo:

 $ 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. 

También intenté #pragma clang optimize off , pero esto provocó una advertencia unknown pragma ignored .

¿Alguien sabe por qué esto no está funcionando? ¿Echaba de menos un requisito previo para usar esta función? (También intenté usar varios parámetros -std= diferentes, incluidos c11 , gnu11 , c99 y gnu99 , pero nada cambió el comportamiento).

Como dice la documentación clang,

Clang admite el espacio de nombres del atributo gnu de GCC. Todos los atributos GCC que se aceptan con la __attribute__((foo)) también se aceptan como [[gnu::foo]] . Esto solo se extiende a los atributos especificados por GCC (consulte la lista de atributos de funciones de GCC, atributos de variables de GCC y atributos de tipo GCC). Al igual que con la implementación de GCC, estos atributos deben pertenecer al ID del declarador en una statement, lo que significa que deben ir al comienzo de la statement o inmediatamente después de que se declare el nombre.

Tratar

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

o

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

Como recomienda @dulacc en su comentario, __attribute__ ((optnone)) funciona en clang 9.0.0 en High Sierra de Mac.