C 如何复制内置内存集

C 如何复制内置内存集,c,c-preprocessor,C,C Preprocessor,我目前正在从事一个项目,其中我必须复制memset()的行为。然而,有一种行为我似乎无法理解。如果您执行以下操作: char test[8] = "testing"; memset(test, 'b', 10); 它会在编译时给我一个错误(实际上在预处理阶段)。错误是: '__builtin___memset_chk' will always overflow destination buffer 我试图在我的函数中复制这种行为,但似乎不知道它是如何完成的。我一直在搜索string.h和所有

我目前正在从事一个项目,其中我必须复制memset()的行为。然而,有一种行为我似乎无法理解。如果您执行以下操作:

char test[8] = "testing";
memset(test, 'b', 10);
它会在编译时给我一个错误(实际上在预处理阶段)。错误是:

'__builtin___memset_chk' will always overflow destination buffer
我试图在我的函数中复制这种行为,但似乎不知道它是如何完成的。我一直在搜索string.h和所有相关文件,但这是一堆无法理解的意大利面代码。我的问题是:如何在预处理器阶段检查字符串的长度以将其与给定值进行比较

注意:此行为仅适用于Mac OS。在Linux上,它将愉快地编译,生成的二进制文件将简单地进行segfault。我试过使用一些不同的编译器,所以我确信这种行为是在库本身中发生的,而不是简单地硬编码到clang中


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

您可以在头文件中看到
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”意味着这是编译器本身内置的一个原语,不一定可以用自己的函数复制这种行为。苹果对其版本的Clang编译器进行了大量修改。我很好奇您尝试过哪些编译器您是否知道
gcc
命令是macOS上clang的别名


也没有相关的函数属性,这就是检查的方式,例如,
printf

它可能是由编译器专门处理的,这意味着您无法对自己的函数进行复制。根据编译器的不同,可能有一些特殊的属性可以用来通知编译器类似的事情,并且它可能能够对您的函数执行相同的检查。我考虑过这一点,但是当我在Linux上使用相同的clang版本时,它不会给我错误。它只在Mac上。你可能没有使用相同的叮当版本。苹果公司使用自己的分支进行了大量修改。memset不是用C编写的,而是用汇编语言编写的。C库是C语言之外的东西。好的,我明白了。那就根本不可能了?很酷,谢谢。这就是我想知道的。我知道gcc是clang的别名。我的意思是,我在其他系统上使用了clang,但它不起作用,所以我认为唯一的区别是库。没想到苹果对他们的叮当版本做了这么多修改。