gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:55:00 25 4
gpt4 key购买 nike

/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?那是宏吗?怎么定义的?

最佳答案

不是最好的引用,而是according to this显然 __darwin_obsz0 是这个 gcc 内置函数的#define,它决定了一个对象的大小(__builtin_object_size)。

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

(内置函数或内在函数是不来自任何特定库的小函数,也不是宏。编译器提供它们来执行一些特殊的操作,有时它们是特定汇编指令的别名。)

关于c - Mac OS X 上 C 中 memset 函数的宏定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18754036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com