V2655. MISRA. The right operand of a logical '&&' or '||' operator should not contain persistent side effects.
Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Правило актуально только для языка C.
Правый операнд логических операций && и || не должен содержать устойчивых побочных эффектов.
Согласно стандарту MISRA C, устойчивым считается побочный эффект, который в конкретной точке выполнения программы может повлиять на её текущее состояние. Например, такими эффектами являются:
- модификация файла;
- модификация объекта (запись);
- использование барьеров памяти;
- модификация окружения с плавающей точкой;
- доступ к
volatile-объекту.
Вычисление правого операнда зависит от результата вычисления левого операнда:
- для оператора
||правый операнд будет вычислен, только если левый операнд возвращаетfalse; - для оператора
&&правый операнд будет вычислен, только если левый операнд возвращаетtrue.
Таким образом, если правый операнд содержит побочные эффекты, эти эффекты могут быть не применены.
Рассмотрим пример:
volatile int counter;
void foo(int *ptr)
{
// ....
if (ptr != NULL && counter == 1)
{
return true;
}
// ....
}
Квалификатор volatile указывает компилятору на то, что оптимизировать доступ к этой переменной нельзя, т.к. она может меняться извне, например, из другого потока. Доступ к таким объектам может влиять на состояние выполнения программы, поэтому является устойчивым побочным эффектом.
Исправленный пример:
volatile int counter;
void foo(int *ptr)
{
// ....
if (ptr != NULL)
{
int tmp = counter;
if (tmp == 1)
{
return true;
}
}
// ....
}
Данная диагностика классифицируется как:
|