我正在尝试使用clang
编译一个没有优化的特定函数,以防止对memset()
的某些与安全相关的调用被优化。
根据the documentation that can be found here的说法,存在一个允许这样做的optnone
属性。还有,an example can be found here。
不幸的是,(至少在OS X 10.9.5上的以下版本的clang
上),这会导致编译器警告,如本例所示:
$ 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 <string.h>
__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
警告。
有人知道为什么这个不起作用吗?我是否错过了使用此功能的前提条件?(我还尝试使用各种不同的-std=
参数,包括c11
、gnu11
、c99
和gnu99
,但没有改变行为。)
发布于 2015-08-30 10:54:58
正如clang文档所说,
Clang支持GCC的gnu属性命名空间。所有使用
__attribute__((foo))
语法接受的GCC属性也都被接受为[[gnu::foo]]
。这只扩展到由GCC指定的属性(参见GCC函数属性、GCC变量属性、GCC类型属性列表)。与GCC实现一样,这些属性必须与声明中的声明者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")));
发布于 2017-11-18 20:20:40
正如@dulacc在他的评论中所倡导的那样,__attribute__ ((optnone))
在Mac的High Sierra上使用clang 9.0.0。
https://stackoverflow.com/questions/26266820
复制相似问题