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

Данное диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

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

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

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

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

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

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

Здесь переменная типа 'int' явно приводится к типу 'void \*'\. Дальнейшее разыменование такого указателя может потенциально привести к [ошибкам сегментации](https://pvs-studio.ru/ru/blog/terms/0063/)\.