在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警告。

有谁知道为什么这不起作用? 我是否错过了使用此function的先决条件? (我也尝试使用各种不同的-std=参数,包括c11gnu11c99gnu99 ,但没有改变行为。)

正如clang文档所说,

Clang支持GCC的gnu属性名称空间。 使用__attribute__((foo))语法接受的所有GCC属性也被接受为[[gnu::foo]] 。 这仅扩展到GCC指定的属性(请参阅GCC函数属性列表,GCC变量属性和GCC类型属性)。 与GCC实现一样,这些属性必须与声明中的declarator-id相关,这意味着它们必须在声明的开头或声明名称后立即进行。

尝试

 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))适用于Mac的High Sierra上的clang 9.0.0。