c - 使用 valgrind 在 strstr() 中读取大小 1 无效

标签 c valgrind strstr

我正在用 valgrind 检查一些代码,我得到这个错误:

==7001== Invalid read of size 1
==7001==    at 0x402E21B: strstr (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==7001==    by 0x8049742: replace_in_file (functions.c:191)
==7001==    by 0x8049C55: parse_dir (functions.c:295)
==7001==    by 0x8049059: main (main.c:214)
==7001==  Address 0x42018c3 is 0 bytes after a block of size 3 alloc'd
==7001==    at 0x402B018: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==7001==    by 0x80496EC: replace_in_file (functions.c:183)
==7001==    by 0x8049C55: parse_dir (functions.c:295)
==7001==    by 0x8049059: main (main.c:214)

代码片段如下所示:

long int replace_in_file(char **sets, FILE *file, char *path, const char *mode){
    long int n = 0, size = 0, len, remaining_len;

    char *buffer,
         *found,
         *before,
         *after;

    size = file_size(file);
    if(-1 != size){

        buffer = malloc(size * sizeof(char));

        rewind(file);
        fread(buffer, 1, size, file);

        int i=0;
        do{
            do{
                found = strstr(buffer, sets[i]); // LINE 191
                if(NULL != found && '\0' != sets[i][0]){

//rest of code...

我不明白为什么会出现该错误,因为一切都按预期工作,并且在调试器中每个变量似乎都很好。

出了什么问题,我该如何解决?

最佳答案

fread() 以 nul 终止它读取的数据,但 strstr() 需要一个以 nul 终止的字符串。您应该分配 size+1 个字节并显式添加 nul 终止符以确保安全。

关于c - 使用 valgrind 在 strstr() 中读取大小 1 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10435736/

相关文章:

c - 如何输入两个中间有破折号的整数?

c++ - 在 OpenGL 中使用索引缓冲区对象的结构会导致段错误

c - 如何获取 "\r\n\r\n"之前的子串

检查一个字符串是否是另一个字符串的子字符串

c - 在 C 中解析/匹配字符串出现

c - 用于查找二进制可执行代码中内存泄漏的测试脚本或测试工具

c++ - C 或 C++ 中乘法和除法的较高部分?

c - Arduino 创建延迟函数

linux - valgrind vgdb 与 emacs 中的 gdb

Valgrind Massif 工具输出图形界面?