V2543. MISRA. Value of the essential character type should be used appropriately in the addition/subtraction operations.
Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Диагностическое правило актуально только для C.
Стандарт MISRA C определяет собственную модель типов — Essential type model.
Согласно этой модели, значения essential character типа не должны использоваться в арифметических выражениях, так как представлены нечисловым типом.
Рассмотрим допустимые способы использования переменных символьного типа в арифметических выражениях:
- При сложении один операнд должен иметь символьный тип, другой должен иметь знаковый или беззнаковый целый тип. Результат такой операции имеет символьный тип:
character+[un]signed=>character[un]signed+character=>character
- При вычитании левый операнд должен иметь символьный тип, а правый операнд должен иметь знаковый или беззнаковый целый тип. Результатом такой операции будет значение символьного типа:
character-[un]signed=>character
- При вычитании оба операнда должны иметь символьный тип. Результатом такой операции будет значение знакового целого типа:
character-character=>signed
Пример кода, на который анализатором будут выданы предупреждения:
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
}
Данная диагностика классифицируется как:
|