我的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 <unistd.h>
int main(int argc, char** argv) {
char *hash = crypt("password", "$6$Salty");
return 0;
}
答案 0 :(得分:4)
对于某些crypt变体,预分配的缓冲区不够大,因此它(通过malloc)分配一个缓冲区,该缓冲区将在下一次需要大缓冲区的crypt
调用时重用(可能在{{1之后)它)。这就是为什么它被注意到&#34;仍然可以到达&#34;通过valgrind - 库中有一个指向块的静态变量。
如果要释放它,可能下一次调用crypt会出现行为异常(可能会因重用已释放的块而产生运行时错误)。
无论你多少次调用realloc
,都会有一个由valgrind识别的块。它不是一个真正的内存泄漏,只是从库中不断避免的开销。
一般来说,你想要忽略关于&#34;仍然可以访问的valgrind消息&#34;阻止除非内存量意外大,或者请求来自不应该将返回的指针存储在全局变量中的地方。