代码语句如下所示:

if((temp1 == ID1) || (temp2 == (C_UINT16) ID2))
{

}


我不确定QAC为什么会生成此警告。会有什么副作用以及如何避免此警告。

QAC帮助的详细信息:


  仅在以下情况下评估逻辑&&运算符的右侧操作数
  左侧操作数的值为1(“真”)。右手操作数
  逻辑||仅当左侧操作数为时才对运算符进行求值
  计算结果为0(“假”)。
  
  由于这种行为,如果右手会产生混乱
  这些运算符之一的操作数都会产生副作用。信息
  生成3415以识别这种情况。
  
  当一个表达式出现副作用:



访问一个易失的对象
执行增量,减量,赋值或复合赋值
操作
执行I / O或
调用执行上述任何一项功能



  但是,QAC假定每当有功能
  调用,除非已明确确定该功能为
  通过以下形式的#pragma语句消除副作用:


#pragma PRQA_NO_SIDE_EFFECTS funcname

最佳答案

同时查看变量temp1和temp2。我知道它被声明为volatile。将变量更改为正常的非易失性后,未观察到警告。这是QAC中的第4级警告。

参考:
https://cboard.cprogramming.com/c-programming/68666-strange-side-effects.html

解决错误的另一种方法是在再次执行操作之前再次读取volatile变量。

关于c - “&&”或“||”的右手操作数是可能有副作用的表达,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46664411/

10-10 21:28
查看更多