﻿# V545\. Conditional expression of 'if' statement is incorrect for the HRESULT type value 'Foo'\. The SUCCEEDED or FAILED macro should be used instead\.

Анализатор обнаружил потенциальную ошибку при работе с переменной типа HRESULT\.

HRESULT \- это 32\-разрядное значение, разделенное на три различных поля: код серьезности ошибки, код устройства и код ошибки\. Для работы со значением HRESULT служат специальные константы, такие как S\_OK, E\_FAIL, E\_ABORT и так далее\. А для проверки значений тип HRESULT предназначены такие макросы как SUCCEEDED, FAILED\.

Предупреждение V545 выдается в том случае, если переменная типа HRESULT используется в операторе 'if' как переменная типа bool\. Пример:

```cpp
HRESULT hr;
...
if (hr)
{
}
```

HRESULT и тип bool это совершенно разные по смыслу типы\. Показанный пример сравнения некорректен\. Тип HRESULT имеет множество состояний\. Это может быть 0L \(S\_OK\), 0x80000002L \(Ran out of memory\), 0x80004005L \(unspecified failure\), и так далее\. Обратите внимание, что состояние S\_OK кодируется как 0\. 

Для проверки значения HRESULT необходимо использовать макрос SUCCEEDED или FAILED, объявленные в "WinError\.h"\.  Корректные варианты кода:

```cpp
if (FAILED(hr))
{
}
if (SUCCEEDED(hr))
{
}
```

Дополнительные ресурсы:

1. MSDN\. [Common HRESULT Values](https://docs.microsoft.com/en-us/windows/win32/seccrypto/common-hresult-values)\.
1. Wikipedia\. [HRESULT](https://en.wikipedia.org/wiki/HRESULT)\.