Jabier Martinez

77 papers A* 1B 16Misc 1Journal 12Unranked 40
YearRankTypeTitle / Venue / Authors
2025 conf
SPLC (B)
Daniel Escanez-Exposito, Jabier Martinez, Eneko Osaba, Pino Caballero-Gil
2025 conf
SPLC (B)
Jabier Martinez, Fernando Jorge Hernández, Alejandro Rodríguez, Julio Navarro, Rafael Portero
2024 J jnl
J. Syst. Softw.
Daniele Wolfart, Jabier Martinez, Wesley K. G. Assunção, Thelma Elita Colanzi, Alexander Egyed
2023 ch.
Handbook of Re-Engineering Software Intensive Systems into Software Product Lines
Jabier Martinez, Tewfik Ziadi, Tegawendé F. Bissyandé, Jacques Klein, Yves Le Traon
2023 conf
IISA
Konstantinos Alexakis, Jabier Martinez, Panagiotis Kokkinakos, Antonio Filograna, Yury Glikman, Xabier Uriarte, Dimitris Askounis
2023 conf
ICSRS
Jabier Martinez, Alexander Eguia, Imanol Urretavizcaya, Estibaliz Amparan, Pablo López Negro
2023 conf
SPLC (B)
Mathieu Acher, Jabier Martinez
2023 book
Handbook of Re-Engineering Software Intensive Systems into Software Product Lines
Roberto E. Lopez-Herrejon, Jabier Martinez, Wesley Klewerton Guez Assunção, Tewfik Ziadi, Mathieu Acher, Silvia Regina Vergilio
2023 J jnl
Softw. Syst. Model.
Alejandra Ruiz, Yod Samuel Martín, Jabier Martinez, Jacobo Quintans, Guillaume Mockly, Amelie Gyrard, Tommaso Crepax
2023 J jnl
J. Syst. Softw.
Gabriela Karoline Michelon, Jabier Martinez, Bruno Sotto-Mayor, Aitor Arrieta, Wesley K. G. Assunção, Rui Abreu, Alexander Egyed
2023 conf
SBQS
Daniele Wolfart, Wesley Klewerton Guez Assunção, Jabier Martinez
2023 ch.
UML-Based Software Product Line Engineering with SMarty
Ana Paula Allian, Elisa Yumi Nakagawa, Jabier Martinez, Wesley Klewerton Guez Assunção, Edson OliveiraJr
2023 J jnl
Inf. Softw. Technol.
Raul Medeiros, Jabier Martinez, Oscar Díaz, Jean-Rémy Falleri
2023 J jnl
IEEE Trans. Software Eng.
José Miguel Horcas, Daniel Strüber, Alexandru Burdusel, Jabier Martinez, Steffen Zschaler
2022 conf
SPLC (B)
Jabier Martinez, Daniel Strüber, José Miguel Horcas, Alexandru Burdusel, Steffen Zschaler
2022 conf
SAFECOMP Workshops
Jabier Martinez, Ángel Jesús Varela-Vaca
2022 J jnl
Comput. Stand. Interfaces
Tommaso Crepax, Victor Muntés-Mulero, Jabier Martinez, Alejandra Ruiz
2022 J jnl
Empir. Softw. Eng.
Rodrigo André Ferreira Moreira, Wesley K. G. Assunção, Jabier Martinez, Eduardo Figueiredo
2022 conf
SPLC (A)
Roberto E. Lopez-Herrejon, Wesley K. G. Assunção, Tewfik Ziadi, Jabier Martinez
2022 conf
SPLC (A)
Jabier Martinez, Wesley K. G. Assunção, Daniele Wolfart, Klaus Schmid, Apostolos Ampatzoglou
2022 conf
TechDebt@ICSE
Imanol Urretavizcaya, Nuria Quintano, Jabier Martinez
2022 J jnl
CoRR
José Miguel Horcas, Daniel Strüber, Alexandru Burdusel, Jabier Martinez, Steffen Zschaler
2022 conf
SPLC (A)
José Miguel Horcas, Daniel Strüber, Alexandru Burdusel, Jabier Martinez, Steffen Zschaler
2021 conf
RoSE@ICSE
Jabier Martinez, Alejandra Ruiz, Ansgar Radermacher, Stefano Tonetta
2021 conf
RoSE@ICSE
Jabier Martinez, Alejandra Ruiz, Ainara Garzo, Thierry Keller, Ansgar Radermacher, Stefano Tonetta
2021 conf
SPLC (A)
Wesley K. G. Assunção, Roberto E. Lopez-Herrejon, Tewfik Ziadi, Jabier Martinez
2021 conf
TechDebt@ICSE
Jabier Martinez, Nuria Quintano, Alejandra Ruiz, Izaskun Santamaría, Iker Martínez de Soria, José Arias
2021 conf
SPLC (A)
Gabriela Karoline Michelon, Bruno Sotto-Mayor, Jabier Martinez, Aitor Arrieta, Rui Abreu, Wesley K. G. Assunção
2021 conf
SBQS
Daniele Wolfart, Wesley Klewerton Guez Assunção, Jabier Martinez
2021 conf
SESoS/WDES
Imanol Urretavizcaya, Jabier Martinez, Giuseppe Satriani, Alejandra Ruiz, Ricardo Ruiz Nolasco, Antonio González, Isaac Moreno, Abel Balbis
2020 conf
SPLC (A)
Jabier Martinez, Daniele Wolfart, Wesley K. G. Assunção, Eduardo Figueiredo
2020 conf
SPLC (A)
Wesley K. G. Assunção, Mathieu Acher, Tewfik Ziadi, Jabier Martinez
2020 conf
SAFECOMP Workshops
Jabier Martinez, Jean Godot, Alejandra Ruiz, Abel Balbis, Ricardo Ruiz Nolasco
2020 J jnl
Empir. Softw. Eng.
Thorsten Berger, Jan-Philipp Steghöfer, Tewfik Ziadi, Jacques Robin, Jabier Martinez
2019 conf
VaMoS
Daniel Cruz, Eduardo Figueiredo, Jabier Martinez
2019 conf
MoDELS (Companion)
Garazi Juez Uriagereka, Estibaliz Amparan Calonge, Cristina Martinez Martinez, Jabier Martinez, Aurélien Ibanez, Matteo Morelli, Ansgar Radermacher, Huáscar Espinoza
2019 conf
SPLC (A)
Daniel Strüber, Mukelabai Mukelabai, Jacob Krüger, Stefan Fischer, Lukas Linsbauer, Jabier Martinez, Thorsten Berger
2019 ed.
SPLC (A)
Thorsten Berger, Philippe Collet, Laurence Duchien, Thomas Fogdal, Patrick Heymans, Timo Kehrer, Jabier Martinez, Raúl Mazo, Leticia Montalvillo, Camille Salinesi, Xhevahire Tërnava, Thomas Thüm, Tewfik Ziadi
2019 J jnl
J. Braz. Comput. Soc.
Crescencio Lima, Wesley K. G. Assunção, Jabier Martinez, Willian D. F. Mendonça, Ivan do Carmo Machado, Christina von Flach G. Chavez
2019 conf
SPLC (A)
Mathieu Acher, Tewfik Ziadi, Roberto E. Lopez-Herrejon, Jabier Martinez
2019 conf
ISD
Jabier Martinez, Alejandra Ruiz, Javier Puelles, Ibon Arechalde, Yuliya Miadzvetskaya
2019 J jnl
Microprocess. Microsystems
Luigi Pomante, Vittoriano Muttillo, Bohuslav Krena, Tomás Vojnar, Filip Veljkovic, Pacome Magnin, Martin Matschnig, Bernhard Fischer, Jabier Martinez, Thomas Gruber
2018 J jnl
Inf. Softw. Technol.
Jabier Martinez, Tewfik Ziadi, Mike Papadakis, Tegawendé F. Bissyandé, Jacques Klein, Yves Le Traon
2018 B conf
SPLC
Jabier Martinez, Nicolas Ordoñez, Xhevahire Tërnava, Tewfik Ziadi, Jairo Aponte, Eduardo Figueiredo, Marco Túlio Valente
2018 ed.
SPLC (2)
Philippe Collet, Jianmei Guo, Jabier Martinez, Christoph Seidl, Julia Rubin, Oscar Díaz, Mukelabai Mukelabai, Thorsten Berger
2018 B conf
SPLC
Tewfik Ziadi, Roberto E. Lopez-Herrejon, Mathieu Acher, Jabier Martinez
2018 B conf
SPLC
Jabier Martinez, Xhevahire Tërnava, Tewfik Ziadi
2018 conf
SPLC (2)
Tewfik Ziadi, Jabier Martinez, Xhevahire Tërnava
2018 B conf
ICSR
Jabier Martinez, Jean-Sébastien Sottet, Alfonso García Frey, Tegawendé F. Bissyandé, Tewfik Ziadi, Jacques Klein, Paul Temple, Mathieu Acher, Yves Le Traon
2018 conf
SBCARS
Crescencio Lima, Wesley K. G. Assunção, Jabier Martinez, Ivan do Carmo Machado, Christina von Flach G. Chavez, Willian Douglas Ferrari Mendonça
2018 conf
VaMoS
Mathieu Acher, Paul Temple, Jean-Marc Jézéquel, José Angel Galindo, Jabier Martinez, Tewfik Ziadi
2018 Misc conf
SAC
Juliana Alves Pereira, Jabier Martinez, Hari Kumar Gurudu, Sebastian Krieter, Gunter Saake
2017 conf
ICSE (Companion Volume)
Jabier Martinez, Tewfik Ziadi, Tegawendé F. Bissyandé, Jacques Klein, Yves Le Traon
2017 conf
SPLC (B)
Jabier Martinez, Wesley K. G. Assunção, Tewfik Ziadi
2017 conf
SPLC (A)
Jabier Martinez, Roberto E. Lopez-Herrejon, Tewfik Ziadi, Mathieu Acher
2017 ch.
Human Centered Software Product Lines
Jabier Martinez, Jean-Sébastien Sottet, Alfonso García Frey, Tewfik Ziadi, Tegawendé F. Bissyandé, Jean Vanderdonckt, Jacques Klein, Yves Le Traon
2016 B conf
ICSR
Jabier Martinez, Tewfik Ziadi, Mike Papadakis, Tegawendé F. Bissyandé, Jacques Klein, Yves Le Traon
2016 B conf
SPLC
Roberto Erick Lopez-Herrejon, Jabier Martinez, Tewfik Ziadi, Mathieu Acher
2016
Jabier Martinez
2016 B conf
SPLC
Li Li, Jabier Martinez, Tewfik Ziadi, Tegawendé F. Bissyandé, Jacques Klein, Yves Le Traon
2016 B conf
SPLC
Jabier Martinez, Tewfik Ziadi, Tegawendé F. Bissyandé, Jacques Klein, Yves Le Traon
2015 A* conf
ASE
Jabier Martinez, Tewfik Ziadi, Tegawendé F. Bissyandé, Jacques Klein, Yves Le Traon
2015 B conf
SPLC
Jabier Martinez, Tewfik Ziadi, Tegawendé F. Bissyandé, Jacques Klein, Yves Le Traon
2015 conf
GECCO (Companion)
Jabier Martinez, Gabriele Rossi, Tewfik Ziadi, Tegawendé François D. Assise Bissyandé, Jacques Klein, Yves Le Traon
2015 B conf
SPLC
Roberto E. Lopez-Herrejon, Tewfik Ziadi, Jabier Martinez, Anil Kumar Thurimella, Mathieu Acher
2014 conf
MoDELS (Demos)
Amine Lajmi, Jabier Martinez, Tewfik Ziadi
2014 B conf
VISSOFT
Jabier Martinez, Tewfik Ziadi, Raúl Mazo, Tegawendé F. Bissyandé, Jacques Klein, Yves Le Traon
2014 B conf
ECMFA
Jabier Martinez, Tewfik Ziadi, Jacques Klein, Yves Le Traon
2014 B conf
SPLC
Roberto E. Lopez-Herrejon, Tewfik Ziadi, Jabier Martinez, Anil Kumar Thurimella
2012 conf
SPLC (2)
Jabier Martinez, Anil Kumar Thurimella
2012 conf
SPLC (1)
Haitham S. Hamza, Jabier Martinez, Anil Kumar Thurimella, Jitender S. Deogun
2011 B conf
SPLC
Haitham S. Hamza, Jabier Martinez, Andreas Rummler
2010 B conf
SPLC
Haitham S. Hamza, Jabier Martinez
2010 conf
SPLC Workshops
Jabier Martinez
2010 conf
SPLC Workshops
Haitham S. Hamza, Jabier Martinez, Carmen Alonso
2010 conf
SPLASH/OOPSLA Companion
Haitham S. Hamza, Jabier Martinez, Joseba Laka Mugartza
2009 B conf
XP
Jabier Martinez, Jessica Díaz, Jennifer Pérez, Juan Garbajosa
redb/extractors/decompiler/bninja/analysis/cfg-old.py
← Index redb/extractors/decompiler/bninja/analysis/cfg-old.py python
from collections import deque
from enum import Enum

