如何重现__builtin___memset_chk

时间:2017-05-30 15:04:01

标签: c c-preprocessor

我目前正在开展一个项目,我必须在其中复制memset()的行为。但是,我似乎无法获得一种行为。如果您执行以下操作:

char test[8] = "testing";
memset(test, 'b', 10);

它会在编译时给出错误(事实上已经在预处理阶段)。错误是:

'__builtin___memset_chk' will always overflow destination buffer

我试图在我的功能中复制这种行为,但似乎无法弄清楚它是如何完成的。我一直在搜索string.h和所有相关文件,但它是一堆不可能遵循的意大利面条代码。我的问题是:如何检查预处理器阶段中字符串的长度,以将其与给定值进行比较?

注意:此行为仅适用于Mac OS。在Linux上,它将很乐意编译,并且生成的二进制文件将只是段错误。我已经尝试过几个不同的编译器,所以我确信这种行为是在库本身,而不是简单地硬编码成clang。

注2:我希望自己的函数能够自包含,即不依赖于string.h

1 个答案:

答案 0 :(得分:1)

您可以在头文件中看到memcpy的定义。

#define memcpy(dest, src, len)                  \
  ((__darwin_obsz0 (dest) != (size_t) -1)               \
   ? __builtin___memcpy_chk (dest, src, len, __darwin_obsz0 (dest)) \
   : __inline_memcpy_chk (dest, src, len))

不幸的是,名称“builtin”意味着这是编译器本身内置的原语,并且不一定可以使用您自己的函数复制此行为。 Apple对其版本的Clang编译器进行了大量修改。我很好奇你尝试过哪些编译器 - 你知道gcc命令是macOS上clang的别名吗?

也没有相关的功能属性,这就是如何对例如printf