Сравнительный анализ некоторых java-декомпиляторов

Содержание:

Создание exe файла с помощью PyInstaller

PyInstaller собирает в один пакет Python-приложение и все необходимые ему библиотеки следующим образом:

  1. Считывает файл скрипта.
  2. Анализирует код для выявления всех зависимостей, необходимых для работы.
  3. spec, который содержит название скрипта, библиотеки-зависимости, любые файлы, включая те параметры, которые были переданы в команду PyInstaller.
  4. Собирает копии всех библиотек и файлов вместе с активным интерпретатором Python.
  5. Создает папку BUILD в папке со скриптом и записывает логи вместе с рабочими файлами в BUILD.
  6. Создает папку DIST в папке со скриптом, если она еще не существует.
  7. Записывает все необходимые файлы вместе со скриптом или в одну папку, или в один исполняемый файл.

Если использовать параметр команды или при генерации исполняемого файла, тогда все будет помещено в одну папку. Это поведение по умолчанию. Если же использовать параметр или , то все окажется в одном исполняемом файле.

Возьмем в качестве примера простейший c названием simple.py, который содержит такой код.

Копировать

Создадим один исполняемый файл. В командной строке введите:

После завершения установки будет две папки, BUILD и DIST, а также новый файл с расширением .spec. Spec-файл будет называться так же, как и файл скрипта.

Python создает каталог распространения, который содержит основной исполняемый файл, а также все динамические библиотеки.

Вот что произойдет после запуска файла.

Как декомпилировать EXE-файл

К сожалению, Windows не предусматривает в своем инструментарии встроенных инструментов, позволяющих выполнить декомпиляцию, поэтому придется пользоваться только сторонним ПО. Такое ПО может быть полезно как пользователям, которые просто желают получше изучить исходный код той или иной программы, так и разработчикам.

Вариант 1: VB Decompiler

Корректно способен провести декомпиляцию EXE-файлов, написанных и скомпилированных через Visual Basic 5.0 и 6.0. Это самая популярная среда разработки программ для Windows. Сама программа полностью бесплатна и занимает на диске всего несколько мегабайт.

  1. В верхней части интерфейса кликните по пункту «Файл» и выберите из контекстного меню вариант «Открыть программу». Вместо этого можно воспользоваться сочетанием клавиш Ctrl+O.
  2. В «Проводнике» отыщите исполняемый файл той программы, декомпиляцию которой вы собираетесь провести. Выделите его и нажмите на кнопку «Открыть», чтобы выполнить загрузку файла в рабочую среду.
  3. Путь до нужного EXE-файла отобразится в строке «Файл». Нажмите на кнопку «Старт», чтобы запустить процедуру декомпиляции.
  4. Программа не оповещает о завершении процедуры декомпиляции. О завершении таковой будет свидетельствовать только надпись «Декомпилировано» в нижней левой части окна.
  5. Для сохранения декомпилированного файла нажмите по кнопке «Файл» в верхнем меню и выберите из выпадающего списка вариант «Сохранить декомпилированный проект». Можете просто воспользоваться сочетанием клавиш Ctrl+S.

Вариант 2: EMS Source Rescuer

Данный декомпилятор корректно работает с файлами, скомпилированными с помощью Delphi и C++ Builder. Работа с другими компиляторами возможна, но официально не поддерживается, поэтому есть риски. Программа распространяется полностью бесплатно.

  1. Запустите EMS Source Rescuer. Его интерфейс представлен в качестве блоков с шагами. На первом шаге вам требуется указать путь до проекта, который будет декомпилирован. Это можно сделать, нажав на кнопку папки в строке «Executable File».
  2. Выберите нужный EXE-файл в окошке «Проводника».
  3. В поле «Project name» пропишите имя декомпилируемого проекта и нажмите «Next».
  4. На следующем шаге потребуется выбрать язык программирования, используемый в выбранном проекте. Это делается в блоке «Output style». Поставив маркер на нужном месте нажмите «Next».
  5. Вы перейдете сразу на 3-й шаг. Здесь будет показан исходный код проекта. Ниже выберите папку, в которую будут сохранены исходные файлы, извлеченные из EXE-файла, и нажмите «Save».

