﻿# V2584\. MISRA\. Expression used in condition should have essential Boolean type\.

Данное диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Это правило актуально только для C\. В условиях конструкций 'if' / 'for' / 'while' должны использоваться выражения, имеющие essential Boolean тип\.

Стандарт MISRA определяет следующую модель сущностных типов \(Essential type model\), в которой переменная может иметь тип:

* **Boolean**, если оперирует булевыми значениями true/false: '\_Bool';
* **signed**, если оперирует знаковыми целыми числами или является безымянным enum: 'signed char', 'signed short', 'signed int', 'signed long', 'signed long long', 'enum \{ \.\.\.\. \};';
* **unsigned**, если оперирует беззнаковыми целыми числами: 'unsigned char', 'unsigned short', 'unsigned int', 'unsigned long', 'unsigned long long';
* **floating**, если оперирует числами с плавающей точкой: 'float', 'double', 'long double';
* **character**, если оперирует только символами: 'char';
* **Именованный enum**, если оперирует с именованным множеством определенных пользователем значений: 'enum name \{ \.\.\.\. \};'

Таким образом, стандарт разрешает следующие виды выражений:

* выражение, имеющее тип bool \(начиная с C99\);
* выражение, в котором производится сравнение с помощью операторов '\=\=', '\!\=', '<', '\>', '<\=', '\>\=';
* константы со значением 0 или 1\.

Пример, на который анализатор выдаст предупреждение:

```cpp
void some_func(int run_it)
{
  if (run_it)
  {
    do_something();
  }

  // ....
}
```

Здесь нужно явно проверить, что переменная не равна нулю:

```cpp
void some_func(int run_it)
{
  if (run_it != 0)
  {
    do_something();
  }

  // ....
}
```

Еще один пример:

```cpp
void func(void *p)
{
  if (!p) return;
  // ....
}
```

Для устранения нарушения следует явно сравнить указатель с нулевым:

```cpp
void func(void *p)
{
  if (p == NULL) return;
  // ....
}
```

Анализатор не выдаст предупреждение на подобный код:

```cpp
void fun(void)
{
  while (1)
  {
    // ....
  }
}
```