# V1073. Check the following code block after the 'if' statement. Consider checking for typos.

Анализатор обнаружил возможную ошибку, связанную с тем, что блок кода ('{ .... }'), идущий после конструкции 'if', к ней не относится.

Рассмотрим первый синтетический пример:

    if (a == 1) nop();              // <=
    {
      nop2();
    }

При беглом обзоре кода может показаться, что блок выполнится, если условие истинно, но на самом деле это не так. Блок будет выполняться всегда, независимо от условия. Это может ввести программиста в заблуждение.

Рассмотрим другие примеры кода, на которые анализатор выдаст срабатывание:

    if (a == 2) nop(); else nop2(); // <=
    {
      nop3();
    }

    if (a == 3) nop();
    else nop2();                    // <=
    {
      nop3();
    }

Стоит отметить, что сам по себе такой паттерн может не являться ошибкой и встречается в коде. Поэтому анализатор отсеивает случаи, когда конструкция 'if' записана в одну строку, и в ее теле выполняется одна из следующих конструкций: 'return', 'throw', 'goto'. Например:

    if (a == 4) return;             // ok
    {
      nop();
    }

    if (a == 5) throw;              // ok
    {
      nop();
    }

    ....
    label:
    ....
    if (a == 6) goto label;         // ok
    {
      nop();
    }

Также анализатор не выдаст срабатывание, если строки с конструкцией 'if' и несвязанным с ней блоком кода несмежные:

    if (a == 7) nop();
    // this is a block for initializing MyClass fields
    {
      ....
    }

Если вы получили такое срабатывание, и оно ложное, вы можете подсказать об этом анализатору, добавив пустую строку между 'if' и блоком.

Также диагностика не выдаст срабатывание в том случае, когда тело 'if' содержит пустую конструкцию (';'), за это отвечает диагностическое правило V529.

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

CWE-483