Постоянный фолдинг на этапе препроцессинга

У меня есть фрагмент кода C, который мне нужно расшифровать. Он содержит кучу хитрых макросов. Я пропустил код через препроцессор C и отступ, и теперь он выглядит примерно так:

switch (9263 + 1505) {
case 1505 + 41131 + 6729 + 2347:
            ...
case 1505 + 41131 + 6729 + 2347 + 1:
            ...
case 1505 + 41131 + 6729 + 2347 + 2:
            ...

Для упрощения дальнейшего анализа я ищу какой-нибудь инструмент, который может свернуть все константы в коде. Я знаю, что препроцессор C не может этого сделать, и на этапе компиляции будет выполняться постоянная оптимизация сворачивания. Но как насчет исходного кода?

Сценарии оболочки также приветствуются, поскольку я подозреваю, что это может быть единственный способ сделать это.


person Pavel Zaichenkov    schedule 28.02.2013    source источник


Ответы (1)


Используйте clang для его компиляции и используйте его бэкенд c для генерации кода c.

Что-то вроде этого должно работать:

clang -emit-llvm source.cpp -o - | llc -march=c
person Rahul Banerjee    schedule 02.03.2013
comment
Как я вижу, C как бэкэнд для LLVM больше не поддерживается. Вместо этого я попытался использовать C++, но результат сильно отличается от исходного кода. - person Pavel Zaichenkov; 04.03.2013
comment
Можете ли вы просто взять старый clang из git и скомпилировать его самостоятельно? Бэкэнд C кажется лучшим способом сделать это. Попробуйте версию примерно от декабря 2009 года. В противном случае вам придется самостоятельно взломать оператор switch case (строка 669): clang.llvm.org/doxygen/Stmt_8h_source.html - person Rahul Banerjee; 05.03.2013
comment
Я это сделал. Ну, окончательный код далеко не читабелен, но он уже не такой длинный и сложный. Итак, с помощью gdb мне удалось его деобфусцировать. Спасибо. - person Pavel Zaichenkov; 05.03.2013
comment
@PavelZaichenkov, не могли бы вы опубликовать где-нибудь свои выводы? - person Janus Troelsen; 04.06.2014
comment
@JanusTroelsen, если вас интересует сама программа, вот. Программа сортирует список чисел. Ваша цель — понять, какой алгоритм сортировки он использует. - person Pavel Zaichenkov; 09.06.2014