Освободите всю память, выделенную LLVM, при выходе - PullRequest
2 голосов
/ 09 мая 2020

Я использую LLVM- C для программирования небольшого игрушечного языка. Я также использую valgrind для проверки утечек памяти.

Вот моя основная c детская программа:

#include <stdio.h>
#include <llvm-c/Core.h>

int main()
{
    size_t length;
    LLVMModuleRef module = LLVMModuleCreateWithName("llvm.hello");
    printf("Module name: %s\n", LLVMGetModuleIdentifier(module, &length));
    LLVMDisposeModule(module);
    LLVMShutDown();
    return 0;
}

Я могу скомпилировать и запустить программу в обычном режиме, как и ожидалось. Однако, когда я запускаю программу через valgrind, она сообщает мне, что у меня есть некоторая «все еще доступная» выделенная память вроде этой.

valgrind  --leak-check=full  out/hello_llvm
==5807== LEAK SUMMARY:
==5807==    definitely lost: 0 bytes in 0 blocks
==5807==    indirectly lost: 0 bytes in 0 blocks
==5807==      possibly lost: 0 bytes in 0 blocks
==5807==    still reachable: 56 bytes in 2 blocks
==5807==         suppressed: 0 bytes in 0 blocks

При поиске ответа на этом сайте я нашел много программисты говорят, что «все еще достижимые» утечки памяти не представляют большого значения. Я не хочу спорить об этом. Я хочу избавиться от ВСЕЙ выделенной памяти перед завершением моей программы.

Есть ли способ уменьшить выделенную память до нуля до завершения?

1 Ответ

1 голос
/ 09 мая 2020

Меня также очень волнует, когда valgrind не дает 0, в этих случаях я создаю файл подавления, если вы хотите попробовать:

Создайте и скомпилируйте минимальный тест:

> cat demo.c
#include <stdlib.h>

int main(void)
{
    malloc(10); // leak
}

Создайте файл подавления:

valgrind --leak-check=full --show-reachable=yes --error-limit=no --gen-suppressions=all --log-file=minimal.supp ./demo

Отредактируйте сгенерированный файл minimal.supp, вы увидите что-то вроде

==3102== Memcheck, a memory error detector
==3102== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==3102== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==3102== Command: ./demo
==3102== Parent PID: 2633
==3102== 
==3102== 
==3102== HEAP SUMMARY:
==3102==     in use at exit: 10 bytes in 1 blocks
==3102==   total heap usage: 1 allocs, 0 frees, 10 bytes allocated
==3102== 
==3102== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1
==3102==    at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==3102==    by 0x10915A: main (in /home/david/demo)
==3102== 
{
   <insert_a_suppression_name_here>
   Memcheck:Leak
   match-leak-kinds: definite
   fun:malloc
   fun:main
}
==3102== LEAK SUMMARY:
==3102==    definitely lost: 10 bytes in 1 blocks
==3102==    indirectly lost: 0 bytes in 0 blocks
==3102==      possibly lost: 0 bytes in 0 blocks
==3102==    still reachable: 0 bytes in 0 blocks
==3102==         suppressed: 0 bytes in 0 blocks
==3102== 
==3102== For lists of detected and suppressed errors, rerun with: -s
==3102== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Удалите все строки, начинающиеся с == и сохраните что-то вроде:

{
   <my stupid external LLVM leak>
   Memcheck:Leak
   match-leak-kinds: definite
   fun:malloc
   fun:main
}

Теперь запустите valgrind с файлом подавления:

valgrind --tool=memcheck --leak-check=full --show-reachable=yes --error-limit=no --suppressions=minimal.supp ./demo

Результат:

==3348== Memcheck, a memory error detector
==3348== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==3348== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==3348== Command: ./demo
==3348== 
==3348== 
==3348== HEAP SUMMARY:
==3348==     in use at exit: 10 bytes in 1 blocks
==3348==   total heap usage: 1 allocs, 0 frees, 10 bytes allocated
==3348== 
==3348== LEAK SUMMARY:
==3348==    definitely lost: 0 bytes in 0 blocks
==3348==    indirectly lost: 0 bytes in 0 blocks
==3348==      possibly lost: 0 bytes in 0 blocks
==3348==    still reachable: 0 bytes in 0 blocks
==3348==         suppressed: 10 bytes in 1 blocks
==3348== 
==3348== For lists of detected and suppressed errors, rerun with: -s
==3348== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 1 from 1)

Как видите, утечка перемещена из «определенно потеряна» в «подавлена»

...