任意表达式中的单冒号?
Single colons in arbitrary expressions?
我需要弄清楚这个混淆的 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:>);
}
这个函数的return语句是怎么回事?我不知道这些冒号是什么意思...
我尝试用谷歌搜索 C++ 中冒号运算符的作用,但只找到了关于 class 构造函数和条件表达式的答案,这似乎与这个问题无关。
该代码使用两个字母 alternative tokens,也称为“二合字母”。具体来说,<:
就是[
,:>
就是]
。
所以,像0<:t:>
这样的语法只是0[t]
,并且由于数组下标可以与数组标识符交换,所以这只是t[0]
。
cppinsights.io 可以帮助对代码进行去混淆处理的一个很棒的工具。从 link 中可以看出,代码只是对数组值进行一些算术运算(忽略本例中的 static_cast
,这对于理解转换并不重要)。
我需要弄清楚这个混淆的 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:>);
}
这个函数的return语句是怎么回事?我不知道这些冒号是什么意思...
我尝试用谷歌搜索 C++ 中冒号运算符的作用,但只找到了关于 class 构造函数和条件表达式的答案,这似乎与这个问题无关。
该代码使用两个字母 alternative tokens,也称为“二合字母”。具体来说,<:
就是[
,:>
就是]
。
所以,像0<:t:>
这样的语法只是0[t]
,并且由于数组下标可以与数组标识符交换,所以这只是t[0]
。
cppinsights.io 可以帮助对代码进行去混淆处理的一个很棒的工具。从 link 中可以看出,代码只是对数组值进行一些算术运算(忽略本例中的 static_cast
,这对于理解转换并不重要)。