C 代码 Ghidra 反编译导致我不熟悉的语法

C code Ghidra decompile results in syntax I am unfamiliar with

我正在使用 Ghidra 逆向一个简单的二进制文件。反编译结果是这行代码
if ((param_1 != 4) && (func0(param_1 + 1), param_1 + 1 == 0x32))
param_1+1==0x32 部分让我感到困惑,因为我只是不熟悉语法并且不确定它在布尔表达式中做了什么。

那是逗号运算符。在这种情况下,它只是不必要的混淆,因为替代反编译可以避免它,例如,这些是等价的:

if ((param_1 != 4) && (func0(param_1 + 1), param_1 + 1 == 0x32)) {
    doStuff();
}
if (param_1 != 4) {
    func0(param_1 + 1);
    if(param_1 + 1 == 0x32) {
        doStuff();
    }
}

好的,这将是相当崩溃的

表达式为:

(func0(param_1 + 1), param_1 + 1 == 0x32)

因此,用 param_1 + 1 调用 func0,丢弃结果,并将 param_1 + 10x32 进行比较。

这段代码不自然;我通常希望找到 param_1 == 0x31.

我猜这不是 C 二进制文件,反编译器无法表达按值传递 return,这是 ancient basic 使用的。文档 它是通过引用传递的,但事实并非如此。我通过将全局变量传递给改变全局变量的函数来找到困难的方法。