无法摆脱夹板警告“定义之前使用的字段”,“使用的rvalue可能在某些执行时未初始化为值”

时间:2018-06-25 03:40:44

标签: c winapi splint

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

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@*/的标头定义,但这无济于事。我已经尝试在头文件中使用诸如/*@temp@*//*@dependent@*/之类的大量注释,但都无济于事。

在调用GetPrinter之后,如何明智地让splint知道pPrinter字段应该有效?

1 个答案:

答案 0 :(得分:2)

尚不清楚为什么带有3733603200注释的SetPrinter无法正常工作。但是(从user3386109开始)可以接受的解决方法是将内存清空,以便夹板将其视为已初始化:

out

pPrinterInfo = malloc(bytesNeeded); ZeroMemory(pPrinterInfo, bytesNeeded); if (GetPrinter(hPrinter, 4, (LPVOID)(pPrinterInfo), bytesNeeded, &bytesNeeded)){ 仅是ZeroMemory的别名。

这不是理想的,如果不采取其他措施解决此警告会更好,但是对于我的情况会这样做。