【问题标题】:getting buffer overflow error using strcat使用 strcat 获取缓冲区溢出错误
【发布时间】:2020-07-04 09:34:11
【问题描述】:

刚接触 C++,我一直在胡思乱想,试图了解指针和解决问题等复杂系统。我制作了这个简单的程序,它将连接 char 字符串。但它总是抛出同样的错误:L'buffer is too small &&0

这是我的代码 -

    const char* str = "larry";
    const char* yo{"is one of the stooges" };
    size_t buffer{ std::strlen(str) + std::strlen(yo) + 1 };
    std::cout << buffer;
    char* buff = new char[buffer];
    strcpy_s(buff, strlen(str), str);
    strcat(buff, yo);
    std::cout << *buff << std::endl;
    delete[] buff; 

这是我要求的程序输出:

27             // the size of buffer

然后程序崩溃。

请指出问题所在。 谢谢

【问题讨论】:

  • 输出应该是std::cout &lt;&lt; buff,没有*,因为您可能想要打印整个字符串,而不仅仅是第一个字符。
  • 感谢您指出错字,但这对buffer overflow 错误没有帮助。请看看您是否可以帮助我。无论如何,谢谢
  • 是的,这就是为什么它是评论而不是答案。你能说出哪一行触发了错误吗?您能否通过编辑您的问题来显示整个程序输出(包括缓冲区大小)和完整的源代码(导致错误的最小可编译示例)?
  • minimal reproducible example 或者它没有发生。
  • @default-303 你需要使用strcpy_s(buff, strlen(str) + 1, str);

标签: c++ char dynamic-memory-allocation c-strings strcat


【解决方案1】:

根据 C 标准(K.3.7.1.3 的 strcpy_s 函数)

2 s1 和 s2 都不能是空指针。 s1max 不得 大于 RSIZE_MAX。 s1max 不应等于零。 s1max 应为 大于 strnlen_s(s2, s1max)。不得复制 重叠的对象之间。

那是你必须写

strcpy_s(buff, strlen(str) + 1, str);

否则str指向的字符串的终止零将不会被复制。在这种情况下下一次调用

strcat(buff, yo);

调用未定义的行为。

【讨论】:

    【解决方案2】:

    strcpy_s 的第二个参数是目标数组的大小,包括 0 字节。但是,您传入源字符串的大小,不包括 0 字节。 strcpy_s 试图复制它不能复制的 0 字节,因为目标数组(如参数所示)太小了。将buffer(不是一个好名字,顺便说一句)作为第二个参数传递给strcpy_s,以正确指示目标大小。

    【讨论】:

    • 更好的是:使用strcpy。您已经知道缓冲区的大小是正确的,因此无需再次检查。 +1。
    • std::string 会更好,但我认为这不是重点......
    • @Erlkoenig 我知道,但我想挑战自己。谢谢你
    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多