MISRA 检查器错误 将指针传递给函数后进行推断

MISRA checker wrong Inferring after passing pointer to function

提问人:Ivan 提问时间:7/20/2021 最后编辑:Ivan 更新时间:7/20/2021 访问量:110

问:

在我的项目中的某个地方,我有这样的代码:

  {
    uint8_t u8Integer = 0xFFU;
    returnCode = someFucntion(&u8Integer); 
    uint8_t u8Decimal = 0xFFU;
    returnCode = someOtherFucntion(&u8Decimal);

    uint16_t u16Temp = ((static_cast<uint16_t>(u8Integer) << 8U) | static_cast<uint16_t>(u8Decimal));
      if(u16Temp <= 0xC000) // Problem here
      {
        // Uneracahble Code ?
      }
      else // {...}
  }

和签名都如下所示:someFucntionsomeOtherFucntion

 int8_t someFucntion(uint8_t * pu8Data) const;
 int8_t someOtherFucntion(uint8_t * pu8Data) const;

自动 MISRA 静态检查会抛出一个错误,指出该语句永远不会为真。 我猜是因为在将他们的指针传递给 and 时修改了 and,检查器假设它们静止不动,因此永远不会改变,使它成为 alwas.ifu8Decimalu8IntegersomeFucntionsomeOtherFucntion0xFFu16Temp> 0xC000

当我运行这个程序时,值会正确更改(有时输入语句,有时不输入)。u16Tempif

检查器显示“u16Temp 的推断值为 65535”

这只是检查器不能完美工作的情况吗?还是我真的有代码问题?

我尝试将变量设置为,但这不起作用。volatile

C++ C++11 按引用传递 MISRA 无法访问的代码

评论

4赞 Mark Benningfield 7/20/2021
请注意,相当多的MISRA工具都严重无聊。
0赞 Ivan 7/20/2021
谢谢@MarkBenningfield我注意到:D这是一个相当昂贵的,但我想知道,在这种情况下,它是否真的在我的代码中检测到了错误。
0赞 Mgetz 7/20/2021
吹毛求疵和迂腐:如果你使用,那么你不是通过引用传递,你是在传递一个指向位置的指针,如果有签名,那么你就是在通过引用传递。有一个主要的区别,因为理论上你可以传递到你现在所拥有的。&u8Integeru8IntegersomeFunctionsomeFunction(uint8_t& foo)nullptr
0赞 Ivan 7/20/2021
@Mgetz你是对的,我正在编辑,我们不能在 SO (?) xD 中出现那种可怕的错误
1赞 Thomas Matthews 7/20/2021
一个问题是,这是一个无符号整数,它可能比 .为了避免这个问题,请声明一个常量临时变量来保存 : 。MISRA 希望表达式中的所有类型都相同(因此不需要强制转换)。8Uuint16_t8Uconst uint16_t shift_quantity = 8U;

答: 暂无答案