Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Valgrind Memory Leak Reachable

Keep getting reachable memory leak for printf and scanf statement. I'm needing to have no leaks at all. When I run the report it says that I get the reachable leaks at a print statement and scan statement. My question is how to I fix the leaks?

Here is the valgrind report:

kidslove-MacBook:src kidslove$ valgrind --leak-check=full --show-leak-kinds=all ./a.out

==6405== Memcheck, a memory error detector
==6405== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==6405== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info
==6405== Command: ./a.out
==6405== 
Enter File Name: input2.txt
1.  Print the array sorted by street.
2.  Print the array sorted by city.
3.  Print the array sorted by state then city
4.  Print the array sorrted by zip.
5.  Quit

--> 5
==6405== 
==6405== HEAP SUMMARY:
==6405==     in use at exit: 42,554 bytes in 422 blocks
==6405==   total heap usage: 513 allocs, 91 frees, 53,707 bytes allocated
==6405== 
==6405== 4,096 bytes in 1 blocks are still reachable in loss record 77 of 78
==6405==    at 0x1000076C1: malloc (vg_replace_malloc.c:303)
==6405==    by 0x1001F1836: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==6405==    by 0x100206387: __swsetup (in /usr/lib/system/libsystem_c.dylib)
==6405==    by 0x10022075D: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==6405==    by 0x100220C80: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==6405==    by 0x1001F6B71: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==6405==    by 0x1001F49D7: printf (in /usr/lib/system/libsystem_c.dylib)
==6405==    by 0x1000010B3: openFile (hw5.c:15)
==6405==    by 0x100001CD5: main (cscd240hw5.c:9)
==6405== 
==6405== 4,096 bytes in 1 blocks are still reachable in loss record 78 of 78
==6405==    at 0x1000076C1: malloc (vg_replace_malloc.c:303)
==6405==    by 0x1001F1836: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==6405==    by 0x1001F4E99: __srefill0 (in /usr/lib/system/libsystem_c.dylib)
==6405==    by 0x1001F4F94: __srefill (in /usr/lib/system/libsystem_c.dylib)
==6405==    by 0x1001FC00D: __svfscanf_l (in /usr/lib/system/libsystem_c.dylib)
==6405==    by 0x1001F515D: scanf (in /usr/lib/system/libsystem_c.dylib)
==6405==    by 0x1000010C8: openFile (hw5.c:16)
==6405==    by 0x100001CD5: main (cscd240hw5.c:9)
==6405== 
==6405== LEAK SUMMARY:
==6405==    definitely lost: 0 bytes in 0 blocks
==6405==    indirectly lost: 0 bytes in 0 blocks
==6405==      possibly lost: 0 bytes in 0 blocks
==6405==    still reachable: 8,192 bytes in 2 blocks
==6405==         suppressed: 34,362 bytes in 420 blocks
==6405== 
==6405== For counts of detected and suppressed errors, rerun with: -v
==6405== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 15)

Part of my program that is returning the leaks:

FILE *openFile() {
  char name[20];
  FILE *fin;

  do {
    printf("Enter File Name: "); //line 15 leak
    scanf("%s", name); // line 16 leak
    fin = fopen(name, "r");
  }while(fin == NULL);
  return fin;

}

The original call being:

fin = openFile();
like image 587
kids love Avatar asked Oct 20 '22 10:10

kids love


1 Answers

The standard C library on your system doesn't seem to bother freeing buffers that stdio uses. This is nothing to worry about. The system frees the memory when your program exits.

Usually packages for valgrind provided by the operating system contain suppression files that tell valgrind to not report lots of those expected leaks. Either you're using a non-standard package of valgrind, you've disabled the standard suppressions or whoever built valgrind on that system didn't bother.

like image 66
Art Avatar answered Oct 28 '22 20:10

Art