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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Данная диагностика классифицируется как:

CWE-754

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V1051.