簡體   English   中英

windows C ++打開帶有documentproperties的打印機,獲取C6836“寫入溢出”代碼分析警告

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM