我正努力摆脱以下代码的夹板警告:
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字段应该有效?
答案 0 :(得分:2)
尚不清楚为什么带有3733603200
注释的SetPrinter
无法正常工作。但是(从user3386109开始)可以接受的解决方法是将内存清空,以便夹板将其视为已初始化:
out
pPrinterInfo = malloc(bytesNeeded);
ZeroMemory(pPrinterInfo, bytesNeeded);
if (GetPrinter(hPrinter, 4, (LPVOID)(pPrinterInfo), bytesNeeded, &bytesNeeded)){
仅是ZeroMemory
的别名。
这不是理想的,如果不采取其他措施解决此警告会更好,但是对于我的情况会这样做。