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

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

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

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

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

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

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



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

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

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

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

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

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



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

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

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

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

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

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

![V640_ru/image1.png](https://import.viva64.com/docx/blog/V640_ru/image1.png)

Вы нашли спрятанный ссееккрреетт и, возможно, успеете забрать один из ппррииззоовв\. [Подробнее](https://pvs-studio.ru/ru/rules/)\.