from binaryninja.enums import (
    BranchType,
    InstructionTextTokenType,
)

# Support both package and standalone imports
try:
    from ..utils.hashes import calculate_md5, calculate_sha256
except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.utils.hashes import calculate_md5, calculate_sha256


class CFGAnalysis:
    def __init__(self, function):
        self.function = function

    def determine_block_type(self, block) -> str:
        """Determine the type of a basic block."""
        # Check if it's a thunk function (usually just a jump or call)
        if len(block.disassembly_text) <= 2 and any(
            "jmp" in line.tokens[0].text.lower() for line in block.disassembly_text
        ):
            return "THUNK"

        # Check if it contains only data (no valid instructions)
        if all(not line.tokens for line in block.disassembly_text):
            return "DATA"

        # Default to code
        return "CODE"

    def extract_cyclomatic_complexity(self):
        """
        Cyclomatic complexity (McCabe’s metric) measures the number of linearly independent paths
        through a function’s control flow graph (CFG).
        The standard formula is:

            M = E - N + 2

        where:
            - E = number of edges in the CFG
            - N = number of nodes (basic blocks)
            - 2 accounts for the entry and exit nodes of a single connected graph
        """
        if self.function is None:
            return 0

        # number of basic blocks
        num_blocks = len(self.function.basic_blocks)
        # number of edges in the graph
        num_edges = sum(
            len(basic_block.outgoing_edges)
            for basic_block in self.function.basic_blocks
        )
        return num_edges - num_blocks + 2

    def extract_function_cfg(self):
        """Extract information about a function CFG and return it as a dictionary."""

        function = self.function
        function_data = {
            "function_address": self.function.start,
            "blocks": [],
            "measures": {
                "cyclomatic_complexity": self.extract_cyclomatic_complexity(),
            },
        }

        if self.function is None:
            return function_data

        # Get the map of the depth associated to every block
        depths = self.get_map_depth()

        # Get the map of the positions associated to every block
        id_maps = self.get_block_id_map()

        # Extract block data with graph structure information
        for block in function.basic_blocks:
            # dominators per every block translated
            dominators = sorted(self.extract_dominators(block, id_maps))

            # post dominators
            post_dominators = sorted(self.extract_post_dominators(block, id_maps))

            # Build block instructions string
            block_instructions = "\n".join(str(line) for line in block.disassembly_text)

            # Determine block type
            block_type = self.determine_block_type(block)

            # Extract successors directly from basic block
            successor_blocks = [edge.target.start for edge in block.outgoing_edges]
            # We ensure a canonical order and we sort the edges
            successor_blocks.sort()

            # Extract predecessors directly from basic block
            predecessor_blocks = [edge.source.start for edge in block.incoming_edges]
            # We ensure a canonical order and we sort the edges
            predecessor_blocks.sort()

            # Determine branch type from outgoing edges
            branch_type = self.determine_branch_type(block)

            instructions_count = len(block.disassembly_text)

            # Create block record
            block_json = {
                "function_address": self.function.start,
                "block_start_address": block.start,
                "block_end_address": block.end,
                "block_size": block.end - block.start,
                "instructions_count": instructions_count,
                "block_instructions_hash": calculate_sha256(block_instructions),
                "predecessor_blocks": predecessor_blocks,
                "successor_blocks": successor_blocks,
                "depth": depths[block.start],
                "position": id_maps[block.start],
                "branch_type": branch_type,
                "block_type": block_type,
                "flags": self.extract_block_flags(block),
                "dominators": dominators,
                "post_dominators": post_dominators,
            }
            function_data["blocks"].append(block_json)

        return function_data

    def extract_dominators(self, bb, id_maps):
        """Extract the dominators normalized"""
        dom_idx = [id_maps[d.start] for d in bb.dominators]
        return dom_idx

    def extract_post_dominators(self, bb, id_maps):
        """Extract the post-dominators normalized"""
        post_dom_idx = [id_maps[d.start] for d in bb.post_dominators]
        return post_dom_idx

    def determine_branch_type(self, block):
        """
        Determine the type of branch at the end of a basic block.
        This combines edge type information with instruction analysis.
        """
        # If no outgoing edges, it might be a return or terminal block
        if not block.outgoing_edges:
            # Check if the last instruction is a return
            for line in reversed(list(block.disassembly_text)):
                if line.tokens and any(
                    token.text.lower() in ["ret", "retn"] for token in line.tokens
                ):
                    return "RETURN"
            return "UNKNOWN"

        # Collect branch types from all outgoing edges
        branch_types = []
        for edge in block.outgoing_edges:
            edge_type = edge.type
            # Map edge type to our branch type enum
            if isinstance(edge_type, str):
                if edge_type == "IndirectCall":
                    branch_types.append("CALL")
                else:
                    branch_types.append("UNKNOWN")
            else:
                # Use our mapping for integer/enum values
                type_mapping = {
                    BranchType.UnconditionalBranch: "DIRECT",
                    BranchType.FalseBranch: "CONDITIONAL",
                    BranchType.TrueBranch: "CONDITIONAL",
                    BranchType.CallDestination: "CALL",
                    BranchType.FunctionReturn: "RETURN",
                    BranchType.SystemCall: "CALL",
                    BranchType.IndirectBranch: "INDIRECT",
                    BranchType.ExceptionBranch: "UNKNOWN",
                    BranchType.UnresolvedBranch: "UNKNOWN",
                    BranchType.UserDefinedBranch: "UNKNOWN",
                }
                branch_types.append(type_mapping.get(edge_type, "UNKNOWN"))

        # Determine overall branch type (prioritize CALL > RETURN > CONDITIONAL > DIRECT)
        if "CALL" in branch_types:
            return "CALL"
        elif "RETURN" in branch_types:
            return "RETURN"
        elif "CONDITIONAL" in branch_types:
            return "CONDITIONAL"
        elif "DIRECT" in branch_types:
            return "DIRECT"
        elif len(block.outgoing_edges) == 1:
            return "FALLTHROUGH"

        # If edge analysis was inconclusive, fall back to instruction analysis
        last_instr = None
        for line in reversed(list(block.disassembly_text)):
            if line.tokens:
                last_instr = line
                break

        if last_instr:
            mnemonic = None
            for token in last_instr.tokens:
                if token.type == InstructionTextTokenType.InstructionToken:
                    mnemonic = token.text.lower()
                    break

            if mnemonic:
                if mnemonic == "call":
                    return "CALL"
                elif mnemonic == "jmp":
                    return "DIRECT"
                elif mnemonic.startswith("j") and mnemonic != "jmp":
                    return "CONDITIONAL"
                elif mnemonic in ["ret", "retn"]:
                    return "RETURN"

        return "UNKNOWN"

    def get_map_depth(self):
        """
        Run a BFS on the basic blocks of the function to assign a depth to every block
        """

        depths = {}
        entry = self.function.get_basic_block_at(self.function.start)

        ### Simple BFS
        q = deque()
        q.append(entry)
        depths[entry.start] = 0

        while q:
            b = q.popleft()
            b_depth = depths[b.start]
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in depths:
                    depths[tgt.start] = b_depth + 1
                    q.append(tgt)

        return depths

    def get_block_id_map(self):
        """
        Assign a unique, sequential ID to each basic block of the function using a BFS starting from the entry block.
        """

        id_map = {}
        entry = self.function.get_basic_block_at(self.function.start)

        q = deque()
        q.append(entry)

        current_id = 0
        id_map[entry.start] = current_id

        while q:
            b = q.popleft()
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in id_map:
                    current_id += 1
                    id_map[tgt.start] = current_id
                    q.append(tgt)

        return id_map

    def extract_block_flags(self, block):
        """
        Get the flags for every basic block. Currently, we implemented these heuristics:
            - if a basic block is the entry node for a function
            - if a basic block is the exit block for a function
            - if a basic block is part of a natural loop
        """
        flags = []

        if block.start == self.function.start:
            flags.append(BlockFlags.EntryBlock.value)

        if any(edge.type == BranchType.FunctionReturn for edge in block.outgoing_edges):
            flags.append(BlockFlags.ExitBlock.value)

        # if this block is in its dominance frontier, then it's part of a natural loop
        if block in block.dominance_frontier:
            flags.append(BlockFlags.LoopBlock.value)

        return flags


class BlockFlags(Enum):
    # generally, the basic block identifying the entry point of the function
    EntryBlock = "EntryBlock"
    # any basic blocks that makes the control flow exiting from the current function
    ExitBlock = "ExitBlock"
    # any block is in a natural loop if it is in its own dominance frontier
    LoopBlock = "LoopBlock"


class BlockType(Enum):
    THUNK = "THUNK"
    DATA = "DATA"
    PADDING = "PADDING"
    CODE = "CODE"