PC-Lint Misra 10.1布尔表达式错误

时间:2018-02-15 23:29:54

标签: c lint misra pc-lint

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会抱怨转换整数呢?

2 个答案:

答案 0 :(得分:5)

( maskedVal != 0U )的结果是int但即使它是01 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_tunsigned int的隐式促销,但这不应违反任何MISRA规则。