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"我在我的boolean_t文件中使用-strong(B, boolean_t )将.lnt声明为一个强布尔类型。
那么,当我将一个明确的布尔表达式分配给一个明显的boolen变量时,为什么PC会抱怨转换整数呢?
发布于 2018-02-15 23:50:34
( maskedVal != 0U )的结果是int,尽管它是0或1,米斯拉抱怨说,它是被迫进入较小的unsigned char,你的自制布尔类型。
不要发明你自己的布尔型。要么使用int,要么使用现代C实现中可用的形式布尔类型。
发布于 2018-02-16 07:38:22
MISRA:2004没有将布尔类型作为特例,它们只是另一个小整数类型,如char等。特别是,它也不支持bool,因为它不支持C99。
如果这是在MISRA:2012中修复的话,那么你的家庭酿造型基本上就是布尔型。在MISRA:2012中没有要求您必须使用bool,尽管这是推荐的,但是指南允许使用“家酿的布尔人”,因为您可以以某种方式告诉静态分析器它是哪种类型。
但是,由于您使用的是MISRA的旧版本,所以booleanVal = ( maskedVal != 0U );是从int向窄类型分配的任务,也是从有符号类型到无符号类型的赋值。
这违反了MISRA:2004规则10.1,但在MISRA:2012中完全没有问题。
值得注意的是,您也有从uint8_t到unsigned int的隐式升级,尽管这不应该违反任何MISRA规则。
https://stackoverflow.com/questions/48817929
复制相似问题