Не могу понять отчет анализатора 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, но анализатор не делает).

Другие вопросы по тегам