0

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"

-strong(B, boolean_t )我已在我的 .lnt 文件中将boolean_t 声明为强布尔类型。

那么,当我将一个明确的布尔表达式分配给一个明确的布尔变量时,为什么 PC-Lint 会抱怨转换整数呢?

4

2 回答 2

5

结果仍然( maskedVal != 0U )int,即使它是0或者1MISRA 抱怨它被强制转换为较小unsigned char的自制布尔类型。

不要发明自己的布尔类型。使用int现代 C 实现中可用的正式布尔类型。

于 2018-02-15T23:50:34.870 回答
2

MISRA-C:2004 没有将布尔类型视为特殊情况,它们只是另一种小整数类型,char等等。值得注意的是,它不支持bool任何一种,因为它不支持 C99。

如果这在 MISRA-C:2012 中得到修复,您的自制类型将是所谓的本质上的 boolean。MISRA-C:2012 中没有要求您必须使用bool,尽管这是推荐的,但指南允许使用“自制布尔值”,因为您可以以某种方式告诉您的静态分析器它是哪种类型。

但是由于您使用的是旧版本的 MISRA-C,booleanVal = ( maskedVal != 0U );因此是对窄类型从 的赋值int,以及从有符号类型到无符号类型的赋值。

这违反了 MISRA-C:2004 规则 10.1,但在 MISRA-C:2012 中完全没问题。

值得注意的是,您还有一个从uint8_tto的隐式提升unsigned int,尽管这不应该违反任何 MISRA 规则。

于 2018-02-16T07:38:22.677 回答