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消息,除非内存量意外大,或者请求来自不应将返回指针存储在全局变量中的位置。