[英]Using dynamically-allocated arrays causes C6386 Buffer Overrun warning from Code Analysis
[英]windows C++ opening printer with documentproperties get C6836 “Write Overrun” Code analysis warning
在以下代碼中:
// If GetPrinter didn't fill in the DEVMODE, try to get it by calling
// DocumentProperties...
if (pi2->pDevMode == NULL)
{
dwNeeded = DocumentProperties(NULL, hPrinter,
printerName,
NULL, NULL, 0);
if (dwNeeded <= 0)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
return FALSE;
}
pDevMode = (DEVMODE *)GlobalAlloc(GPTR, dwNeeded);
if (pDevMode == NULL)
{
GlobalFree(pi2);
ClosePrinter(hPrinter);
return FALSE;
}
lFlag = DocumentProperties(NULL, hPrinter,
printerName,
pDevMode, NULL,
DM_OUT_BUFFER);
if (lFlag != IDOK || pDevMode == NULL)
{
GlobalFree(pDevMode);
GlobalFree(pi2);
ClosePrinter(hPrinter);
return FALSE;
}
pi2->pDevMode = pDevMode;
}
在線上
lFlag = DocumentProperties(NULL, hPrinter,
printerName,
pDevMode, NULL,
DM_OUT_BUFFER);
當我運行Visual Studio 2012“代碼分析”功能時,它會拋出警告:
C6386在寫入'pDevMode'時寫入溢出緩沖區溢出:可寫大小為'dwNeeded'字節,但可能寫入'220'字節。 對'pDevMode'的寫入無效,(在其可寫范圍之外)
代碼運行正常,但想知道如何修復此警告(最好不要禁用警告)
此錯誤的幫助頁面似乎不適用(或者我無法確定它是如何做的) http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(C6386) &RD =真
DocumentProperties的SAL注釋無法表示DEVMODE是一個結構,而不是大於其聲明的大小。 該函數不會采用聲明DEVMODE傳遞大小的參數。 結構也沒有一個表示大小的字段。 因此無法使用像__out_bcount_opt
或__out_bcount_part
這樣的注釋。
這是一個帶有DEVMODE的所有winapi函數的問題。 這是一個可以追溯到石器時代的結構,早在SAL即將到來之前。 如果微軟可以重新做到這一點,那么他們會采用不同的方式。 現在太晚了。
除了知道你做對了並且工具弄錯之后,你無能為力。 這只是一個警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.