MISRA C:2012 Rule 10.8
The value of a composite expression shall not be cast to a different essential type category or a wider essential type
描述
规则定义
The value of a composite expression shall not be cast to a different essential type category or a wider essential type 1 .
理由
一个复合表达式 是使用复合运算符的非常量表达式。在基本类型模型中,复合运算符包括:
乘法运算符(
*
、/
、%
)加法运算符(二进制
+
、二进制-
)位运算符(
&
、|
、^
)移位运算符(
<<
、>>
)条件运算符(
?
、:
)
一元运算符如 ~
以及一元运算符 +
或 -
也被视为复合运算符。
不允许将类型转换为更广泛的类型,因为不同实现中的结果可能不一致。请考虑以下表达式:
(uint32_t) (u16a +u16b);
有关基本类型的详细信息,请参阅Essential Types in MISRA C Rules 10.x。
Polyspace 实现
规则检查器严格遵循该规则的 MISRA C™:2012 规范,只有当复合表达式的结果被直接转换为不同的或更宽的基本类型时,才会报告缺陷。一元运算符不被视为复合运算符。
例如,在此示例中,第一个赋值给 i
时出现违规,但第二个赋值时未出现违规。在第一个作业中,复合表达式 i+1
从有符号类型直接转换为无符号类型。在第二个作业中,复合表达式首先被转换为同一类型,然后将结果转换为另一种类型。由于复合表达式未直接转换为不同的类型,因此检查项不会报告违规。
typedef int int32_T; typedef unsigned char uint8_T; ... ... int32_T i; i = (uint8_T)(i+1); /* Noncompliant */ i = (uint8_T)((int32_T)(i+1)); /* Compliant */
Polyspace® 在以下情况下不会报告违反此规则的情况:
一个本质上为实数的浮点表达式被转换为一个本质上为复数的浮点类型,但该复数类型的对应实数类型不宽于实数表达式的类型。
一个本质上为实数的复数表达式被转换为一个本质上为实数的浮点类型,但该浮点类型不比复数表达式的对应实数类型更宽。
故障排除
如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示。
示例
检查信息
组:基本类型模型 |
类别:必需 |
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.