Вариант 3: ReFox

ReFox отлично зарекомендовал себя в декомпиляции проектов, созданных через Visual FoxPro и FoxBASE+. Сама программа носит условно-бесплатный характер использования. Есть демонстрационная версия, использование которой бесплатно, но только определенный период времени.

Инструкция по использованию данной программы выглядит так:

  1. В левую часть интерфейса программы уже встроен обозреватель файлов. Воспользуйтесь им, чтобы найти и открыть нужный EXE-файл. В правой части отображается техническая информация о выбранном элементе.
  2. Кликните правой кнопкой мыши по выбранному файлу. В контекстном меню выберите пункт «Decompile».
  3. Появится окошко, в котором будет указана директория декомпилируемого файла. Если там все верно, то нажмите «Ок» для продолжения операции.
  4. По завершении процесса вы получите соответствующее сообщение. Нажмите там «Ок». Результат можно посмотреть в той папке, которую вы указали во 2 шаге.

Вариант 4: DeDe

Эта программа для декомпиляции не так функциональна и поддерживает только одни язык – Delphi.

  1. Около самого верхнего поля нажмите на кнопку в виде раскрытой папки. Она отвечает за добавление папки.
  2. Выберите в «Проводнике» нужный EXE-файл и нажмите «Открыть».
  3. Чтобы запустить процесс декомпиляции, нажмите на кнопку «Процесс», которая расположена около строки указания проекта.
  4. При успешном завершении вы получите соответствующее сообщение. Нажмите «Ок» или закройте его.
  5. Теперь вам осталось сохранить результаты декомпилирования на компьютере. Переключитесь на вкладку «Project».
  6. Рекомендуется отметить галочками все пункты в блоке «Сохранить Делфи Проект». В строке «Папка проекта» укажите директорию, куда будет выполнено сохранение. Нажмите на кнопку «Сделать файлы», чтобы завершить сохранение.

Представленные декомпиляторы способы выполнить обратное преобразование большинства EXE-файлов, написанных на разных языках программирования. Как видите, в самом процессе, вне зависимости от выбранной программы, нет ничего сложного.

Exec — Выполнение кода, консоль запросов и не только!

Незаменимый инструмент администратора БД и программиста:
Выполняйте произвольный код из режима 1С Предприятие; сохраняйте/загружайте часто используемые скрипты; выполняйте запросы с замером производительности запроса в целом и каждой из временных таблиц в частности, а также с просмотром содержимого временных таблиц; произвольным образом изменяйте любые объекты БД, редактируя даже не вынесенные на формы реквизиты и записывая изменения в режиме «ОбменДанными.Загрузка = Истина»; легко узнавайте ИД объектов БД; выполняйте прямые запросы к SQL с замером производительности и не только!

5 стартмани

Значит я могу взять исходники и сделать свою Elma BPM?

— нет этого сделать не получится

  • Почти весь серверный код обфусцирован (преобразован в непонятный вид для человека — без изменения логики для машины)
  • Все модули связаны и подписаны ( ключом шифрования) — один без другого не запустится

Вывод: это делать бессмысленно — вы больше потратите времени чтобы разобраться и собрать свою копию чем сделать заново

— но приложения других разработчиков вы можете повторить, чей код не обфусцирован ( я не призываю так делать)

Украсть не получится — понятно

— тогда может хотя бы взломать активацию (сделать генератор ключей)?

* Забегая вперед —  тоже не получится )

В Elma BPM используется механизм односторонних функций — пара связанных функций

  • одна шифрует в одну сторону
  • другая в обратную

