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