Quando um processo chama free (), ele não retorna a memória imediatamente ao sistema, em vez disso, retorna-a de volta ao heap pertencente a esse processo. O heap usa o mapeamento de memória anônima para grandes blocos ou o sbrk () para reduzir ou aumentar o heap. A memória do heap é retornada ao sistema quando é desmapeada ou o heap encolhe com sbrk (). Neste ponto, as páginas podem ser reutilizadas por outros processos e, quando são reutilizadas, são sempre zeradas antes que o processo possa acessá-las. [1]
alocações de memória, como malloc, não zeram memória quando estão livres para o heap devido a problemas de desempenho. Normalmente, a melhor prática para dados sensíveis deve ser zerada antes de ser liberada. No entanto, eu acho que você quer impor essa polícia para que toda a memória seja liberada durante o tempo de vida de um processo. O glibc 2.4 e superior possui uma opção de ambiente MALLOC_PERTURB_ que, quando configurada para um valor diferente de zero, inicializará a memória para o complemento do valor quando a memória for alocada e quando for liberada com free (). A desvantagem disso é que ele pode acionar bugs no código que erroneamente confiam que a memória seja normalmente inicializada em zero na alocação.
Para usar MALLOC_PERTURB_, por ex. para configurá-lo para um valor aleatório ..
export MALLOC_PERTURB_=$(($RANDOM % 255 + 1))
e execute seu código.
[1] Bem quase. mmap () usando MAP_UNINITIALIZED e um kernel configurado com CONFIG_MMAP_ALLOW_UNINITIALIZED permite a não zeragem de memória, mas isso nunca é permitido no Ubuntu.