а в наличии только последняя.

  1. Представьте что вы пропустили лист бумаги через шредер (измельчитель бумаги)
  2. И теперь представьте механизм превращающий из мусора лист бумаги без потери информации… (у вас именно такой механизм)
  3. А теперь вам предстоит подобрать нужный шредер — удачи)

— такие функции используют преобразования XOR(исключающий или) — где обратная операция возвращает неоднозначный ответ (например на вход 1, на выход 0 или 1 — неизвестно).

9 best Java Decompiler to be used

There are many best Java Decompiler which provide offline services. You can easily download these applications from the internet in order to get the work done. Here are some of the best java Decompiler on the internet today those are friendly to work with and have a good user interface.

1) JD Project

JD Project is one of the most frequently used best java decompiler offline. It is developed to decompile Java 5 and beyond, which currently goes up to Java 8. It is available for Windows, Mac, and Linux and is the best decompiler for eclipse and IntelliJ as it provides a plugin for each platform separately. This proves to be extremely useful during the debugging process.
It uses the JD- GUI. This is an easy to use and an interactive graphical interface.

2) Cavaj Java Decompiler

This is another great tool for converting bytecodes to Java source code. If you are a Windows user, then Cavaj is the best option available for you out there. It is simple to use and decompiles any given Java class file. One major drawback for this application is that it lacks Syntax Highlighting. It is also not available for Mac and Linux Operating softwares. In short, this is a standalone Windows application that converts bytecodes into class code.

3) DJ Java Decompiler

This is yet another standalone Windows Application. It is available for Windows XP, Windows 2003, Windows Vista, Windows 7, Windows 8, Windows 8.1 and Windows 10. It can easily decompile complex Java applets and binaries to produce accurate source code. There are drag and drop features for smooth working, so you can decompile .class files on your computer’s hard disk or on a network drive that you have connected.

4) JBVD

JBVD stands for Java Bytecode Viewer and Decompiler. It is based on the Javassist open source library. Like the others, this application too is available only for Windows users. It is one of the most powerful bytecode viewer and decompiler. Of course, this program needs Java to be installed on your computer to work JBVD can thus be used both, as a Java viewer and a decompiler.

5) AndroChef Java Decompiler

If you are on the lookout for a Java decompiler to view and analyze bytecode then AndroChef should be your preferred option. It is capable of easily converting Java .class files and applets into Java source code. It is simple and easy to use, however it is only available on the Windows Operating System. With Androchef, you can decompile apk. dex, jar, and java class files.

6) Procyon

It is one of the most popular open source Java decompiler. One of its most amazing features is the ability to deal with Java 8. Procyon can handle all those features which were launched with Java 5 to the latest version to Java. Due to this, Procyon can be used as an alternative where other java versions fail. It can also easily deal with other features such as local classes, annotations, Enum declarations, and Lamdas in Java 8.

7) CFR Decompiler

This is another such decompiler that was developed to deal with the latest features and updates in Java programming. It can easily decompile the latest Java features such as Lamdas and Switch Statement. This means if you are using Java 8, you can be at peace with yourself. The only downside here is that this decompiler is not an open source program. However, it has a command line tool that makes the decompiling process faster and even more efficient.

8) FernFlower

Apart from the decompilers mentioned above, the ones mentioned here are still in nascent stages and are under development. Fernflower is one of those. Fren is an analytical decompiler for Java and has recently been made open sourced. The software renames all the obfuscated symbols and puts them into a JAR file in the end. FrenFlower is used to decompile .class, zip and JAR file extensions.

9) Krakatau

It is an interesting decompiler as it has been written in Python. It is still in the development stage. However, it contains three tools: a decompiler and disassembler for Java class files and an assembler to create class files. However, one major drawback here is that it does not support all Java 8 features.

Conclusion- Which is best Java Decompiler?

If you are looking out for a best Java decompiler then you can try out any of the ones mentioned above. Just download them and try them out. You could share your experience in the comments below and even if you are aware of other amazing decompilers, then you could share those two. I would love to add it to the above list. You can also check out detailed tools section for more content.

