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.

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

  • The 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-type переменная из целого числа. Когда вы вычитаете '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 данные также допустимы.

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

Группа: Модель Essential Type
Категория: Требуемая
Категория СМЖЛ: Консультационная