在/usr/include/secure/_string.h
的Mac OS X上,您可以找到以下定义:
#define memset(dest, val, len) \
((__darwin_obsz0 (dest) != (size_t) -1) \
? __builtin___memset_chk (dest, val, len, __darwin_obsz0 (dest)) \
: __inline_memset_chk (dest, val, len))
static __inline void *
__inline_memset_chk (void *__dest, int __val, size_t __len)
{
return __builtin___memset_chk (__dest, __val, __len, __darwin_obsz0(__dest));
}
我深入研究了memset函数的定义,我得到了上述内容。
(__darwin_obsz0 (dest) != (size_t) -1)
的含义是什么?我的意思是size_t
只是类似int
的类型。 (size_t) -1
这是什么__builtin___memset_chk
?那是一个宏吗?这是如何定义的?
答案 0 :(得分:2)
不是最好的引用,但according to this显然__darwin_obsz0
是此gcc内置函数的#define,用于确定对象的大小(__builtin_object_size)。
在这种情况下,代码试图阻止缓冲区溢出。 memset试图查看它是否可以准确地确定指向对象的大小,然后将该大小传递给更安全的memset操作。否则,使用安全性较低的memset,信任用户传入的长度。
(Builtins或intrinsics是一些小函数,不是来自任何特定的库,也不是宏。编译器为它们提供了一些特殊的魔法,有时它们是特定汇编指令的别名。)
答案 1 :(得分:0)
1)通常size_t
为unsigned int
,因此(size_t) -1
是获取最大unsigned int
值的便捷方式。请记住(size_t)
这里是演员。我不太确定那张支票的LHS。