Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для языка C.
Использование указателя на атомарный неполный тип (_Atomic void *
) может привести к неожиданным результатам, и потому должно избегаться.
В языке C тип void *
можно преобразовать к любому типу T *
(C11, п. 6.3.2.3.1), однако стандарт не налагает никаких требований к размеру и выравниванию на указатель _Atomic void *
(C11, п. 6.2.5.28). Вследствие этого, преобразование между указателем на атомарный неполный тип (_Atomic void *
) и указателем на произвольный атомарный тип (_Atomic T *
) может привести к неопределённому поведению.
Пример кода, на котором анализатор сгенерирует предупреждения:
int _Atomic a;
void main (void)
{
a = 5;
void _Atomic * avp1 = &a;
_Atomic(void)* avp2 = &a;
}
Данная диагностика классифицируется как:
|