繁体   English   中英

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

[英]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函数的定义进行了更深入的研究,得到了上面的内容。

  1. (__darwin_obsz0 (dest) != (size_t) -1)什么意思? 我的意思是size_t只是像int这样的类型。 (size_t) -1

  2. __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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM