Не удается избавиться от предупреждения шины: «Поле используется до определения», «используется значение rvalue, которое не может быть инициализировано значением при некотором выполнении» - PullRequest
0 голосов
/ 25 июня 2018

Я изо всех сил пытаюсь избавиться от предупреждения шины для следующего кода:

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> Используется значение r, которое не может быть инициализировано значением при некотором выполнении

Предположительно, предполагается, что pPrinter не имеетзаселены еще.Я попытался пометить определение заголовка SetPrinter с /*@out@*/ s и т. Д., Но это не помогает.Я пробовал кучу аннотаций внутри файла заголовка, таких как /*@temp@*/, /*@dependent@*/, но безрезультатно.

Как мне разумно дать понять splint, что поле pPrinter, как ожидается, будет действительным после вызовадо GetPrinter?

1 Ответ

0 голосов
/ 02 июля 2018

До сих пор неясно, почему SetPrinter с аннотацией out не сработало. Однако приемлемый обходной путь (от user3386109) состоит в том, чтобы просто очистить память, чтобы шина считала ее инициализированной:

pPrinterInfo = malloc(bytesNeeded);

ZeroMemory(pPrinterInfo, bytesNeeded);

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

Где ZeroMemory это просто псевдоним для memset.

Это не идеально, было бы лучше, если бы не было предпринято никаких дополнительных действий для исправления этого предупреждения, однако это подойдет для моего случая.

...