Java Decompiler Software
$0

5

Summary

Check these 9 best offline Java decompiler which help you manage the codes and convert it as required. You can download these top Java decompilers and install it on your system.

Этап 2 — Разбиение на блоки и анализ статических ветвлений

На этом этапе программу нужно представить в виде набора блоков, то есть, последовательностей команд, всегда выполняющихся друг за другом, и переходов между ними. То, что получится, называется «control flow graph», или граф ветвлений.

На блоки ARM-программу разбить легко, хотя есть нюансы — в ARM-коде почти все инструкции могут быть условными. Соответственно, каждая последовательность условных команд с одним и тем же суффиксом — блок, а все условные переходы генерируются как раз из суффиксов.

Чтобы выделить блоки, нужно сначала пройтись по всему бинарю и на каждый адрес сохранить флаги, а потом опять пройтись, но уже рекурсивно и начиная с точки входа программы. Новый блок в позиции нужно начать, если (флаг EPI_N):

  • Если на этот адрес обнаружены переходы.
  • Если по предыдущему адресу другой условный суффикс.
  • Если по предыдущему адресу условная инструкция, меняющая флаги.
  • Если по предыдущему адресу переход без ссылки (то есть переход, но не вызов функции).

Также нужно сохранить информацию о переходе:

  • Со ссылкой/без ссылки.
  • Тип адреса:
    • Известный и вычислен
    • Динамический регистровый
    • Динамический из памяти (LDR PC, )
    • Возврат из функции

Переходы в ARM могут инициироваться следующими инструкциями:

  • B / BX / BL / BLX
  • MOV PC, …
  • Арифметико-логические инструкции типа ADD PC, …
  • LDR PC, . Перед этой инструкцией часто встречается MOV LR, PC — тогда такой переход надо считать вызовом функции.
  • LDMxx … {..PC..} / POP {..PC..}. Это, кстати, почти наверняка возврат из функции, компилятор совмещает его с восстановлением значений регистров из стека.

Отследить на этом этапе все переходы мы не сможем, потому что адрес может вычисляться более или менее динамически, а мы пока что не смотрим на данные. Однако есть два плюса:

  • Большинство «динамических» переходов — вызовы функций. Управляющие конструкции, как правило, состоят из ближних переходов.
  • Даже если мы не знаем цель перехода, сам факт наличия перехода всё равно нам известен.

Поэтому разбиение на блоки будет почти наверняка корректным. Единственное, что может повлиять на разбиение — неизвестный переход в середину блока.

Далее нужно разобраться с условными суффиксами. Тут есть нюансы:

  1. Как отобразить на граф последовательность условных блоков с разными суффиксами?
  2. Как отобразить на граф переход на условную инструкцию?

Для решения (1) нужно добавить все переходы, «перескакивающие» один или несколько условных блоков, начиная с последней безусловной инструкции. Для этого при обработке нужно сохранять номера условных блоков + номер последнего безусловного, и при встрече нового блока добавлять переходы на этот новый блок с каждого из сохранённых с условием, равным конъюнкции отрицаний суффиксов блоков, которые мы перескакиваем, и суффикса нового блока, если он условный.

Для решения (2) нужно действовать похоже — переход на условную инструкцию заменяется на набор переходов, которые могут перескакивать условные инструкции. Правда, так мы всё равно ничего не сможем сделать, если условной будет первая инструкция функции — функция должна представлять из себя единицу с одной точкой входа. В такой ситуации можно только вводить «псевдо-блок», не включающий в себя ни одной инструкции, в начало функции. Но такого кода компиляторы, к счастью, не генерируют, поэтому если не пытаться декомпилировать вирусы и кряки — всё будет нормально.

В результате все инструкции переходов на графе у нас будут безусловными, а условными могут быть только переходы к условным блокам инструкций.

Пример графа ветвлений с этого этапа:

Известные ограничения

Требуется режим прерывания выполнения

