3

我正在努力摆脱以下代码的夹板警告:

void GetPrinterInfo(HANDLE hPrinter){
    PRINTER_INFO_4* pPrinterInfo = NULL;
    DWORD bytesNeeded;

    GetPrinter(hPrinter, 4, NULL, 0, &bytesNeeded);

    pPrinterInfo = malloc(bytesNeeded);

    if (GetPrinter(hPrinter, 4, (LPVOID)(pPrinterInfo), bytesNeeded, &bytesNeeded)){
        printf("Printer name: %S", pPrinterInfo->pPrinterName);
    }

    free(pPrinterInfo);
}

警告是(在“printf”行):

定义前使用的字段 pPrinterInfo->pPrinterName

1> 使用的右值在某些执行时可能未初始化为值

大概它假设pPrinter尚未填充。我试过SetPrinter/*@out@*/s 等标记标题定义,但它没有帮助。我在头文件中尝试了一堆注释,例如/*@temp@*//*@dependent@*/无济于事。

我如何明智地让夹板知道 pPrinter 字段在调用后应该是有效的GetPrinter

4

1 回答 1

2

SetPrinter目前尚不清楚为什么out注释不起作用。然而,一个可接受的解决方法(来自 user3386109)是只清空内存,以便夹板将其视为已初始化:

pPrinterInfo = malloc(bytesNeeded);

ZeroMemory(pPrinterInfo, bytesNeeded);

if (GetPrinter(hPrinter, 4, (LPVOID)(pPrinterInfo), bytesNeeded, &bytesNeeded)){

WhereZeroMemory只是memset.

这并不理想,如果不采取额外措施来解决此警告会更好,但它适用于我的情况。

于 2018-07-02T02:15:12.080 回答