# V640. Code's operational logic does not correspond with its formatting.

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

Рассмотрим пример некорректного кода:

    if (a == 1)
      b = c; d = b;

В данном случае присваивание 'd = b;' будет выполняться всегда, независимо от условия 'a == 1'.

Если код ошибочен, то ситуацию можно исправить, используя фигурные скобки. Корректный вариант кода:

    if (a == 1)
    { b = c; d = b; }

Другой пример некорректного кода:

    if (a == 1)
      b = c;
      d = b;

Для исправления ошибки так же следует использовать фигурные скобки. Корректный вариант кода:

    if (a == 1)
    {
      b = c;
      d = b;
    }

Если код корректен, то чтобы исчезло предупреждение V640, следует отформатировать код следующим образом:

    if (a == 1)
      b = c;
    d = b;

Нередко данный класс ошибок можно встретить в программах, активно использующих макросы. Рассмотрим ошибку, найденную в реальном приложении:

    #define DisposeSocket(a) shutdown(a, 2); closesocket(a)
    ...
    if (sockfd > 0)
      (void) DisposeSocket(sockfd);

Вызов функции 'closesocket(a);' будет выполняться всегда. Это приведет к сбою, если переменная 'sockfd' окажется <= 0.

Можно исправить ошибку, используя в макросе фигурные скобки. Но лучше написать полноценную функцию. Код без макросов безопаснее и удобней при отладке.

Корректный пример кода может выглядеть следующим образом:

    inline void DisposeSocket(int a) {
      shutdown(a, 2);
      closesocket(a);
    }
    ...
    if (sockfd > 0)
      DisposeSocket(sockfd);

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

CWE-483 CERT-EXP19-C

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