![](/img/trans.png)
[英]Any reason to use SecureZeroMemory() instead of memset() or ZeroMemory() when security is not an issue?
[英]Issue with new/delete with SecureZeroMemory
誰能幫助我理解為什么我的代碼在代碼的第一部分中的delete [] szPassword失敗? 我知道szPassword僅復制“ a”,並且st2等於8:
TCHAR *szPassword = new TCHAR[2]();
StringCchCopy(szPassword, 2, L"ab");
SIZE_T st2 = sizeof(szPassword);
SecureZeroMemory(szPassword, st2);
delete[] szPassword;
但是,當運行此命令時,如果沒有獲取sizeof()值,則可以正常工作:
TCHAR *szPassword = new TCHAR[2]();
StringCchCopy(szPassword, 2, L"ab");
SecureZeroMemory(szPassword, 2);
delete[] szPassword;
szPassword是一個指針,而不是一個數組,因此sizeof(szPassword)
將為4或8。在64位應用程序中,這太多了,您將嘗試將8個字節寫入4個字節的緩沖區。
C ++運行時可以分配超出您要求的數量,而且它經常這樣做,因此它可以在緩沖區的末尾添加特殊數據,從而可以檢測緩沖區溢出。
做這樣的事情:
const UINT charcount = 2;
TCHAR *szPassword = new TCHAR[charcount];
...
SecureZeroMemory(szPassword, charcount * sizeof(TCHAR));
delete[] szPassword;
如果緩沖區總是很小,則可以在堆棧上使用一個數組:
TCHAR szPassword[200];
...
SecureZeroMemory(szPassword, sizeof(szPassword));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.