# V2585. MISRA. Casts between a void pointer and an arithmetic type should not be performed.

Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Это правило актуально только для C. Преобразование переменной или литерала арифметического типа к типу 'void *' и наоборот может послужить причиной неопределённого (для чисел с плавающей точкой) или зависимого от платформы поведения (для целочисленных типов).

Рассмотрим первый синтетический пример:

    void* foo(void)
    {
      double pi = 3.14;
      return pi;
    }

В данном случае переменная 'pi', имеющая тип 'double', неявно приводится к типу 'void *'. Такой код приведёт к неопределённому поведению.

Рассмотрим второй синтетический пример:

    void bar(void)
    {
      int a = 5;
      void* b = (void*)a;
    }

Здесь переменная типа 'int' явно приводится к типу 'void *'. Дальнейшее разыменование такого указателя может потенциально привести к ошибкам сегментации.

Данная диагностика классифицируется как:

MISRA-C-2012-11.6 MISRA-C-2023-11.6