C crypt function, malloc y valgrind

Mi página de manual para la función de cripta indica que:

“El valor de retorno apunta a datos estáticos cuyo contenido se sobrescribe con cada llamada”.

Sin embargo, cuando se usa la versión SHA512 (es decir, la sal comienza en $ 6 $ …), valgrind no parece estar de acuerdo. A menos que libere el puntero que devuelve la cripta, se enfada:

120 bytes in 1 blocks are still reachable in loss record 1 of 1 at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4C2DF4F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x521F4D4: __sha512_crypt (sha512-crypt.c:437) 

A la inversa, valgrind está bien si uso la versión DES (por lo que salt no comienza con $ 6 $ o similar).

¿Qué está pasando aquí y este comportamiento se explica en alguna parte?

Gracias por adelantado.

EDIT: Plataforma es Ubuntu 15.04 de 64 bits. Aquí hay un progtwig:

 #define _XOPEN_SOURCE 700 #include  int main(int argc, char** argv) { char *hash = crypt("password", "$6$Salty"); return 0; } 

Para algunas variaciones de cripta, el búfer preasignado no es lo suficientemente grande, por lo que asigna (a través de malloc) un búfer que será reutilizado por la próxima llamada a crypt que necesita un búfer grande (posiblemente después de realloc ). Es por eso que valgrind lo señala como “aún accesible”: hay una variable estática en la biblioteca que apunta al bloque.

Si lo liberara, es probable que la próxima llamada a crypt se comporte mal (es probable que se produzca un error en tiempo de ejecución sobre la reutilización de un bloque liberado).

No importa cuántas veces llames crypt , habrá un bloque identificado por valgrind como este. No es una pérdida de memoria real, solo una sobrecarga constante de la biblioteca que es prácticamente imposible de evitar.

En general, desea ignorar los mensajes de valgrind sobre bloques “aún accesibles” a menos que la cantidad de memoria sea inesperadamente grande, o las solicitudes provengan de un lugar que no debería almacenar los punteros devueltos en variables globales.