在下面的代码中:

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

最佳答案

DocumentProperties的SAL批注无法表示DEVMODE是一个结构,该结构可能大于其声明的大小。该函数也没有采用指出DEVMODE传递大小的参数。该结构也没有一个用于说明大小的字段。因此无法使用__out_bcount_opt__out_bcount_part这样的注释。

这是所有采用DEVMODE的winapi函数的问题。这是一个建于石器时代的结构,早在SAL出现之前。如果微软可以再做一次,那么他们将采取不同的方式。现在为时已晚。

除了知道正确的方法和错误的工具之外,您无能为力。这只是一个警告。

09-29 23:55