c - strcastr 中的读取大小无效

标签 c valgrind

以下代码:

#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)

有没有人看过这个?使用 gcc 4.6.1,在有和没有优化的情况下都会发生这种情况。

最佳答案

如果这仅发生在 valgrind 中,则不是错误。对于 您的代码 来说,读取超出 malloc 获得的对象末尾的内容将是未定义的行为,但 strcasetr 是“实现”的一部分因此可以使用特定于实现的知识:在这种情况下,只要您不跨越页面边界,过度阅读是绝对安全的。

关于c - strcastr 中的读取大小无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9088933/

相关文章:

c - 为什么 getpagesize() 返回一个 int?

c - 如何从函数返回数组到main()

c - Schönauer Triad 基准 - L1D 缓存不可见

c - 矩阵输出是垃圾数据

c++ - 使用 Eclipse : How to add include paths and libraries for all your C/C++ project

c++ - Valgrind 提示 std string 的新运算符可能存在内存泄漏

c - Valgrind 可能会在简单程序中丢失内存

linux - 为 powerpc 运行 valgrind 时出错

C++ VALGRIND 未初始化的值是由堆分配创建的

c - Valgrind "Conditional jump or move depends on uninitialised value(s)"错误