{"id":213,"date":"2022-10-05T10:38:05","date_gmt":"2022-10-05T13:38:05","guid":{"rendered":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/?p=213"},"modified":"2022-10-05T10:38:05","modified_gmt":"2022-10-05T13:38:05","slug":"valgrind-como-detector-de-vazamento-de-memoria","status":"publish","type":"post","link":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/2022\/10\/05\/valgrind-como-detector-de-vazamento-de-memoria\/","title":{"rendered":"Valgrind como detector de vazamento de mem\u00f3ria"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"121\" height=\"127\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/10\/st-george_sm.png\" alt=\"\" class=\"wp-image-215\"\/><\/figure>\n\n\n\n<p>O conjunto de ferramentas <a rel=\"noreferrer noopener\" href=\"https:\/\/valgrind.org\" data-type=\"URL\" data-id=\"https:\/\/valgrind.org\" target=\"_blank\">Valgrind<\/a> fornece uma s\u00e9rie de recursos de depura\u00e7\u00e3o e <em>profiling<\/em> que ajudam a tornar os programas desenvolvidos mais r\u00e1pidos e corretos. A mais popular dessas ferramentas \u00e9 chamada <strong>Memcheck<\/strong>. Esta pode detectar muitos erros relacionados \u00e0 mem\u00f3ria que s\u00e3o comuns em programas C\/C++ e que podem levar a falhas e comportamentos imprevis\u00edveis. Os outros recursos s\u00e3o, Cachegrind, Callgrind, Massif, Helgrind, DRD e DHAT. Os comandos escritos aqui neste post s\u00e3o bem simplificados. Caso queiram mais informa\u00e7\u00f5es bom ler o manual do usu\u00e1rio dispon\u00edvel <a rel=\"noreferrer noopener\" href=\"https:\/\/valgrind.org\/docs\/download_docs.html\" data-type=\"URL\" data-id=\"https:\/\/valgrind.org\/docs\/download_docs.html\" target=\"_blank\">aqui<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Preparando o ambiente<\/strong><\/h2>\n\n\n\n<p>Compile o programa com a op\u00e7\u00e3o <strong>-g<\/strong> para incluir informa\u00e7\u00f5es de depura\u00e7\u00e3o. Desta forma o Memcheck ir\u00e1 mostrar a linha exata do erro. Quanto a otimiza\u00e7\u00e3o coloque <strong>-O0<\/strong>, mas nem sempre em um c\u00f3digo muito extenso dever\u00e1 utilizar esta op\u00e7\u00e3o. Uma solu\u00e7\u00e3o \u00e9 colocar <strong>-O1<\/strong> j\u00e1 que tem resultado significativamente bons.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Executando o programa<\/strong><\/h2>\n\n\n\n<p>A forma de execu\u00e7\u00e3o do programa com a ferramenta \u00e9:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">valgrind --leak-check=yes .\/meu_programa &lt;argumentos><\/code><\/pre>\n\n\n\n<p>O programa de exemplo ser\u00e1 o c\u00f3digo a seguir (main.c):<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"c\" class=\"language-c\">#include &lt;stdlib.h>\n#include &lt;unistd.h>\n\nint main(void){\n    char* arg1 = malloc(10);\n    int* arg2 = malloc(sizeof(int));\n    write (1 \/* stdout *\/, arg1, 10);\n    exit(arg2[0]); \n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Para compilar digite em um terminal:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">gcc -o memcheck.exe main.c -O0 -Wall -pg -g<\/code><\/pre>\n\n\n\n<p>Muitas mensagens aparecem depois que executa o comando, parecida com as mensagens a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">$valgrind --leak-check=yes .\/memcheck.exe\n==8269== Memcheck, a memory error detector\n==8269== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.\n==8269== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info\n==8269== Command: .\/memcheck.exe\n==8269== \n==8269== Syscall param write(buf) points to uninitialised byte(s)\n==8269==    at 0x498BA37: write (write.c:26)\n==8269==    by 0x10928C: main (main.c:10)\n==8269==  Address 0x4aa40e0 is 0 bytes inside a block of size 10 alloc'd\n==8269==    at 0x4848899: malloc (vg_replace_malloc.c:381)\n==8269==    by 0x109264: main (main.c:8)\n==8269== \n==8269== Syscall param exit_group(status) contains uninitialised byte(s)\n==8269==    at 0x4961CA1: _Exit (_exit.c:30)\n==8269==    by 0x48BC551: __run_exit_handlers (exit.c:136)\n==8269==    by 0x48BC60F: exit (exit.c:143)\n==8269==    by 0x109299: main (main.c:11)\n==8269== \n==8269== \n==8269== HEAP SUMMARY:\n==8269==     in use at exit: 14 bytes in 2 blocks\n==8269==   total heap usage: 3 allocs, 1 frees, 8,302 bytes allocated\n==8269== \n==8269== LEAK SUMMARY:\n==8269==    definitely lost: 0 bytes in 0 blocks\n==8269==    indirectly lost: 0 bytes in 0 blocks\n==8269==      possibly lost: 0 bytes in 0 blocks\n==8269==    still reachable: 14 bytes in 2 blocks\n==8269==         suppressed: 0 bytes in 0 blocks\n==8269== Reachable blocks (those to which a pointer was found) are not shown.\n==8269== To see them, rerun with: --leak-check=full --show-leak-kinds=all\n==8269== \n==8269== Use --track-origins=yes to see where uninitialised values come from\n==8269== For lists of detected and suppressed errors, rerun with: -s\n==8269== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Analisando as mensagens<\/h2>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<ul class=\"wp-block-list\"><li>O primeiro problema \u00e9 o bloco da \u00e1rea de heap da aloca\u00e7\u00e3o de mem\u00f3ria est\u00e1 al\u00e9m do permitido.<\/li><li>O c\u00f3digo ==8269== \u00e9 o PID do processo (identificador). Importante quando quer saber se tem algum problema com prioridades.<\/li><li>A primeira linha, (&#8220;Syscall param write(buf) points to uninitialised\u2026&#8221;), mostra o tipo de erro.<\/li><li>O endere\u00e7o do c\u00f3digo onde ocorre o erro \u00e9 mostrado em 0x498BA37 e qual a linha no c\u00f3digo em C.<\/li><li>Tamb\u00e9m mostra quantos blocos forma utilizados para o programa. No exemplo, 14 bytes em 2 blocos.<\/li><li>Existe um erro de vazamento de mem\u00f3ria descrito em (&#8220;0x4848899: malloc (vg_replace_malloc.c:381)&#8221;).<\/li><li>Veja que inclusive a ferramenta sugere a op\u00e7\u00e3o &#8211;leak-check=full para uma verifica\u00e7\u00e3o mais completa e para mostrar todos os erros a op\u00e7\u00e3o -s.<\/li><\/ul>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>Podemos modificar o c\u00f3digo anterior para que o mesmo possa gerar um vazamento de mem\u00f3ria. Para isso modifique a linha <strong>int* arg2 = malloc(sizeof(int));<\/strong> para <strong>int* arg2 = malloc(10 * sizeof(int));<\/strong><\/p>\n\n\n\n<p>Tamb\u00e9m inclua a linha <strong>arg2[10] = 0;<\/strong> e retire a linha <strong>exit(arg2[0]);<\/strong><\/p>\n\n\n\n<p>Veja o que ocorre:<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">==8923== Invalid write of size 4\n==8923==    at 0x10925F: main (main.c:10)\n==8923==  Address 0x4aa4148 is 0 bytes after a block of size 40 alloc'd\n==8923==    at 0x4848899: malloc (vg_replace_malloc.c:381)\n==8923==    by 0x109252: main (main.c:9)\n...\n...\n...\n==8923== 10 bytes in 1 blocks are definitely lost in loss record 1 of 2\n==8923==    at 0x4848899: malloc (vg_replace_malloc.c:381)\n==8923==    by 0x109244: main (main.c:8)\n==8923== \n==8923== 40 bytes in 1 blocks are definitely lost in loss record 2 of 2\n==8923==    at 0x4848899: malloc (vg_replace_malloc.c:381)\n==8923==    by 0x109252: main (main.c:9)\n==8923== \n==8923== LEAK SUMMARY:\n==8923==    definitely lost: 50 bytes in 2 blocks\n==8923==    indirectly lost: 0 bytes in 0 blocks\n==8923==      possibly lost: 0 bytes in 0 blocks\n...\n...\n...<\/code><\/pre>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<p>Como a mem\u00f3ria n\u00e3o foi desalocada e o  tamanho excedeu a aloca\u00e7\u00e3o do heap, existe um vazamento de 50 bytes em dois blocos.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Onde aparece &#8220;definitely lost&#8230;&#8221;: seu programa est\u00e1 vazando mem\u00f3ria. Deve ser corrigido.<\/li><li>&#8220;probably lost&#8221;: seu programa est\u00e1 vazando mem\u00f3ria se voc\u00ea utilizar os ponteiros de forma indevida (mover o ponteiro at\u00e9 o meio do bloco do heap).<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>O conjunto de ferramentas Valgrind fornece uma s\u00e9rie de recursos de depura\u00e7\u00e3o e profiling que ajudam a tornar os programas desenvolvidos mais r\u00e1pidos e corretos. A mais popular dessas ferramentas \u00e9 chamada Memcheck. Esta pode detectar muitos erros relacionados \u00e0 mem\u00f3ria que s\u00e3o comuns em programas C\/C++ e que podem levar a falhas e comportamentos [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-213","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/posts\/213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/comments?post=213"}],"version-history":[{"count":7,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/posts\/213\/revisions"}],"predecessor-version":[{"id":221,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/posts\/213\/revisions\/221"}],"wp:attachment":[{"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/media?parent=213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/categories?post=213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/tags?post=213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}