Создание исходного кода с помощью декомпиляции возможно только в том случае, если отладчик находится в режиме прерывания выполнения и приложение приостановлено. Например, Visual Studio переходит в режим прерывания, попадая в точку останова или в исключение. Вы можете легко активировать прерывание выполнения Visual Studio при следующем запуске кода с помощью команды Прервать все ().

Ограничения декомпиляции

Создание исходного кода из промежуточного языка (IL), используемого в сборках .NET, имеет некоторые внутренние ограничения. Поэтому созданный исходный код не выглядит в точности как оригинальный исходный код. Большая часть различий сосредоточена в тех местах, где информация в оригинальном исходном коде не нужна во время выполнения. Например, во время выполнения не нужна такая информация, как пробелы, комментарии и имена локальных переменных. Рекомендуется использовать созданный исходный код, чтобы понять, как выполняется программа, а не в качестве замены оригинального исходного кода.

Отладка оптимизированных сборок или сборок выпуска

При отладке кода, декомпилированного из сборки, которая была скомпилирована с использованием оптимизаций компилятора, вы можете столкнуться со следующими проблемами:

  • точки останова могут не всегда быть привязаны к соответствующим исходным расположениям;
  • при пошаговом выполнении шаг может не всегда переходить в правильное место;
  • имена локальных переменных могут быть неточными;
  • некоторые переменные могут быть недоступны для оценки.

Дополнительные сведения можно найти в описании проблемы GitHub Интеграция ICSharpCode.Decompiler с отладчиком VS.

Надежность декомпиляции

Относительно небольшой процент попыток декомпиляции может привести к сбою. Это происходит из-за ошибки пустой ссылки точки последовательности в ILSpy. Мы устранили этот сбой путем перехвата таких проблем и корректного завершения попытки декомпиляции.

Дополнительные сведения можно найти в описании проблемы GitHub Интеграция ICSharpCode.Decompiler с отладчиком VS.

Ограничения при работе с асинхронным кодом

Результаты декомпиляции модулей с шаблонами кода async/await могут быть неполными или неудачными в целом. Шаблоны кода async/await и машины состояния yield state-machine в ILSpy реализованы только частично.

Дополнительные сведения можно найти в описании проблемы GitHub Состояние генератора PDB.

Только мой код

Параметры режима Только мой код (JMC) позволяют Visual Studio выполнять шаг с обходом системы, платформы, библиотеки и других вызовов непользовательского кода. Во время сеанса отладки в окне Модули отображаются модули кода, которые отладчик воспринимает как «Мой код» (т. е. пользовательский код).

При декомпиляции оптимизированных модулей или модулей выпуска создается непользовательский код. Если отладчик прерывается в декомпилированном непользовательском коде, появляется окно Отсутствует источник. Чтобы отключить режим «Только мой код», перейдите в раздел Инструменты > Параметры (или Отладка > Параметры) > Отладка > Общие и снимите флажок Включить только мой код. .

Извлеченный исходный код

Исходный код, извлеченный из сборки, имеет следующие ограничения.

  • Имена и расположение созданных файлов нельзя настроить.
  • Файлы являются временными и будут удалены Visual Studio.
  • Файлы помещаются в одну папку без использования какой-либо иерархии, которая была в оригинальных исходных файлах.
  • Имя каждого файла содержит хэш контрольной суммы файла.

Создается только код C#

При декомпиляции создаются только файлы исходного кода на C#. Возможность создавать файлы на каком-либо другом языке отсутствует.

Licenses + Acknowledgments

Application

FFDec Application is licensed with GNU GPL v3, see the license.txt.
It uses modified code of these libraries:

And links also these libraries:

  • Java Native Access — JNA (Registry association, Process memory reading) — LGPL
  • javactivex (Flash Player ActiveX embedding) — LGPLv3
  • flashdebugger library (Debugging ActionScript) — LGPLv3
  • FFDec Library (LGPLv3) — see below

Library

