2011-08-10 72 views
2

getmodulefilenamew函數產生誤報(緩衝區溢出),因爲它接受第二個參數作爲緩衝區 - 在我們的例子中爲固定大小。緩衝區溢出或誤報?

但希望通過它的文檔:http://msdn.microsoft.com/en-us/library/ms683197%28v=vs.85%29.aspx

引用:如果緩衝區太小,無法容納模塊名,字符串被截斷爲n大小字符,包括終止空字符,該函數返回n大小和功能將最後一個錯誤設置爲ERROR_INSUFFICIENT_BUFFER。

作爲可信賴的第三方人員可以確認或拒絕此問題爲誤報。謝謝你的幫助!

===

HMODULE applicationModule = GetModuleHandleW(NULL); 
WCHAR processName[MAX_PATH]; 
memset(processName, 0, sizeof(processName)); 
GetModuleFileNameW(applicationModule, processName, sizeof(processName)); 

===

問題是與GetModuleFileNameW功能

掃描通過Veracode的靜態分析器提供線。

+0

您是否在談論某種靜態檢查工具?告訴我們,告訴我們你的代碼。否則沒有機會獲得有意義的答案。 –

+0

我的不好,抱歉。我更新了問題。 –

回答

2

您的問題是您傳遞的值不正確nSize。您正在傳遞字節數,但您應該傳遞字符數MAX_PATH。這些值因寬字符的大小爲2個字節而不同。

所以,是的,你的代碼有錯誤。如果模塊名稱足夠長,Windows將嘗試將最多520個字符寫入只有260個空間的緩衝區。

+0

我明白了。 在這種情況下緩衝區溢出是不可能的,因爲緩衝區將被簡單地截斷爲最大可用大小+空終止字符。 只需要有人評論/批准就可以了。對不起,這樣的問題打擾。 –

+0

不,緩衝區溢出是非常可能的。緩衝區比你所說的要小。對於長度超過260個字符的模塊名稱,您將有一個緩衝區溢出。 –

+0

但是:「如果模塊名稱大於提供的緩衝區,那麼該函數會將nSize字符寫入緩衝區,截斷其餘字符。」 是的,在這種情況下,我不會得到全名(260+),而是會得到截斷名稱。我理解這個文檔是否正確? –