【发布时间】:2015-12-13 20:48:44
【问题描述】:
在source-code for nanodns 中,有一个非典型的使用三元运算符来试图减小代码大小:
/* If the incoming packet has an AR record (such as in an EDNS request),
* mark the reply as "NOT IMPLEMENTED"; using a?b:c form to save one byte*/
q[11]?q[3]|=4:1;
这条线的作用并不明显。乍一看,它看起来像是在为两个数组元素之一赋值,但事实并非如此。相反,它似乎要么是一个数组元素,要么什么都不做(运行“命令”1)。
看起来它应该是这行代码的替代品(确实长了一个字节):
if(q[11])q[3]|=4;
字面意思是这样的:
if (q[11])
q[3]|=4;
else
1;
三元运算符通常用作表达式的一部分,因此将其用作独立命令似乎很奇怪。再加上看似格格不入的1,这行代码几乎可以称得上是混淆代码了。
我做了一个快速测试,能够编译和运行一个 C(++) 程序,其中数据常量作为“命令”,例如 void main() {0; 'a'; "foobar"; false;}。 seems to bea sort of nop command,但我找不到任何关于这种用法的信息——Google isn’tvery amenableto thistype ofsearchquery)。
谁能准确解释它是什么以及它是如何工作的?
【问题讨论】:
-
q[11],而不是q[1]。你的分析是正确的;没有更大的上下文,它相当于if (q[11]) { q[3] |= 4; },只是更短。 -
相当于
if ( q[11] ) q[3] |= 4; -
“这一行几乎可以说是混淆代码”——确实
-
“谁能准确解释它是什么以及它是如何工作的?” - 你的问题正确地描述了这两个方面。
-
这是糟糕的代码。使用
q[11]&&(q[3]|=4);
标签: c++ c ternary-operator deobfuscation