Предупреждение C6217

Неявное приведение между семантически разными типами целых чисел: тестирование HRESULT с помощью 'not'. Вместо этого рассмотрите возможность использования SUCCEEDED или FAILED макроса.

Замечания

Это предупреждение указывает на то, что код тестирует с HRESULT помощью оператора логического не (!) (). Значение 0 (значение, определенное для S_OK) указывает на успех в объекте HRESULT. Однако 0 также указывает на сбой логического типа. Если вы протестируете HRESULT с помощью оператора логического не (!) для определения блока кода для выполнения, это может привести к неправильному поведению или коду, который путает будущих обработчиков.

Чтобы проверить, является ли успех или сбой HRESULT , используйте SUCCEEDED вместо него или FAILED макросы.

Это предупреждение работает для обоих HRESULT типов и SCODE типов.

Имя анализа кода: TESTING_HRESULT_WITH_NOT

Пример

Следующий код создает это предупреждение, так как он использует оператор логического не (!) для определения успеха или сбоя HRESULT значения. В этом случае код выполняет неправильный путь кода, так как HRESULT значение 0 указывает на успешность, поэтому ( !hr ) неправильно выполняет код сбоя:

#include <windows.h>
#include <objbase.h>

void f( )
{
  HRESULT hr = CoInitialize(NULL);
  if (!hr)
  {
    // failure code ...
  }
  else
  {
    // success code ...
  }
}

Чтобы исправить это предупреждение, следующий код использует FAILED макрос для проверка для сбоя:

#include <windows.h>
#include <objbase.h>

void f( )
{
  HRESULT hr = CoInitialize(NULL);
  if (FAILED(hr))
  {
    // failure code ...
  }
  else
  {
    // success code ...
  }
}

См. также

SUCCEEDED Макрос
FAILED Макрос