Irina Petrova

13 papers C 1Misc 2Journal 2Unranked 8
YearRankTypeTitle / Venue / Authors
2024 conf
SPECOM (1)
Tatiana Y. Sherstinova, Irina Petrova
2023 Misc conf
FRUCT
Irina Petrova
2022 Misc conf
FRUCT
Tatiana Y. Sherstinova, Irina Petrova, Olga Mineeva, Maria Fedosova
2017 J jnl
CoRR
Irina Petrova, Arina Buzdalova
2017 conf
GECCO (Companion)
Irina Petrova, Arina Buzdalova
2016 conf
GECCO (Companion)
Arkady Rost, Irina Petrova, Arina Buzdalova
2016 J jnl
CoRR
Arkady Rost, Irina Petrova, Arina Buzdalova
2016 conf
SSCI
Arina Buzdalova, Irina Petrova, Maxim Buzdalov
2015 conf
GECCO (Companion)
Irina Petrova, Arina Buzdalova
2014 C conf
ICMLA
Irina Petrova, Arina Buzdalova, Maxim Buzdalov
2014 conf
GECCO (Companion)
Maxim Buzdalov, Irina Petrova, Arina Buzdalova
2013 conf
GECCO (Companion)
Maxim Buzdalov, Arina Buzdalova, Irina Petrova
2013 conf
ICMLA (2)
Irina Petrova, Arina Buzdalova, Maxim Buzdalov
redb/extractors/decompiler/bninja/analysis/medium_level_normalization.py
← Index redb/extractors/decompiler/bninja/analysis/medium_level_normalization.py python
from binaryninja import (
    MediumLevelILInstruction,
    Variable, SSAVariable,
    ILIntrinsic,
)


class MediumLevelNormalization:
    def __init__(self):
        return

    def _collect_ops(self, il, ops):
        if il is None:
            return
        ops.append(int(il.operation))
        operands = getattr(il, "operands", None)
        if not operands:
            return
        for op in operands:
            if isinstance(op, MediumLevelILInstruction):
                self._collect_ops(op, ops)
            elif isinstance(op, (list, tuple)):
                for sub in op:
                    if isinstance(sub, MediumLevelILInstruction):
                        self._collect_ops(sub, ops)

    def normalize_instruction_all_levels(self, instr_il):
        ops = []
        self._collect_ops(instr_il, ops)
        return ops

    def _leaf_type(self, val):
        if isinstance(val, SSAVariable):
            return "SSA_VAR"
        if isinstance(val, Variable):
            return "VAR"
        if isinstance(val, ILIntrinsic):
            return "INTRINSIC"
        if isinstance(val, bool):
            return "BOOL"
        if isinstance(val, float):
            return "FLOAT_CONST"
        if isinstance(val, int):
            return "CONST"
        if isinstance(val, str):
            return "STR"
        return type(val).__name__.upper()

    def _collect(self, il, out_op):
        if il is None:
            return
        out_op.append(int(il.operation))
        operands = getattr(il, "operands", None)
        if not operands:
            return
        for op in operands:
            if isinstance(op, MediumLevelILInstruction):
                self._collect(op, out_op)
            elif isinstance(op, (list, tuple)):
                for sub in op:
                    if isinstance(sub, MediumLevelILInstruction):
                        self._collect(sub, out_op)
                    else:
                        out_op.append(self._leaf_type(sub))
            else:
                out_op.append(self._leaf_type(op))

    def normalize_instr_with_operands(self, instr_il):
        ops = []
        self._collect(instr_il, ops)
        return ops