PC-Lint Misra 10.1 布尔表达式错误
PC-Lint Misra 10.1 Error on Boolean Expression
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 声明为强布尔类型。
那么,当我将一个明显的布尔表达式分配给一个明显的布尔变量时,为什么 PC-Lint 会抱怨转换整数?
( maskedVal != 0U )
的结果是 int
但即使它是 0
或 1
MISRA 抱怨它被强制进入较小的 unsigned char
你的自制布尔类型。
不要发明你自己的布尔类型。使用 int
或现代 C 实现中可用的正式布尔类型。
MISRA-C:2004 没有将布尔类型视为特例,它们只是另一种小整数类型,如 char
等。值得注意的是,它也不支持 bool
因为它不支持 C99。
如果此问题已在 MISRA-C:2012 中修复,那么您的 home-brewed 类型将是 so-called 本质上是布尔值 。 MISRA-C:2012 中没有要求您必须使用 bool
,尽管这是推荐的,但指南允许使用 "home-brewed booleans",因为您可以以某种方式告诉您的静态分析器是哪种类型是的。
但是由于您使用的是旧版本的 MISRA-C,booleanVal = ( maskedVal != 0U );
是从 int
到更窄类型的赋值,也是从有符号类型到无符号类型的赋值。
这违反了 MISRA-C:2004 规则 10.1,但在 MISRA-C:2012 中完全没问题。
值得注意的是,您还有从 uint8_t
到 unsigned int
的隐式提升,尽管这不应违反任何 MISRA 规则。
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 声明为强布尔类型。
那么,当我将一个明显的布尔表达式分配给一个明显的布尔变量时,为什么 PC-Lint 会抱怨转换整数?
( maskedVal != 0U )
的结果是 int
但即使它是 0
或 1
MISRA 抱怨它被强制进入较小的 unsigned char
你的自制布尔类型。
不要发明你自己的布尔类型。使用 int
或现代 C 实现中可用的正式布尔类型。
MISRA-C:2004 没有将布尔类型视为特例,它们只是另一种小整数类型,如 char
等。值得注意的是,它也不支持 bool
因为它不支持 C99。
如果此问题已在 MISRA-C:2012 中修复,那么您的 home-brewed 类型将是 so-called 本质上是布尔值 。 MISRA-C:2012 中没有要求您必须使用 bool
,尽管这是推荐的,但指南允许使用 "home-brewed booleans",因为您可以以某种方式告诉您的静态分析器是哪种类型是的。
但是由于您使用的是旧版本的 MISRA-C,booleanVal = ( maskedVal != 0U );
是从 int
到更窄类型的赋值,也是从有符号类型到无符号类型的赋值。
这违反了 MISRA-C:2004 规则 10.1,但在 MISRA-C:2012 中完全没问题。
值得注意的是,您还有从 uint8_t
到 unsigned int
的隐式提升,尽管这不应违反任何 MISRA 规则。