MISRA C:2012 Rule 10.1
Operands shall not be of an inappropriate essential type
描述
规则定义
Operands shall not be of an inappropriate essential type 1 .
理由
基本类型分类定义了对象或表达式的基本类型。
| 基本类型分类 | 标准类型 |
|---|---|
本质上为布尔类型 |
您还可以使用 |
本质上为字符类型 | char |
本质上为枚举类型 | named enum |
本质上为有符号类型 | signed char, signed short, signed int, signed long, signed long long |
本质上为无符号类型 | unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long |
本质上为浮点类型 | 实数浮点: 复数浮点: |
对于某些运算符的操作数,您无法使用特定的基本类型。在下表中,每一行代表一个运算符/操作数的组合。如果该行中的“基本类型”列不为空,则表示在将该类型用作操作数时将受 MISRA 规则的限制。表中的数字对应表后面的理由列表。
| 操作 | 算术操作数的基本类型分类 | |||||||
|---|---|---|---|---|---|---|---|---|
| 运算符 | 操作数 | 布尔 | 字符 | 枚举 | signed | 无符号 | 浮点 | |
| 实数 | 复数 | |||||||
[ ] | 整数 | 3 | 4 | 1 | 9 | |||
+(一元) | 3 | 4 | 5 | |||||
-(一元) | 3 | 4 | 5 | 8 | ||||
+ - | 任一 | 3 | 5 | |||||
++ -- | 3 | 5 | 9 | |||||
* / | 任一 | 3 | 4 | 5 | ||||
% | 任一 | 3 | 4 | 5 | 1 | 9 | ||
< > <= >= | 任一 | 3 | 9 | |||||
== != | 任一 | 10 | 10 | |||||
! && || | 任意 | 2 | 2 | 2 | 2 | 2 | 2 | |
<< >> | 左 | 3 | 4 | 5、6 | 6 | 1 | 9 | |
<< >> | 右 | 3 | 4 | 7 | 7 | 1 | 9 | |
~ & | ^ | 任意 | 3 | 4 | 5、6 | 6 | 1 | 9 | |
?: | 第一个 | 2 | 2 | 2 | 2 | 2 | 2 | |
?: | 第二个和第三个 | |||||||
这些操作数的表达式本质上为浮点类型,这违反了约束。
当一个操作数被解释为布尔值时,请使用本质上为布尔类型的表达式。
当一个操作数被解释为数字值时,不要使用本质上为布尔类型的操作数。
当一个操作数被解释为数字值时,不要使用本质上为字符类型的操作数。字符数据的数值由实现定义。
在算术运算中,不要使用本质上为枚举类型的操作数。枚举对象使用实现定义的整数类型。因此,涉及枚举对象的运算可能会产生类型出乎意料的结果。
仅对本质上为无符号类型的操作数执行移位和位运算。当对本质上为有符号的类型使用移位和位运算时,结果的数值是未定义的或由实现定义的。
为了避免负位移操作导致的未定义行为,请使用本质上为无符号的右操作数。
对于一元减运算符,不要使用本质上为无符号类型的操作数。int 类型的实际实现大小决定了结果的符号性。
这些操作数的本质上为复数浮点类型的表达式违反了约束。
比较浮点类型可能会导致意外且与实现相关的结果。比较浮点类型时,请考虑浮点精度 (
FLT_EPSILON) 和数字的大小。
请注意,对于位字段类型,如果位字段实现为:
布尔值,位字段基本上为布尔值。
有符号或无符号类型,位字段本质上分别为有符号或无符号的。
位字段的类型是能够表示位字段的最小类型。例如,这里的类型
stmp本质上是一个 8 位整数:typedef signed int mybitfield; typedef struct { mybitfield f1 : 1; } stmp;
有关基本类型的详细信息,请参阅Essential Types in MISRA C Rules 10.x。
Polyspace 实现
当运算的操作数为不适当的基本类型时,Polyspace® 会报告违反此规则。作为例外,Polyspace 不会报告以下使用情况下的违规行为:
使用一个本质上为有符号类型的非负整数常量表达式作为移位运算符的右操作数。
将本质上为实数的浮点或基本为复数浮点的对象与常量零或宏
INFINITY或-INFINITY进行比较。
故障排除
如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示。
示例
检查信息
| 组:基本类型模型 |
| 类别:必需 |
| 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.