gpt4 book ai didi

c - Valgrind 警告 : Should I Take It Seriously

转载 作者:太空狗 更新时间:2023-10-29 17:14:30 24 4
gpt4 key购买 nike

背景:我有一个模仿 fgets(character, 2, fp) 的小例程,只是它从字符串而不是流中获取字符。 newBuff 是动态分配的字符串,作为参数传递,字符被声明为 char character[2]

常规:

character[0] = newBuff[0];

character[1] = '\0';

strcpy(newBuff, newBuff+1);

strcpy 在从中读取每个字符时复制信息丢失。

Problem: Valgrind does warns me about this activity, "Source and destination overlap in strcpy(0x419b818, 0x419b819)".

我应该担心这个警告吗?

最佳答案

可能标准没有指定当这些缓冲区重叠时会发生什么。所以是的,valgrind 对此的提示是正确的。

实际上,您很可能会发现您的 strcpy 按照从左到右的顺序进行复制(例如,while (*dst++ = *src++ );) 并且这不是问题。但它仍然不正确,并且在与其他 C 库一起运行时可能会出现问题。

一种符合标准的写法是:

memmove(newBuff, newBuff+1, strlen(newBuff));

因为 memmove 被定义为处理重叠。 (虽然在这里你最终会遍历字符串两次,一次检查长度,一次复制。我也走了一条捷径,因为 strlen(newBuff) 应该等于 strlen(newBuff+1 )+1,这是我原来写的。)

关于c - Valgrind 警告 : Should I Take It Seriously,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4823664/

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