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