Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для C. Приведение указателя одного типа к указателю на другой может привести к неопределённому поведению, если выравнивание этих типов не совпадает.
Пример кода, на который анализатор выдаст предупреждения:
void foo( void ) { int *pi; double *pd = ....; typedef int *PI; pi = pd; // <= pi = (int*) pd; // <= pi = PI(pd); // <= }
Диагностика также проверяет квалификаторы типов, на которые ссылаются указатели при приведени типов:
void foo( void ) { double **ppd = ....; const double **ppcd = (const double **) ppd; double * const *pcpd = ....; const volatile double * const *pcvpd = (const volatile double * const *) pcpd; }
Исключениями являются приведение указателя к указателю на типы 'char', 'signed char', 'unsigned char', 'void', поскольку стандарт явно определяет такое поведение.
Данная диагностика классифицируется как:
|