﻿# V2655\. MISRA\. The right operand of a logical '&&' or '\|\|' operator should not contain persistent side effects\.

Диагностическое правило основано на руководстве [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Правило актуально только для языка C\.

Правый операнд логических операций `&&` и `||` не должен содержать устойчивых [побочных эффектов](https://en.cppreference.com/w/c/language/eval_order.html)\.

Согласно стандарту MISRA C, устойчивым считается побочный эффект, который в конкретной точке выполнения программы может повлиять на её текущее состояние\. Например, такими эффектами являются:

* модификация файла;
* модификация объекта \(запись\);
* использование [барьеров памяти](https://en.cppreference.com/w/c/header/stdatomic.html);
* модификация [окружения с плавающей точкой](https://en.cppreference.com/w/cpp/numeric/fenv.html);
* доступ к `volatile`\-объекту\.

Вычисление правого операнда зависит от результата вычисления левого операнда:

* для оператора `||` правый операнд будет вычислен, только если левый операнд возвращает `false`;
* для оператора `&&` правый операнд будет вычислен, только если левый операнд возвращает `true`\.

Таким образом, если правый операнд содержит побочные эффекты, эти эффекты могут быть не применены\.

Рассмотрим пример:

```cpp
volatile int counter;

void foo(int *ptr)
{
  // ....
  if (ptr != NULL && counter == 1)
  {
    return true;
  }
  // ....
}
```

Квалификатор `volatile` указывает компилятору на то, что оптимизировать доступ к этой переменной нельзя, т\.к\. она может меняться извне, например, из другого потока\. Доступ к таким объектам может влиять на состояние выполнения программы, поэтому является устойчивым побочным эффектом\.

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

```cpp
volatile int counter;

void foo(int *ptr)
{
  // ....
  if (ptr != NULL)
  {
    int tmp = counter;
    if (tmp == 1)
    {
      return true;
    }
  }
  // ....
}
```