﻿# V2613\. MISRA\. Operand that is a composite expression has more narrow essential type than the other operand\.

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

Диагностическое правило актуально только для C\.

Стандарт MISRA C определяет собственную модель типов — [Essential type model](https://pvs-studio.ru/ru/blog/terms/7007/)\.

Анализатор обнаружил ситуацию, при которой составное выражение, участвующее в арифметической операции, имеет более узкий сущностный тип, чем другой операнд\. Вычисление такого составного выражения может привести к переполнению\.

Рассмотрим следующий синтетический пример:

```cpp
uint16_t w1;
uint16_t w2;
uint32_t dw1;
// ....
return w1 * w2 + dw1;
```

Несмотря на то, что на типичных платформах \(x86/ARM\) тип `uint16_t` соответствует типу `unsigned short` и при вычислении выражения он расширится до типа `int`, на других платформах \(например, 16\-битных микроконтроллерах\) `uint16_t` может соответствовать типу `unsigned int`, поэтому расширения до 32 бит не произойдёт, из\-за чего в результате умножения возможно переполнение\.

Чтобы исправить ситуацию, нужно привести один из операндов составного выражения к результирующему типу\.

Например:

```cpp
return (uint32_t)w1 * w2 + dw1;
```

В таком случае вычисление всего выражения будет происходить в более широком типе `uint32_t`\.