V2543. MISRA. Value of the essential character type should be used appropriately in the addition/subtraction operations.
Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Данное диагностическое правило актуально только для C. Значения essential character типа не должны использоваться в арифметических выражениях.
Стандарт MISRA определяет следующую модель сущностных типов (Essential type model), в которой переменная может иметь тип:
- boolean, если оперирует булевыми значениями true/false: '_Bool';
- signed, если оперирует знаковыми целыми числами, или является безымянным enum: 'signed char', 'signed short', 'signed int', 'signed long', 'signed long long', 'enum { .... };';
- unsigned, если оперирует без знаковыми целыми числами: 'unsigned char', 'unsigned short', 'unsigned int', 'unsigned long', 'unsigned long long';
- floating, если оперирует числами с плавающей точкой: 'float', 'double', 'long double';
- character, если оперирует только символами: 'char';
- именованный enum, если оперирует с именованным множеством определенных пользователем значений: 'enum name { .... };'.
Указатели в этой модели отсутствуют.
Согласно модели сущностных типов, значения essential character типа не должны использоваться в арифметических выражениях, так как представлены нечисловым типом.
Рассмотрим список правильных способов использовать переменные символьного типа в арифметических выражениях:
- При сложении один операнд должен иметь символьный тип, другой должен иметь знаковый или беззнаковый целый тип. Результат такой операции имеет символьный тип:
- character + [un]signed => character; (1)
- [un]signed + character => character; (2)
- При вычитании левый операнд должен иметь символьный тип, а правый операнд должен иметь знаковый или беззнаковый целый тип. Результатом такой операции будет значение символьного типа:
- character - [un]signed => character; (3)
- При вычитании оба операнда должны иметь символьный тип. Результатом такой операции будет значение знакового целого типа:
- character - character => signed; (4)
Пример кода, на который анализатором будут выданы предупреждения:
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
}
Данная диагностика классифицируется как:
|