Диагностическое правило основано на руководстве 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;
}
}
// ....
}
Данная диагностика классифицируется как:
|