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