Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V2654. MISRA. Initializer list...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V2654. MISRA. Initializer list should not contain persistent side effects.

18 Сен 2025

Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

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

При объявлении объектов структур, объединений или массивов программист может предоставить начальные значения полей или элементов при помощи агрегатной инициализации ({ .... }).

При этом список инициализации не должен содержать устойчивых побочных эффектов.

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

Порядок вычисления выражений в списке инициализации не уточнён, поэтому наличие устойчивых побочных эффектов в нём может привести к непредсказуемому результату.

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

int x = 0;

int main()
{
  int array[2] = { ++x, x=2 }; // array is expected to be { 1, 2 }
                               // but could be { 1, 2 } or { 3, 2 }
  // x should equals 3
  // ....
}

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

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

int x = 0;

int main()
{
  int array[2] = { x + 1, x + 2 }; // always will be { 1, 2 }
  x = 3;
  // ....
}

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

  • MISRA-C-2023-13.1