FFDec Library is licensed with GNU LGPL v3, see license.txt for details.
It uses modified code of these libraries:

  • UAB «DKD» NellyMoser ASAO codec (Decoding Nelly Moser sound format) — LGPL

And links also these libraries:

decompiler

Home / Tools / decompiler

Packages that attempt to reverse a compiled program into source code.

Tool count: 28

Name Version Description Category Website
avaloniailspy 198.a465d9f .NET Decompiler (port of ILSpy) decompiler
beebug 25.cddb375 A tool for checking exploitability. decompiler disassembler reversing
cafebabe 0.1.2 Java bytecode editor & decompiler. decompiler reversing
cfr 150 Another Java decompiler. decompiler
dnspy 6.1.7 .NET debugger and assembly editor. windows decompiler binary reversing
dotpeek 2020.2.1 Free .NET Decompiler and Assembly Browser. windows decompiler binary reversing
fernflower 485.e19aab6 An analytical decompiler for Java. decompiler
ffdec 11.0.0 Open source Flash SWF decompiler and editor. decompiler binary misc
flasm 1.62 Disassembler tool for SWF bytecode reversing decompiler
gadgetinspector 6.ac7832d A byte code analyzer for finding deserialization gadget chains in Java applications. decompiler binary
hopper 4.5.29 Reverse engineering tool that lets you disassemble, decompile and debug your applications. reversing disassembler decompiler binary
iaito 5.2.2 Qt and C++ GUI for radare2 reverse engineering framework reversing decompiler disassembler debugger
jadx 1.2.0 Command line and GUI tools to produce Java source code from Android Dex and APK files decompiler reversing
jd-cli 1.1.0 Command line Java Decompiler. decompiler reversing
jd-gui 1.6.6 A standalone graphical utility that displays Java source codes of .class files. decompiler reversing
jpexs-decompiler 12.0.1 JPEXS Free Flash Decompiler. decompiler
justdecompile 22018 The decompilation engine of JustDecompile. windows decompiler binary reversing
luyten 0.5.4 An Open Source Java Decompiler Gui for Procyon. decompiler misc
pcode2code 4.4de2193 VBA p-code decompiler. decompiler
procyon 0.5.36 A suite of Java metaprogramming tools focused on code generation and analysis. decompiler code-audit
python-uncompyle6 3.7.4 A Python cross-version decompiler. decompiler
r2cutter 1:1.12.0 Qt and C++ GUI for radare2 reverse engineering framework reversing decompiler disassembler debugger
r2ghidra 5.2.1 Deep ghidra decompiler integration for radare2 and r2cutter reversing decompiler disassembler debugger
radare2-cutter 1:1.12.0 Qt and C++ GUI for radare2 reverse engineering framework. decompiler reversing disassembler debugger
recaf 2.18.3.2136.419925d9 Modern Java bytecode editor. decompiler reversing
recstudio 4.1 Cross platform interactive decompiler decompiler reversing
retdec 1927.b3749201 Retargetable machine-code decompiler based on LLVM. decompiler reversing
snowman 0.1.3 A native code to C/C++ decompiler, see the examples of generated code. windows decompiler

Методика оптимизации программного кода 1С: проведение документов

Описание простого метода анализа производительности программного кода 1С, способов его оптимизации и оценки результатов в виде числовых показателей прироста производительности. Не требует сторонних программных продуктов, используются только типовые возможности платформ 1С.
Методика проверена на линейке платформ начиная с 1С:Предприятие 8.2 (обычные формы, управляемые формы). Позволяет ускорить проведение проблемных документов в 3 и более раз, провести проверку корректности формирования проводок оптимизированным кодом и подтвердить результаты оптимизации реальными замерами производительности в режиме предприятия.
К публикации приложены демонстрационные базы для режимов обычного и управляемого приложения на платформе 1С:Предприятие 8.3 (8.3.9.2033).

1 стартмани

Подсистема «Показатели объектов»

