[英]C crypt function, malloc and valgrind
我的crypt函数手册页指出:
“返回值指向静态数据,其每次调用都会覆盖其内容。”
但是,当使用SHA512版本(即salt起价$ 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很好(因此,salt开头不是$ 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;
}
对于一些隐窝变化,预先分配的缓冲区不够大,所以它分配(通过malloc的),将通过下一个调用重用的缓冲区crypt
,需要一个大的缓冲区(可能以后realloc
荷兰国际集团的话)。 这就是为什么valgrind将其标记为“仍可访问”的原因-库中有一个指向该块的静态变量。
如果要释放它,则下一次对crypt的调用很可能会出现异常(可能会给出有关重新使用释放块的运行时错误)。
无论您多少次调用crypt
,都会有一个这样的valgrind标识的块。 这不是真正的内存泄漏,只是库中不断增加的开销,几乎是无法避免的。
通常,除非内存量意外大,或者请求来自不应将返回的指针存储在全局变量中的位置,否则您通常要忽略有关“仍可到达”块的valgrind消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.