C/C++中內存塊置0的三種方法:memset,ZeroMemory,SecurZeroMemory


作者: 陳飛. 

加個前提:本文對應Windows下編程環境。

簡而言之:一般情況,如初始化內存塊的時候,用ZeroMemory。銷毀內存塊中儲敏感數據時或者釋放存有敏感數據(比如密碼,密鑰等)的內存塊前應使用使用SecurZeroMemory。如無特殊原因不使用“={ 0 }”。

使用memset函數將內存塊置0是完全沒有問題。memset的好處是跨平台比較容易,可是C/C++跨平台就是夢魘。在使用memset的時候有個小地方需要注意,W.Richard Stevens在《UNIX網絡編程》中提到void *memset(void *dest, int c, size_t count)的后兩個參數容易寫反,而且在編譯時無法發現。

 

ZeroMemory宏,在底層就是由memset實現的。只是ZeroMemory易讀性更好,更加健壯。或者說看起來更cool、更professional。在微軟平台下的程序,推薦使用ZeroMemory。

 

SecurZeroMemory函數,可以看作是在安全方面加強版的ZeroMemory。細心的讀者是否注意到ZeroMemory是宏,而SecurZeroMemory是函數?ZeroMemory在一定的編譯優化條件下,使用ZeroMemory置0以后的內存塊如果再也不被引用,ZeroMemory有可能會被“優化”掉而不執行。如果這塊內存里存儲的是用戶的密碼、加解密算法的密鑰等敏感信息,就存在被黑客偷窺的可能。而SecurZeroMemory在任何條件下都不會被“優化”掉,所以在銷毀內存塊中儲敏感數據時或者釋放存有敏感數據的內存塊前應使用SecurZeroMemory,而不是ZeroMemory。

 

至於"={ 0 }"的形式,盡量不要使用,不夠直觀。而且在內存對齊方面也存在一定問題。有興趣的朋友可以參考Raymond Chen的《Why do Microsoft code samples tend to use ZeroMemory instead of { 0 }?》

順便提一句,Raymond Chen可不是一般的人物,他是Windows組元老級人物,著有The old new thing一書,對Windows的技術歷史和原理感興趣的朋友可以一讀。他的Blog: http://blogs.msdn.com/b/oldnewthing/ 到現在依然非常活躍

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM