我目前正在开展一个项目,我必须在其中复制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
答案 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
。