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 但即使它是 01 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_tunsigned int 的隐式提升,尽管这不应违反任何 MISRA 规则。