C crypt函数,malloc和valgrind

我的crypt函数的手册页指出:

“返回值指向静态数据,其内容被每次调用覆盖。”

但是,当使用SHA512版本时(即盐启动$ 6 $ …),valgrind似乎不同意。 除非我释放crypt返回的指针,否则会感到沮丧:

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) 

相反,如果我使用DES版本,valgrind就可以了(因此盐不会以6美元或类似价格开头)。

这里发生了什么,这种行为是在哪里解释的?

提前致谢。

编辑:平台是Ubuntu 15.04 64位。 这是一个程序:

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

对于某些crypt变体,预分配的缓冲区不够大,因此它(通过malloc)分配一个缓冲区,该缓冲区将在下一次调用需要大缓冲区的crypt重用(可能在重新分配之后)。 这就是为什么它被valgrind称为“仍然可达”的原因 – 库中有一个静态变量指向块。

如果您要释放它,可能下一次调用crypt会出现行为exception(可能会给出重用已释放块的运行时错误)。

无论你多少次调用crypt ,都会有像valgrind这样的一个块。 它不是真正的内存泄漏,只是来自库的不断开销,几乎无法避免。

通常,您希望忽略有关“仍可访问”块的valgrind消息,除非内存量意外大,或者请求来自不应将返回指针存储在全局变量中的位置。