c - C 中的高级 IF 语句

标签 c if-statement

我刚刚使用 IDA 对二进制文件进行了逆向工程,并加载了 Hex Ray 来检查特定的功能。生成的C源代码包含以下if语句:

LP_ret_GlobalLock_1 = GlobalLock(hMem);
LP_ret_GlobalLock_2 = LP_ret_GlobalLock_1;
...
if ( !LP_ret_GlobalLock_1 || (v9 = *(_DWORD *)(v6 + 4), *(_DWORD *)v6 = LP_ret_GlobalLock_2, v9 < 0) )

我不确定是否完全理解以下部分:

(v9 = *(_DWORD *)(v6 + 4), *(_DWORD *)v6 = LP_ret_GlobalLock_2, v9 < 0)

v9 初始化为 v6 + 4;但随后 v6 被修改为指针 LP_ret_GlobalLock_2,最后检查 v9 是否小于 0。这是正确的吗?计算 v9 时 v6 使用什么值? LP_ret_GlobalLock_2 还是之前的值?

最佳答案

我猜您是在问 comma operator 。它先计算逗号之前的表达式,然后计算逗号之后的表达式,整个结果就是第二个表达式的结果。

所以它首先是 v9 = *(_DWORD *)(v6 + 4) ,然后*(_DWORD *)v6 = LP_ret_GlobalLock_2 ,然后 v9 < 0 。结果就是v9 < 0的结果,在计算前两个表达式之后。

据我所知,您是通过逆向工程获得的。我自己编写代码时绝不会像这样在 if 语句中使用带有副作用的逗号运算符;太困惑了。

关于c - C 中的高级 IF 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1293057/

相关文章:

c - 在给定字符串 :Error:15 [Warning] return makes integer from pointer without a cast 中插入子字符串

c - 将灵活的数组成员分配为结构

java - "Else if"语句不执行任何操作(进行 Android 测试)

javascript - 如何在 JavaScript 中为 if 语句创建数组或变量?

c - 如何读取空白分隔的信息,包括一个可能有空白的字段?

c++ - 检查标志是否设置在整数变量中

c - 使用 fscanf 在 C 中读取

C If 语句不起作用

python - 为什么 if x,y : raise a SyntaxError?

java - 嵌套 IF 语句的时间复杂度