0

代码语句如下所示:

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

}

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

QAC 帮助的详细信息:

仅当左侧操作数的计算结果为 1(“真”)时,才会计算逻辑 && 运算符的右侧操作数。逻辑 || 的右手操作数 仅当左侧操作数的计算结果为 0(“假”)时才计算运算符。

由于这种行为,如果这些运算符中的任何一个的右手操作数产生副作用,就会产生混淆。生成消息 3415 以识别这种情况。

当表达式出现副作用时:

  1. 访问 volatile 对象
  2. 执行递增、递减、赋值或复合赋值操作
  3. 执行 I/O 或
  4. 调用执行上述任何操作的函数

然而,QAC 假定每当调用函数时都会发生副作用,除非该函数已通过以下形式的 #pragma 语句明确标识为没有副作用:

#pragma PRQA_NO_SIDE_EFFECTS funcname
4

1 回答 1

0

在查看变量 temp1 和 temp2 时。我知道它被宣布为易失性。将变量更改为普通非易失性后,未观察到警告。这是 QAC 的 4 级警告。

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

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

于 2017-10-10T15:03:19.870 回答