В 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; } ', только короче. – Amadan
Это эквивалентно 'if (q [11]) q [3] | = 4;' –
* «эта строка почти квалифицируется как обфусканный код» * - действительно – 5gon12eder