exponenta event banner

MISRA C:2012 Правило 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'Полиспейс поднимает вопрос о нарушении.

  • Арифметическая операция 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 данные также допустимы.

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

Группа: Модель основного типа
Категория: Обязательно
СМЖЛ Категория: Консультативные услуги