在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=
参数,包括c11
, gnu11
, c99
和gnu99
,但没有改变行为。)
正如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。