我正在用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...
我无法理解为什么会出现这个错误,因为一切都按预期工作,而且在调试器中每个变量看起来都很好。
有什么问题,我该如何解决?
答案 0 :(得分:5)
fread()
不 nul-终止它读取的数据,但strstr()
期望以空字符结尾的字符串。您应该分配大小+ 1个字节并明确添加nul-terminator以保证安全。
答案 1 :(得分:4)
您的buffer
未终止。通常,您可以在bzero()
之前fread()
来确保它与strstr()
和类似功能一起使用。
答案 2 :(得分:2)
根据我在我的联机帮助页中所读到的内容,fread()
没有NULL
- 根据C89终止其结果 - 而且它也不在我的系统上 - 所以strstr()
只会阅读在buffer
结尾,除非你终止它,例如像这样
buffer = malloc((size + 1) * sizeof(char));
memset(buffer, '\0', size + 1);
(如果fread无法读取整个文件,它的优势还在于终止它)
旁注:由于您已在sizeof(char)
来电中使用malloc()
,因此为了保持一致性,您可能还会考虑替换1
中的fread()
。