3

次のコードでは:

// 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=真

4

1 に答える 1

1

DocumentProperties の SAL 注釈は、DEVMODE が構造体であり、宣言されたサイズよりも大きい可能性があることを表現できません。この関数は、渡された DEVMODE のサイズを示す引数も取りません。また、構造にはサイズを示す単一のフィールドもありません。__out_bcount_optそのため、 orのような注釈は__out_bcount_part使用できませんでした。

これは、DEVMODE を取るすべての winapi 関数の問題です。これは、SAL が登場するずっと前の石器時代にさかのぼる建造物です。マイクロソフトがそれをやり直すことができれば、彼らはこれを別の方法で行うでしょう. もう遅すぎる。

自分が正しく、ツールが間違っていることを知る以外にできることはありません。これは単なる警告です。

于 2013-04-13T14:56:19.163 に答える