Если вашим пользователям нужно вывести в динамический список разные показатели, которые нельзя напрямую получить из таблиц ссылочных объектов, и вы не хотите изменять структуру справочников или документов — тогда эта подсистема для вас. С помощью нее вы сможете в пользовательском режиме создать свой показатель, который будет рассчитываться по формуле или с помощью запроса. Этот показатель вы сможете вывести в динамический список, как любую другую характеристику объекта. Также можно будет настроить отбор или условное оформление с использованием созданного показателя.

2 стартмани

Faster — многофункциональный ускоритель работы программиста 1С и других языков программирования Промо

Программа Faster 9.4 позволяет ускорить процесс работы программиста
(работает в любом текстовом редакторе).
Подсказка при вводе текста на основе ранее введенного текста и настроенных шаблонов.
Программа Faster позволяет делится кодом с другими программистами в два клика или передать ссылку через QR Код.
Исправление введенных фраз двойным Shift (с помощью speller.yandex). Переводчик текста. Переворачивает текст случайно набранный на другой раскладке.
Полезная утилита для тех, кто печатает много однотипного текста, кодирует в среде Windows на разных языках программирования.
Через некоторое время работы с программой у вас соберется своя база часто используемых словосочетаний и кусков кода.
Настройка любых шорткатов под себя с помощью скриптов.
Никаких установок и лицензий, все бесплатно.

1 стартмани

Build in Docker

Docker support is maintained by community. If something does not work for you or if you have suggestions for improvements, open an issue or PR.

Build Image

Building in Docker does not require installation of the required libraries locally. This is a good option for trying out RetDec without setting up the whole build toolchain.

To build the RetDec Docker image, run

This builds the image from the master branch of this repository.

To build the image using the local copy of the repository, use the development Dockerfile, :

Run Container

If your is not 1000, make sure that the directory containing your input binary files is accessible for RetDec:

Now, you can run the decompiler inside a container:

Note: Do not modify the part is. You only need to change . Output files will then be generated to .

Выделение блоков

Далее нужно перейти к выделению блоков — то есть, циклов и условных операторов — тому, что обычно называют «структурированием», то есть воссозданием программы из линейного листинга:

Циклы

У любого цикла есть точка входа, на которую можно поставить метку «continue», так как оператор «continue» как раз на неё и переходит, и стандартная точка выхода, на которую можно аналогично поставить метку «break». Внутри цикла переходы на точки входа и выхода для удобочитаемости нужно заменять на continue и break.

Цикл:

  • Начинается с какого-либо узла, являющегося к тому же единственной точкой входа в этот цикл.
  • Должен включать в себя все пути, ведущие в любой внешний узел, и возвращающиеся в любой внутренний узел (обобщённое требование цикла).
  • Если добавили какой-то узел, и получили две точки входа, то этот узел не принадлежит циклу.
  • Если добавили какой-то узел и единственная точка входа изменилась, идём нафиг — цикл из изначального узла не растёт.

Циклы бывают с предусловием и с постусловием. Цикл с предусловием:

С постусловием:

Условные операторы

Условный оператор определить легко: если что-то ветвится и это не ветвление, реализующее цикл (то есть не предусловие и не постусловие само по себе), это условный оператор 🙂

Транслировать его следует так:

  • Ищем точку сбора всех веток, выходящих из начального узла (узел, в котором все они объединяются).
  • Залезаем в каждую ветку, всё обрабатываем точно так же, как до этого, и точно так же (в обработке линейных участков и циклов тоже помечаем).
  • Помечаем пройденные узлы как обработанные.
  • Когда где-то видим уже обработанный узел, заменяем переход к нему на goto. То есть, if «без дублирования» кусков веток будет «нормальным», без goto.

Пример «плохого» if’а: 0->1->3->4, 0->2->3, 0->4, 0->5->4.

Декомпилировать его можно как-то так:

if(_1) { 1; 3; }
else if(_2) { 2; goto 3; }
else if(_5) { 5; }
4;
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector