Не могу понять отчет анализатора VS2015

Анализатор сообщает, что определенный параметр не инициализирован. Я не понимаю, почему.

Код:

LPTSTR buffer = NULL;
DWORD reqSize = 16000;
DWORD dataType;
LPTSTR * array;
DWORD szChars;
BOOL bRegProp;

// Allocate buffer according to required size
buffer = new TCHAR[(reqSize /sizeof(TCHAR))+2];
if(!buffer)
return NULL;

// Get the string into the buffer
if (FALSE == SetupDiGetDeviceRegistryProperty(Devs, DevInfo, Prop, &dataType, (LPBYTE)buffer, reqSize, &reqSize))
return NULL;

szChars = reqSize/sizeof(TCHAR);
buffer[szChars] = TEXT('\0');

Жалобы анализатора:

  1. буфер не инициализирован
  2. буфер используется, но, возможно, не был инициализирован

Теперь, согласно аннотации SAL для этой функции, вам нужно убедиться, что она не возвращает false:

_Success_(return != FALSE)
_When_((*PropertyRegDataType == REG_SZ), _At_((PSTR) PropertyBuffer,   _Post_valid_))
_When_((*PropertyRegDataType == REG_MULTI_SZ), _At_((PZZSTR) PropertyBuffer, _Post_valid_))
WINSETUPAPI
BOOL
WINAPI
SetupDiGetDeviceRegistryPropertyA(
_In_ HDEVINFO DeviceInfoSet,
_In_ PSP_DEVINFO_DATA DeviceInfoData,
_In_ DWORD Property,
_Out_opt_ PDWORD PropertyRegDataType,
_Out_writes_bytes_to_opt_(PropertyBufferSize, *RequiredSize) PBYTE PropertyBuffer,
_In_ DWORD PropertyBufferSize,
_Out_opt_ PDWORD RequiredSize
);

Может быть, я скучаю покогда» вещь?

1

Решение

Я думаю, что вы должны проверить это dataType является REG_SZ (или же REG_MULTI_SZ если необходимо).

В пунктах «когда» говорится «если dataType то есть REG_SZ, то buffer будет инициализирован «… но анализатор не знает, что это был не REG_DWORD, который был сохранен в reqSize (да, я знаю, что это не то, где функция хранит REG_DWORDs, но анализатор не).

0

Другие решения

Других решений пока нет …