首页 > 解决方案 > 任意表达式中的单个冒号?

问题描述

我需要弄清楚这个混淆的 C++ 代码(由其他人编写)做了什么。除了一个棘手的部分,我几乎想出了一切:

bool part1(char *flag)
{
    int *t = (int *) memfrob(flag, 8);

    unsigned int b[] = {3164519328, 2997125270};

    for (int i = 0; i < 2; b[i] = ~b[i], ++i);

    return !(0<:t:>-0<:b:>+1<:t:>-1<:b:>);
}

这个函数的返回语句发生了什么?我不知道这些冒号是什么意思...

我试过用谷歌搜索 C++ 中的冒号运算符是做什么的,但只找到了关于类构造函数和条件表达式的答案,这似乎与这个问题无关。

标签: c++colondigraphs

解决方案


该代码使用两个字母的替代标记,也称为“有向图”。具体来说,<:[:>]

因此,语法 like 0<:t:>is just 0[t],并且由于数组下标可以与数组标识符交换,所以 this is just t[0]

一个可以帮助反混淆代码的好工具是cppinsights.io。从链接中可以看出,代码只是对数组值进行了一些算术运算(忽略static_cast此示例,这对于理解转换并不重要)。


推荐阅读