簡體   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