以下代码在ubuntu上构建时创建一个可执行文件。

#include <stdio.h>

void otherfunc(FILE* fout){
    fclose(fout);//Line 4
    fout = fopen("test.txt", "w");//Delete contents and create a new file//Line 5
    setbuf(fout, 0);//Line 6
}

int main() {
    FILE *fout = fopen("test.txt", "r");//Line 10
    if (fout) {
        //file exists and can be opened
        fclose(fout);//Line 13
        fout = fopen("test.txt", "a");//Line 14
        setbuf(fout, 0);
    }
    else {
        //file doesn't exists or cannot be opened
        fout = fopen("test.txt", "a");//Line 19
    }

    otherfunc(fout);//Line 22

    fclose(fout);//Line 24
    return 0;
}

当通过Valgrind时,Valgrind发出以下警告:
==13569==无效读取大小4
==13569==at 0x4ea7264:fclose@@glibc_2.2.5(iofclose.c:53)
==13569==by 0x400673:main(newmain.cpp:24)
==13569==address 0x52042b0在552 free'd大小的块中是0字节
==13569==at 0x4c2edeb:free(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==13569==BY 0x4EA7362:fclose@@glibc U 2.2.5(iofclose.c:84)
==13569==by 0x4005cd:otherfunc(_io_file*)(newmain.cpp:4)
==13569==by 0x400667:main(newmain.cpp:22)
==13569==块已分配到
==13569==at 0x4c2db8f:malloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so中)
==13569==BY 0x4EA7CDC:uu fopen_internal(iofopen.c:69)
==13569==by 0x400657:main(newmain.cpp:19)
从本质上说,这是抱怨第24行的fclose(fout);正在关闭一个已经释放的内存,该内存是在fclose(fout);内的第4行的otherfunc()上释放的。但第24行的fclose(fout);意味着关闭在第5行执行的fopen()
在代码中的任何时间点,每当调用fclose()时,总是有一个打开的fopen()。为什么这是valgrind报告的无效读取?

最佳答案

otherfunc按值获取文件指针。因此,您在第5行分配的值在从otherfunc返回后丢失,当它返回main时,fout的值保持不变。它包含在第4行关闭的悬挂文件指针值。因此,对第24行close的调用将收到一个无效指针。

关于c++ - Valgrind在FILE *上读取无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48483947/

10-10 20:39