MISRA C:2012 Rule 10.2

Выражения чрезвычайно типа символов не должны использоваться неуместно, кроме того, и операции вычитания

Описание

Управляйте определением

Выражения чрезвычайно типа символов не должны использоваться неуместно, кроме того, и операции вычитания.

Объяснение

Выражениями чрезвычайно типа символов является char переменные. Не используйте char в арифметических операциях, потому что данные не представляют числовые значения.

Уместно использовать char с операциями сложения и операциями вычитания только в следующих случаях:

  • Когда одним операндом сложения (+) операция является char и другой char без знака или со знаком, short, int, long или long long. В этом случае операция возвращает char.

  • Когда первым операндом вычитания (-) операция является char и вторым является char без знака или со знаком, short, int, long или long long. Если обоими операндами является char, операция возвращает стандартный тип. В противном случае операция возвращает char.

Вышеупомянутое использование позволяет манипуляцию символьных данных, таких как преобразование между символами нижнего регистра и символами верхнего регистра или преобразование между цифрами и их порядковыми номерами.

Для получения дополнительной информации о существенных типах смотрите MISRA C:2012 Rule 10.1.

Дополнительное сообщение в отчете

  • operand_name операнд + оператор применился к выражению чрезвычайно типа символов, по существу подпишусь или тип без знака.

  • Правильный операнд - оператор применился к выражению чрезвычайно типа символов, по существу подпишусь или или тип символов без знака.

  • Левый операнд - оператор должен иметь чрезвычайно тип символов, если правильный операнд будет иметь чрезвычайно тип символов.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#include<stdint.h>
typedef double float64_t;
extern uint8_t u8a;
extern int8_t s8a;
extern int16_t s16a;
extern int32_t s32a;
extern float64_t fla;

void foo ( void )
{
	char cha;

	s16a = s16a - 'a';  /* Noncompliant*/
	
	cha = '0' + fla;    /* Noncompliant*/
	
	cha = cha  + ':';   /* Noncompliant*/
}

  • Вы не можете вычесть char- переменная типа от целого числа. Когда вы вычитаете 'a' от целочисленного s16a, Polyspace® повышает нарушение.

  • Кроме того, операции, char переменные типа могут только быть добавлены к переменным целочисленного типа. Когда вы добавляете число с плавающей точкой fla к '0', Polyspace повышает нарушение.

  • Арифметическая операция cha+':' не преобразование от верхнего до нижнего регистра или от цифры до кардинального значения. Polyspace повышает нарушение когда char переменные используются в арифметических выражениях.

#include<stdint.h>
typedef double float64_t;
extern uint8_t u8a;
extern int8_t s8a;
extern int16_t s16a;
extern int32_t s32a;
void foo ( void )
{
	char cha;

	cha = '0' + u8a;     /* Compliant*/
	
	cha = s8a + '0';     /* Compliant*/
	
	s32a = cha  - '0';   /* Compliant*/
	
	cha = '0' - s8a;     /* Compliant*/
	
	cha++;               /* Compliant*/
}

char переменные типа могут использоваться в определенном сложении или операциях вычитания, чтобы выполнить char манипулирования данными. Например:

  • Можно добавить беззнаковое целое u8a к char введите данные '0' преобразовывать от '0' к различному символу.

  • Точно так же можно добавить целое число со знаком s8a к '0' выполнять преобразование требуемого символа.

  • Можно также вычесть s8a от char данные '0'.

  • Постепенное увеличение и постепенное уменьшение char данные также допустимы.

Проверяйте информацию

Группа: существенная модель типа
Категория: необходимый
Категория AGC: консультация