﻿# V1051\. It is possible that an assigned variable should be checked in the next condition\. Consider checking for typos\.

Анализатор обнаружил ситуацию, когда проверка переменной может быть пропущена в следующем 'if' после присваивания или инициализации\.

К примеру, ошибочным можно считать такой код:

```cpp
int ret = syscall(....);
if (ret != -1) { .... }
....
int ret2 = syscall(....);
if (ret != -1) { .... }    // <=
```

Часто бывают случаи, когда надо проверить возвращаемое значение какой\-либо функции\. Однако можно допустить ошибку, указав другую переменную внутри условия 'if'\. Чаще всего подобная ошибка возникает, когда фрагмент кода копируется, но в нём забывают заменить имя переменной в условии\. В рассмотренном примере в условии забыли заменить имя 'ret' на 'ret2'\.

Исправленный вариант:

```cpp
int ret2 = syscall(....);
if (ret2 != -1) { .... }
```

Или же можно допустить ошибку в таком случае:

```cpp
obj->field = ....;
if (field) ....;
```

Переменная и член класса имеют одинаковые имена, из\-за чего их легко перепутать\.

Диагностика является эвристической\. Во время своей работы диагностика разбивает имена переменных на составные части, сравнивает их и на основании этого делает предположения о наличии опечатки\. Также производится базовая проверка типов\. Это сделано для того, чтобы сократить число ложных срабатываний\.

Часто диагностика может выдавать срабатывание на подобные случаи:

```cpp
var->m_abc = ....;
var->m_cba = ....;
if (var->m_abc)      // <=
{
  ....
}
```

Как правило это корректный код и ошибки нет\. Можно либо подавить диагностику, либо поменять переменные местами, чтобы присваивание проверяемой переменной находилось перед 'if':

```cpp
var->m_cba = ....;
var->m_abc = ....;
if (var->m_abc)
{
  ....
}
```

Такая запись может сделать код более читаемым, т\.к\. присваивание и проверка находятся рядом\.