代码之家  ›  专栏  ›  技术社区  ›  Zhou Jia

strcpy_s在Visual Studio中的意外行为

  •  0
  • Zhou Jia  · 技术社区  · 3 年前

    平台:Win11,Visual Studio 2022 代码:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char ori[5] = { 'a', 'b', '\0', 'c', 'd' };
        //char *safe = malloc(10 * sizeof(char));
        //char *unsafe = malloc(10 * sizeof(char));
    
        char safe[10];
        char unsafe[10];
        memset(safe, 0, 10 * sizeof(char));
        memset(unsafe, 0, 10 * sizeof(char));
        strcpy(unsafe, ori);
        strcpy_s(safe, 10, ori);
        printf("SAFE: %c\n", safe[3]);
        printf("UnSafe: %c\n", unsafe[3]);
    
        return 0;
    }
    

    我有两个阵列, safe unsafe 之后 memset ,两者都初始化为 {0,0,0,0,0,0,0,0,0,0} (将字符显示为整数)。

    之后 strcpy strcpy_s ,我希望得到 {'a','b','\0','\0','\0','\0','\0','\0','\0','\0'} 在两个 安全 不安全的 阵列。然而,在 安全 ,我获得 {97,98,0,-2,-2,-2,-2,-2,-2,-2} (将字符显示为整数)。

    什么是 结构 做,在哪里 -2 来自

    1 回复  |  直到 3 年前
        1
  •  5
  •   Andreas Wenzel    3 年前

    这个 official Microsoft documentation for the function strcpy_s 声明如下:

    这些函数的调试库版本首先用0xFE填充缓冲区。若要禁用此行为,请使用_CrtSetDebugFillThreshold。

    如果您转换 0xFE signed char ,你得到了价值 -2

        2
  •  2
  •   Jonathan Leffler    3 年前

    -2 是C规范允许的。

    errno_t strcpy_s(char * restrict s1, rsize_t s1max, const char * restrict s2);
    

    由编写的终止空字符(如果有)后面的所有元素 strcpy_s 在的数组中 s1max 指向的字符 s1 结构 返回。C17dr§K.3.7.1.3 4

    这适用 无论任何调试设置如何
    代码不应依赖于超过 空字符 保持不变。