gpt4 book ai didi

c - 堆栈崩溃,找不到溢出错误

转载 作者:行者123 更新时间:2023-11-30 19:41:17 25 4
gpt4 key购买 nike

我正在尝试编写一个函数,如果字符串的长度小于分配给字符缓冲区的最大大小,则该函数将用一些字符填充字符串。我遇到了“* 检测到堆栈粉碎*:./test 终止”错误,该错误会停止我的测试程序,因为我假设某处存在溢出,覆盖了某些 protected 内存。这看起来是一个简单的函数,但我似乎找不到错误的原因。

void pad_string2(char* buf, size_t buf_size, char* str, char* pad) {
strncpy(buf, str, buf_size);
size_t pad_size = buf_size - strlen(str);
printf("pad size: %zu\n", pad_size);
if (pad_size > 0) {
unsigned int i = 0;
while(i < (pad_size - 1)) {
strncpy((buf + strlen(str) + i), pad, buf_size);
i++;
}
}
buf[buf_size - 1] = '\0';
}

我认为这可能是一个问题,但是测试字符串的长度似乎没有超过缓冲区的大小。

char buf[16];
printf("sizeof(buf): %zu\n", sizeof(buf));
pad_string2(buf, sizeof(buf), "testing", "A");
printf("strlen(testing): %zu\n", strlen("testing"));
printf("buf: %s\n", buf);

Output
------
sizeof(buf): 16
pad size: 9
strlen(testing): 7
buf: testingAAAAAAAA
*** stack smashing detected ***: ./test terminated
Aborted

任何人都可以提供帮助吗?

谢谢

最佳答案

行:

strncpy((buf + strlen(str) + i), pad, buf_size);

最终会覆盖你不应该写的内存。 buf_size 对于您想要执行的操作来说太大了。使用:

strncpy((buf + strlen(str) + i), pad, 1);

关于c - 堆栈崩溃,找不到溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33727871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com