# Valgrind

Valgrind é um software livre que auxilia o trabalho de depuração de programas criado por Julian Seward. Ele possui ferramentas que detectam erros decorrentes do uso incorreto da memória dinâmica, como por exemplo os vazamentos de memória, alocação e desalocação incorretas e acessos a áreas inválidas.
O diferencial deste programa está no fato de que usa uma máquina virtual para simular o acesso à memória do programa em teste, eliminando a necessidade de uso de outras bibliotecas auxiliares ou mudanças drásticas no código.
Apesar de estar direcionado para programas codificados em C ou C++, a máquina virtual torna possível o uso do Valgrind com programas que foram codificados em outras linguagens, como o Java.
Através do uso de outras ferramentas que acompanham o Valgrind, é possível até otimizar o uso da cache do processador, localizar regiões da memória acessadas de forma concorrente e obter estatísticas de uso da memória.

## Origem do nome

Originalmente o programa foi chamado de Heimdall, o vigia de todos os deuses nórdicos, porém já havia outro projeto com o mesmo nome. Então ele foi mudado para Valgrind, ainda da mitologia nórdica, que é o nome do portão do palácio de Valhalla. No palácio de Valhalla, que fica na terra mitológica de Asgard, entram pelo Valgrind apenas os cavaleiros mais bravos escolhidos dos deuses para enfrentar o Ragnarok, o fim do mundo.

## Funcionamento

Valgrind é na verdade uma máquina virtual usando técnicas JIT. O código dos programas que estão sendo executados pelo Valgrind não executam diretamente sobre o processador da máquina, sendo antes traduzidos para uma outra representação intermediária chamada ucode. A ferramenta escolhida então modifica este código da maneira necessária para realizar sua tarefa e o entrega de volta para o Valgrind executar.
Isto justifica a grande perda de desempenho ao executar programas com o Valgrind, ao mesmo tempo que possibilita o monitoramento completo do programa em execução, das suas bibliotecas sem ligar bibliotecas adicionais. A ferramenta em questão pode ser uma das que estão disponíveis no pacote Valgrind ou outras desenvolvidas independentemente por pessoas que não estão diretamente ligadas ao projeto. A ferramenta mais utilizada do pacote é chamada memcheck.

## Memcheck

Memcheck é a ferramenta padrão utilizada pelo Valgrind caso uma não seja explicitamente indicada. Com ela é possível monitorar como o programa faz uso da memória, pois ela mantém um mapa de bits indicando quais áreas da memória estão alocadas, quais não estão e quais estão alocados e iniciados.
Isto é possível pois a ferramenta substitui os procedimentos das linguagens C/C++ para alocação e desalocação de memória por um código próprio, inserindo também código de monitoramento sempre que há uma instrução de acesso em memória. Através deste mecanismo memcheck pode encontrar os seguintes tipos de problemas:
* Leitura/escrita em áreas de memória já desalocadas
* Leitura/escrita em áreas de memória não alocadas
* Leitura/escrita em áreas de memória que ultrapassam uma área alocada
* Leitura/escrita em áreas impróprias ou incomuns na pilha de execução
* Vazamentos de memória
* Uso de variáveis ou ponteiros não iniciados
* Passagem de apontadores para áreas não endereçáveis
* Uso incorreto de malloc, calloc, new, free e delete
* Sobreposição de ponteiros no uso das funções memcpy, strcpy e semelhantes