主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

MISRA C:2012 Rule 10.3

The value of an expression shall not be assigned to an object with a narrower essential type or of a different essential type category

描述

规则定义

The value of an expression shall not be assigned to an object with a narrower essential type or of a different essential type category 1 .

理由

在类型之间使用隐式转换可能会导致意外结果,包括可能会丢失值、符号或精度。

有关基本类型的详细信息,请参阅Essential Types in MISRA C Rules 10.x

Polyspace 实现

如果将表达式的值赋给具有以下数据类型之一的变量,则规则检查项会报告违规:

  • 基本类型范围更窄的变量,例如将 unsigned int(32 位)的值赋给 unsigned short(16 位)类型的变量。

  • 具有不同基本类型类别的变量,例如将 _Bool(本质上为布尔)的值赋给 unsigned int(本质上为无符号)类型的变量。

    有关基本类型类别的详细信息,请参阅 MISRA C:2012 Rule 10.1

根据 MISRA C™:2012 规范,在下列情况下,该检查项不会报告违反此规则:

  • 当对象被赋值与其基本类型相对应的常量零。对于整数类型,可接受的零值为 0,对于 double,可接受的零值为 0.0,对于 char,可接受的零值为 '\0'

  • 数组等聚合类型的变量使用简化形式 {0} 进行初始化时,例如:

    float dat2[3*3] = {0};

  • 当宏 TRUE/trueFALSE/false 中已将相应的布尔值赋给 bool 变量。但如果这些宏混用大小写,则 Polyspace® 会报告违规。

  • 当有符号常量被赋值给无符号变量,但有符号常量具有与等效的无符号变量相同的表示形式。例如,检查项不会标记以下语句:

    unsigned int u = 1;

  • 如果将本质上为实数的浮点类型表达式赋值给本质上为复数的浮点类型对象,且该复数对象对应的实数类型的大小可以容纳实数表达式。例如:

    float32_t f32a;
    _Complex float32_t cf32a;
    cf32a = f32a;
    复数对象 cf32a 对应的实数类型为 float32_t,可以容纳 f32a。此赋值作为例外符合此规则。

代码生成工具可能将布尔值 true/false 与整数字面值 1/0 互换使用,从而导致违反此规则。由于在 AGC 模式下使用此规则是建议性的,因此您可能要对此类缺陷进行申述。请参阅为代码添加注解并隐藏已知或可接受的结果

故障排除

如果您预计存在违规,但未看到该违规,请参阅Diagnose Why Coding Standard Violations Do Not Appear as Expected

示例

全部展开

#include<stdint.h>
#include <stdbool.h>
#define FALSE 0 /*Noncompliant*/
#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 符合此规则。

  • 使用有符号整数常量 0 初始化 bool 变量违反了此规则。

检查信息

组:基本类型模型
类别:必需
AGC 类别:建议

版本历史记录

全部展开


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.