To allocate or not to allocate. Invalid read of size 1 errors. [Staring for 2 hours]

末鹿安然 提交于 2019-12-23 05:02:05

问题


This is the code I'm working on

code

However there are problems. Some or all might be because of not allocating space for data in nodes (line 135~) because the line is changing during iteration in main. But when I allocate space for it, at line 135, the outcome doesn't change much and there is memory leak. I'm stuck.

I'm about to go crazy. Can you help me to fix errors?

Any help is appreciated. Thank you!

Output:

a@ubuntu:~/os/hw1$ ./o f1.txt f2.txt o.txt
*** Error in `./o': double free or corruption (fasttop): 0x0000000001e8b250 ***
Aborted (core dumped)

Valgrind:

a@ubuntu:~/os/hw1$ valgrind --leak-check=full ./o f1.txt f2.txt o.txt
==21643== Memcheck, a memory error detector
==21643== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==21643== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==21643== Command: ./o f1.txt f2.txt o.txt
==21643== 
==21643== Invalid write of size 2
==21643==    at 0x4C2F843: __GI_memcpy (vg_replace_strmem.c:917)
==21643==    by 0x4EA5ED7: getdelim (iogetdelim.c:115)
==21643==    by 0x400959: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid write of size 1
==21643==    at 0x4EA5FD4: getdelim (iogetdelim.c:122)
==21643==    by 0x400959: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c2 is 2 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4EC28BC: strtok (strtok.S:137)
==21643==    by 0x40092F: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4EC28EC: strtok (strtok.S:163)
==21643==    by 0x40092F: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4EC28F3: strtok (strtok.S:167)
==21643==    by 0x40092F: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c1 is 1 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid write of size 1
==21643==    at 0x4EC2919: strtok (strtok.S:186)
==21643==    by 0x40092F: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c1 is 1 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4C2EC31: strcmp (vg_replace_strmem.c:755)
==21643==    by 0x400A67: insert (in /home/a/os/hw1/o)
==21643==    by 0x400942: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4C2DB62: strlen (vg_replace_strmem.c:412)
==21643==    by 0x4EBF66D: strdup (strdup.c:41)
==21643==    by 0x400ABB: insert (in /home/a/os/hw1/o)
==21643==    by 0x400942: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4C2DB74: strlen (vg_replace_strmem.c:412)
==21643==    by 0x4EBF66D: strdup (strdup.c:41)
==21643==    by 0x400ABB: insert (in /home/a/os/hw1/o)
==21643==    by 0x400942: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c1 is 1 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 2
==21643==    at 0x4C2F840: __GI_memcpy (vg_replace_strmem.c:917)
==21643==    by 0x400ABB: insert (in /home/a/os/hw1/o)
==21643==    by 0x400942: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid read of size 1
==21643==    at 0x4C2EC48: strcmp (vg_replace_strmem.c:755)
==21643==    by 0x400A67: insert (in /home/a/os/hw1/o)
==21643==    by 0x400942: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c1 is 1 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== Invalid free() / delete / delete[] / realloc()
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x400985: main (in /home/a/os/hw1/o)
==21643==  Address 0x51fc2c0 is 0 bytes inside a block of size 120 free'd
==21643==    at 0x4C2BCD7: free (vg_replace_malloc.c:473)
==21643==    by 0x4008F6: main (in /home/a/os/hw1/o)
==21643== 
==21643== 
==21643== HEAP SUMMARY:
==21643==     in use at exit: 0 bytes in 0 blocks
==21643==   total heap usage: 10 allocs, 11 frees, 1,878 bytes allocated
==21643== 
==21643== All heap blocks were freed -- no leaks are possible
==21643== 
==21643== For counts of detected and suppressed errors, rerun with: -v
==21643== ERROR SUMMARY: 22 errors from 12 contexts (suppressed: 0 from 0)

回答1:


After you free line the first time you should set it to NULL and len to 0

if (line)
    free(line);
line = NULL; /* make it NULL so you can call getline() again or just don't free it yet */
len  = 0;

other wise subsequent calls to getline() will try to access the invalid pointer.

Also, as I commented

if(newPtr->data == NULL)
    free(newPtr);

is wrong because you will dereference newPtr anyway, so you must

if (newPtr->data == NULL)
{
    free(newPtr);
    return;
}



回答2:


On line 138, if the condition is false (could not allocate space for string) then you forget to return, i.e.:

if(newPtr->data == NULL) {
    free(newPtr);
    return;
}

This, if it happens, will surely cause memory problems. There may be other problems (still searching...)



来源:https://stackoverflow.com/questions/28461513/to-allocate-or-not-to-allocate-invalid-read-of-size-1-errors-staring-for-2-ho

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!