繁体   English   中英

C crypt函数,malloc和valgrind

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM