﻿# V2543\. MISRA\. Value of the essential character type should be used appropriately in the addition/subtraction operations\.

Диагностическое правило основано на руководстве [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/)\.

Согласно этой модели, значения `essential character` типа не должны использоваться в арифметических выражениях, так как представлены нечисловым типом\.

Рассмотрим допустимые способы использования переменных символьного типа в арифметических выражениях:

1. При сложении один операнд должен иметь символьный тип, другой должен иметь знаковый или беззнаковый целый тип\. Результат такой операции имеет символьный тип:
    * `character` \+ `[un]signed` \=\> `character`
    * `[un]signed` \+ `character` \=\> `character`
1. При вычитании левый операнд должен иметь символьный тип, а правый операнд должен иметь знаковый или беззнаковый целый тип\. Результатом такой операции будет значение символьного типа:
    * `character` \- `[un]signed` \=\> `character`
1. При вычитании оба операнда должны иметь символьный тип\. Результатом такой операции будет значение знакового целого типа:
    * `character` \- `character` \=\> `signed`

Пример кода, на который анализатором будут выданы предупреждения:

```cpp
void foo(char ch, unsigned ui, float f, _Bool b, enum A eA)
{
  ch + f; // Essential character type should not be used in
          // the addition operation with expression
          // of the essential floating type

ch + b; // Also relates to the essential Boolean

ch + eA; // Also relates to the essential enum <A> type

(ch + ui) + (ch - 6); // After the expressions in parentheses
                      // have been executed, both operands of the
                      // essential character type are used
                      // in addition operation
}
```