V2589. MISRA. Casts between a pointer and a non-integer arithmetic type should not be performed.
Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Диагностическое правило актуально только для C.
Преобразование выражений нецелочисленных типов к указателю и наоборот может привести к неопределённому поведению.
Стандарт MISRA C определяет собственную модель типов — Essential type model.
Преобразование essential Boolean, essential character или essential enum типа к указателю может привести к формированию указателя с неверным выравниванием, что, в свою очередь, может привести к неопределённому поведению.
Пример:
enum Nums
{
ONE,
TWO,
....
};
double* bar(Nums num)
{
....
return (double*)num;
}
Преобразование указателя к вышеописанным сущностным типам может привести к тому, что результирующее значение не cможет быть представлено в выбранном сущностном типе, что также может привести к неопределённому поведению.
Пример:
void foo(void)
{
....
char *a = "something";
char b = a;
....
}
Преобразование essential floating типа к указателю или наоборот может привести к неопределённому поведению.
Пример:
void foo(short *p)
{
// ....
float f = (float) p;
// ....
}
Данная диагностика классифицируется как:
|