程序在malloc附近受到攻击

时间:2014-07-17 04:58:41

标签: c dynamic-memory-allocation

我使用下面的代码

char *es_data;

fp_input = fopen(inp_path, "rb");

fseek(fp_input, 0, SEEK_END);
file_size = ftell(fp_input);
fseek(fp_input, 0, SEEK_SET);

es_data = (char*)malloc(file_size);
fread(es_data, 1, file_size, fp_input);

我有一个185mb的文件,即file_size = 190108334个字节。对于这个文件,malloc崩溃了,程序在这个阶段受到了打击。 如果我使用任何其他较小的文件,它工作正常。 我能做什么 ?

1 个答案:

答案 0 :(得分:1)

您至少应该测试fopen成功:

 fp_input = fopen(inp_path, "rb");
 if (!fp_input) { popen(inp_path); exit(EXIT_FAILURE); };

您的malloc可能没有崩溃,但失败(通过返回NULL):至少阅读malloc(3)代码:

 es_data = malloc(file_size);
 if (!es_data) { perror("malloc"); exit(EXIT_FAILURE); }
顺便说一下,你可能想要memory map一个文件。如果您使用的是Linux或Posix系统,请了解mmap(2)(并使用fstat(2)查询open(2) - ed文件描述符的大小。 Windows还可以使用CreateFileMapping

对内存映射文件

如果您的malloc确实崩溃,这可能意味着您拥有memory corruption(在malloc之前调用),因此系统的内部不变量{{}违反了1}}。使用一些memory debugger工具(如Linux上的valgrind或Windows上的purify)来检测它。