‘&&’或‘||’的右手操作数是一个可能有副作用的表达式

问题描述 投票:0回答:1

代码语句如下:

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

}

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

QAC 帮助详细信息:

逻辑 && 运算符的右侧操作数仅在满足以下条件时才计算: 左侧操作数的计算结果为 1(“真”)。右手操作数 逻辑 ||仅当左侧操作数为 计算结果为 0(“假”)。

由于这种行为,如果右手 这些运算符的操作数都会产生副作用。信息 生成 3415 是为了识别这种情况。

当表达式出现以下情况时会产生副作用:

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

然而,QAC 假设每当函数被调用时就会出现副作用 被调用,除非该函数已被明确标识为 通过以下形式的 #pragma 语句避免副作用:

#pragma PRQA_NO_SIDE_EFFECTS funcname
c warnings compiler-warnings suppress-warnings qa-c
1个回答
0
投票

查看变量 temp1 和 temp2。我知道它被声明为易失性的。将变量更改为正常非易失性后,不会出现警告。这是 QAC 的 4 级警告。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.