[英]Macro definition for memset function in C on Mac OS X
在Mac OS X的/usr/include/secure/_string.h
,您可以找到以下定义:
#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
什么? 那是一个宏吗? 如何定义?
不是最好的引用,但是据此看来__darwin_obsz0
是此gcc内置函数的#define,它确定对象的大小( __builtin_object_size )。
在这种情况下,代码试图防止缓冲区溢出。 memset试图查看它是否可以准确确定指向对象的大小,然后将该大小传递给更安全的memset操作。 否则,使用不太安全的内存集,并信任用户传递的长度。
(构造函数或内在函数是不是来自任何特定库且不是宏的小函数。编译器提供它们做一些特殊的魔术,有时它们是特定汇编指令的别名。)
1)通常, size_t
将是一个unsigned int
,因此(size_t) -1
是获得最大的unsigned int
值的便捷方法。 记住这里的(size_t)
是演员表。 我不太确定那张支票的LHS。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.