V2666. MISRA. All declarations of an object with an explicit alignment specification should specify the same alignment.
Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Правило актуально только для С.
Если любое определение объекта содержит явный спецификатор выравнивания (alignas), то все другие объявления того же объекта должны быть определены с таким же выравниванием.
В случае, если выравнивания нет, ни одно из объявлений этого объекта не должно его указывать.
Если в разных файлах исходного кода объявления одного и того же объекта имеют разные спецификаторы выравнивания, то поведение программы не определено (С11 пункт 6.7.5.6).
Рассмотрим пример:
//header.h
extern alignas(16) int32_t var;
//file.c
alignas(8) int32_t var;
В заголовочном файле header.h объявляется переменная var с выравниванием 16 байт. Далее в исходном файле есть определение этой переменной, но с другим выравниванием. Поведение такой программы не определено.
Исправленный пример:
//header.h
extern alignas(16) int32_t var;
//file.c
alignas(16) int32_t var;
Данная диагностика классифицируется как:
|