PC-Lint版本9.00L查看此代码:
typedef unsigned char boolean_t; //This is actually in a system header file.
...
/* The rest is in the .c file I'm working on. */
boolean_t booleanVal
...
uint8_t maskedVal;
maskedVal = 0; //real code has this assigned based on a bitwise-and
booleanVal = ( maskedVal != 0U );
并给出了这个错误:
booleanVal = ( maskedVal != 0U );
^
"LINT: <filename> Note 960: Violates MISRA 2004
Required Rule 10.1, Implicit conversion of integer to smaller type"
我在.lnt文件中使用-strong(B, boolean_t )
将boolean_t声明为强大的布尔类型。
那么,当我将一个明确的布尔表达式分配给一个明显的boolen变量时,为什么PC-Lint会抱怨转换整数呢?
答案 0 :(得分:5)
( maskedVal != 0U )
的结果是int
但即使它是0
或1
MISRA抱怨它被强制进入你自制的较小unsigned char
布尔类型。
不要发明自己的布尔类型。使用int
或现代C实现中可用的正式布尔类型。
答案 1 :(得分:2)
MISRA-C:2004没有将布尔类型视为特殊情况,它们只是另一个小整数类型,如char
等。值得注意的是,它不支持bool
,因为它没有' t支持C99。
如果在MISRA-C:2012中修复了这一切,那么你的家庭酿造类型将被称为基本上是布尔。在MISRA-C:2012中没有要求你必须使用bool
,虽然这是推荐的,但指南允许使用“自酿的布尔”,因为你可以告诉你的静态分析仪输入哪种类型是
但由于您使用的是旧版本的MISRA-C,booleanVal = ( maskedVal != 0U );
是从int
到较窄类型的分配,也是从签名类型到无符号类型的分配。
这违反了MISRA-C:2004规则10.1,但在MISRA-C:2012中完全没法。
值得注意的是,您还有从uint8_t
到unsigned int
的隐式促销,但这不应违反任何MISRA规则。