Предупреждение 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 ...
}
}
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по