MISRA C:2012 Rule 10.3

Значение выражения не должно быть присвоено объекту с более узким существенным типом или различной существенной категории типа

Описание

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

Значение выражения не должно быть присвоено объекту с более узким существенным типом или различной существенной категории типа.

Объяснение

Использование неявных преобразований между типами может привести к непреднамеренным результатам, включая возможную потерю значения, знака или точности.

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

Реализация Polyspace

Средство проверки повышает нарушение, если выражение присвоено переменной с более узким существенным типом или различной существенной категорией типа.

Средство проверки не повышает нарушение этого правила:

  • Если объект присвоен постоянный нуль, соответствующий его существенному типу. Этим приемлемым нулевым значением является 0 для целочисленных типов, 0.0 для double, и '\0' для char.

  • Если макросы TRUETRUE и FALSEложь с соответствующим булевым значением присвоен bool переменная.

  • Если константа со знаком присвоена переменной без знака, но константа со знаком имеет то же представление как свой эквивалент без знака. Например, средство проверки не отмечает операторы, такие как:

    unsigned int u = 1;

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

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

#include<stdint.h>
#include <stdbool.h>
#define FALSE 0
#define TRUE 1
void init_integer(){
	int8_t a1= 0;
	int16_t a2= 0;
	int32_t a3= 0;
	uint8_t a4= 0;
	uint16_t a5= 0;
	uint32_t a6= 0;
}
void initiate(){
	float b = 0.0/*Noncompliant*/;
	double c = 0.0;
	bool flag1 = FALSE;
	bool flag2 = FALSE;
	char ch = 0 /*Noncompliant*/;
	char ch2 = '\0';
	unsigned char uch = 0;
}

В этом примере показано, как инициировать переменные с нулевой константой.

  • Для целочисленных типов различных размеров, инициируя переменные с 0 совместимо с этим правилом.

  • Инициирование double с 0.0 и char с '\0' также совместимы с этим правилом.

  • Поскольку существенный тип char не является неотъемлемой частью, инициируя char объект ch с 0 несовместимо с этим правилом.

  • Существенный тип unsigned char является неотъемлемой частью. Инициирование unsigned char uch с 0 совместимо с этим правилом.

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

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