以下代码:
#include <stdlib.h>
#include <string.h>
int main() {
char *s = strdup("keep-alive");
if(strcasestr(s, "close")) {
}
free(s);
return 0;
}
在Valgrind中给出以下错误:
==13183== Invalid read of size 8
==13183== at 0x4F53F94: __strcasestr_sse42 (emmintrin.h:685)
==13183== by 0x4005BF: main (in /home/aaron/dev/strtest)
==13183== Address 0x51ce048 is 8 bytes inside a block of size 11 alloc'd
==13183== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==13183== by 0x4EB1441: strdup (strdup.c:43)
==13183== by 0x4005A5: main (in /home/aaron/dev/strtest)
有没有人见过这个?这种情况发生在&amp;没有优化,使用gcc 4.6.1。
答案 0 :(得分:2)
如果这只发生在valgrind中,那不是错误。 您的代码读取超出malloc
获取的对象末尾的未定义行为,但strcasestr
是“实现”的一部分,因此可以使用实现 - 具体的知识:在这种情况下,只要你不跨越页面边界,过度阅读是绝对安全的。