Mac OS X上C中memset函数的宏定义

时间:2013-09-12 01:46:58

标签: c

/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函数的定义,我得到了上述内容。

  1. (__darwin_obsz0 (dest) != (size_t) -1)的含义是什么?我的意思是size_t只是类似int的类型。 (size_t) -1

  2. 这是什么__builtin___memset_chk?那是一个宏吗?这是如何定义的?

2 个答案:

答案 0 :(得分:2)

不是最好的引用,但according to this显然__darwin_obsz0是此gcc内置函数的#define,用于确定对象的大小(__builtin_object_size)。

在这种情况下,代码试图阻止缓冲区溢出。 memset试图查看它是否可以准确地确定指向对象的大小,然后将该大小传递给更安全的memset操作。否则,使用安全性较低的memset,信任用户传入的长度。

(Builtins或intrinsics是一些小函数,不是来自任何特定的库,也不是宏。编译器为它们提供了一些特殊的魔法,有时它们是特定汇编指令的别名。)

答案 1 :(得分:0)

1)通常size_tunsigned int,因此(size_t) -1是获取最大unsigned int值的便捷方式。请记住(size_t)这里是演员。我不太确定那张支票的LHS。