V2654. MISRA. Initializer list should not contain persistent side effects.
Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Правило актуально только для языка C.
При объявлении объектов структур, объединений или массивов программист может предоставить начальные значения полей или элементов при помощи агрегатной инициализации ({ .... }).
При этом список инициализации не должен содержать устойчивых побочных эффектов.
Согласно стандарту MISRA C, устойчивым считается побочный эффект, который в конкретной точке выполнения программы может повлиять на её текущее состояние. Например, такими эффектами являются:
- модификация файла;
- модификация объекта (запись);
- использование барьеров памяти;
- модификация окружения с плавающей точкой;
- доступ к
volatile-объекту.
Порядок вычисления выражений в списке инициализации не уточнён, поэтому наличие устойчивых побочных эффектов в нём может привести к непредсказуемому результату.
Рассмотрим пример:
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;
// ....
}
Данная диагностика классифицируется как:
|