1

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

  1. 是什么意思(__darwin_obsz0 (dest) != (size_t) -1)?我的意思size_t是只是一个像int. (size_t) -1?

  2. 这是什么__builtin___memset_chk?那是宏吗?那是怎么定义的?

4

2 回答 2

2

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

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

(内建或内在函数是不来自任何特定库且不是宏的小函数。编译器提供它们来做一些特殊的魔法,有时它们是特定汇编指令的别名。)

于 2013-09-12T02:01:07.597 回答
0

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

于 2013-09-12T01:49:15.020 回答