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 .
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
/true
和FALSE
/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。
示例
检查信息
组:基本类型模型 |
类别:必需 |
AGC 类别:建议 |
版本历史记录
另请参阅
MISRA C:2012 Rule 10.4
| MISRA C:2012 Rule 10.5
| MISRA C:2012 Rule 10.6
| 检查 MISRA C:2012 (-misra3)
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.