Carlo Cosentino

90 papers C 12Misc 1Journal 38Unranked 39
YearRankTypeTitle / Venue / Authors
2026 J jnl
Comput. Biol. Medicine
Nilde Fera, Anna Procopio, Paolo Zaffino, Antonio Cutruzzolà, Concetta Irace, Carlo Cosentino
2026 J jnl
IEEE Trans. Autom. Control.
Chao Liang, Carlo Cosentino, Alessio Merola, Maria Romano, Francesco Amato
2026 J jnl
Biomed. Signal Process. Control.
Rita Granata, Fabrizio Lo Regio, Anna Procopio, Annarita Tedesco, Carlo Ricciardi, Carlo Cosentino, Maria Romano, Alfonso Maria Ponsiglione, Francesco Amato
2025 J jnl
IEEE Access
Anna Procopio, Annarita Tedesco, Fabrizio Lo Regio, Giuseppe Cesarelli, Leandro Donisi, Carlo Ricciardi, Alessio Merola, Alfonso Maria Ponsiglione, Maria Romano, Francesco Montefusco, Carlo Cosentino, Francesco Amato
2025 conf
ICHI
Rita Granata, Anna Procopio, Annarita Tedesco, Giuseppe Cesarelli, Carlo Ricciardi, Francesca Angelone, Alfonso Maria Ponsiglione, Alessio Merola, Carlo Cosentino, Maria Romano, Francesco Amato
2025 J jnl
Comput. Methods Programs Biomed.
Anna Procopio, Marianna Rania, Paolo Zaffino, Nicola Cortese, Federica Giofrè, Franco Arturi, Cristina Segura-Garcia, Carlo Cosentino
2024 conf
BIBM
Nicola Cortese, Antonio Cutruzzolà, Anna Procopio, Paolo Zaffino, Carmine Scalzi, Agostino Gnasso, Concetta Irace, Carlo Cosentino
2024 J jnl
Comput. Methods Programs Biomed.
Nicola Cortese, Anna Procopio, Alessio Merola, Paolo Zaffino, Carlo Cosentino
2024 conf
Ital-IA
Francesca Fati, Marina Rosanu, Luigi De Vitis, Gabriella Schivardi, Giovanni Damiano Aletti, Francesco Multinu, Roberto Veraldi, Paolo Zaffino, Carlo Cosentino, Maria Francesca Spadea, Elena De Momi
2024 C conf
ACC
Gaetano Tartaglione, Francesco Montefusco, Marco Ariola, Carlo Cosentino, Alessio Merola, Francesco Amato
2024 conf
BIBM
Nilde Fera, Anna Procopio, Antonio Cutruzzolà, Paolo Zaffino, Nicola Cortese, Gloria Formoso, Carlo Cosentino, Concetta Irace
2024 J jnl
CoRR
Chao Liang, Carlo Cosentino, Alessio Merola, Maria Romano, Francesco Amato
2024 J jnl
J. Imaging
Paolo Zaffino, Ciro Benito Raggio, Adrian Thummerer, Gabriel Guterres Marmitt, Johannes Albertus Langendijk, Anna Procopio, Carlo Cosentino, Joao Seco, Antje-Christin Knopf, Stefan Both, Maria Francesca Spadea
2024 conf
MetroXRAINE
Francesca Angelone, Annarita Tedesco, Alfonso Maria Ponsiglione, Carlo Ricciardi, Donatella Dragone, Carlo Cosentino, Anna Procopio, Maria Romano, Francesco Amato
2023 J jnl
Comput. Methods Programs Biomed.
Anna Procopio, Giuseppe Cesarelli, Leandro Donisi, Alessio Merola, Francesco Amato, Carlo Cosentino
2023 J jnl
IEEE Control. Syst. Lett.
Francesco Montefusco, Anna Procopio, Iulia Martina Bulai, Francesco Amato, Morten Gram Pedersen, Carlo Cosentino
2023 conf
MED
Alessio Merola, Francesca Nesci, Donatella Dragone, Francesco Amato, Carlo Cosentino
2022 conf
MetroXRAINE
Anna Procopio, Giuseppe Cesarelli, Salvatore De Rosa, Leandro Donisi, Claudia Critelli, Alessio Merola, Ciro Indolfi, Carlo Cosentino, Francesco Amato
2022 conf
ICCA
Francesca Nesci, Alessio Merola, Donatella Dragone, Francesco Amato, Carlo Cosentino
2022 J jnl
IEEE Trans. Autom. Control.
Francesco Amato, Carlo Cosentino, Gianmaria De Tommasi, Alfredo Pironti, Maria Romano
2021 J jnl
Sensors
Alfonso Maria Ponsiglione, Carlo Cosentino, Giuseppe Cesarelli, Francesco Amato, Maria Romano
2021 conf
RTSI
Anna Procopio, Alessio Merola, Carlo Cosentino, Salvatore De Rosa, Giovanni Canino, Jolanda Sabatino, Jessica Ielapi, Ciro Indolfi, Francesco Amato
2021 J jnl
Int. J. Control
Gaetano Tartaglione, Marco Ariola, Carlo Cosentino, Gianmaria De Tommasi, Alfredo Pironti, Francesco Amato
2021 J jnl
Comput. Methods Programs Biomed.
Anna Procopio, Salvatore De Rosa, Francesco Montefusco, Giovanni Canino, Alessio Merola, Jolanda Sabatino, Jessica Ielapi, Ciro Indolfi, Francesco Amato, Carlo Cosentino
2021 conf
MED
Chao Liang, Carlo Cosentino, Alessio Merola, Maria Romano, Francesco Amato
2021 conf
RTSI
Chao Liang, Carlo Cosentino, Alessio Merola, Maria Romano, Francesco Amato
2020 conf
MeMeA
A. Capace, L. Randazzini, Carlo Cosentino, Maria Romano, Alessio Merola, Francesco Amato
2020 J jnl
IEEE Trans. Control. Syst. Technol.
Anna Procopio, Carlo Cosentino, Salvatore De Rosa, Míriam R. García, Caterina Covello, Alessio Merola, Jolanda Sabatino, Alessia De Luca, Ciro Indolfi, Francesco Amato
2019 J jnl
Complex.
Alejandro Fernández Villaverde, Carlo Cosentino, Attila Gábor, Gábor Szederkényi
2019 conf
EMBC
Anna Procopio, Salvatore De Rosa, Caterina Covello, Alessio Merola, Jolanda Sabatino, Alessia De Luca, Christoph Liebetrau, Christian W. Hamm, Ciro Indolfi, Francesco Amato, Carlo Cosentino
2019 conf
ECC
Anna Procopio, Salvatore De Rosa, Caterina Covello, Alessio Merola, Jolanda Sabatino, Alessia De Luca, Ciro Indolfi, Francesco Amato, Carlo Cosentino
2019 conf
ECC
Carlo Cosentino, Costanzo Manes, Giovanni Palombo, Pasquale Palumbo
2017 conf
CDC
Anna Procopio, Salvatore De Rosa, Caterina Covello, Alessio Merola, Jolanda Sabatino, Alessia De Luca, Ciro Indolfi, Francesco Amato, Carlo Cosentino
2017 conf
ICNSC
Francesco Amato, Mario Cesarelli, Carlo Cosentino, Alessio Merola, Maria Romano
2017 J jnl
CoRR
Alessio Merola, Carlo Cosentino, Domenico Colacino, Francesco Amato
2017 J jnl
Autom.
Alessio Merola, Carlo Cosentino, Domenico Colacino, Francesco Amato
2017 conf
ICNSC
Anna Procopio, Mariaconcetta Bilotta, Alessio Merola, Francesco Amato, Carlo Cosentino, Salvatore De Rosa, Caterina Covello, Jolanda Sabatino, Alessia De Luca, Ciro Indolfi
2017 conf
ICNSC
Francesco Amato, Domenico Colacino, Carlo Cosentino, Alessio Merola
2016 J jnl
IEEE J. Biomed. Health Informatics
Andrea Cherubini, Maria Eugenia Caligiuri, Patrice Péran, Umberto Sabatini, Carlo Cosentino, Francesco Amato
2016 J jnl
IEEE Trans. Autom. Control.
Carlo Cosentino, Roberto Ambrosino, Marco Ariola, Mariaconcetta Bilotta, Alfredo Pironti, Francesco Amato
2015 conf
EMBC
Luca Salerno, Carlo Cosentino, Giovanni Morrone, Mariaconcetta Bilotta, Francesco Amato
2015 J jnl
Int. J. Model. Identif. Control.
Alessio Merola, Domenico Colacino, Carlo Cosentino, Francesco Amato
2015 conf
EMBC
Andrea Cherubini, Maria Eugenia Caligiuri, Patrice Péran, Umberto Sabatini, Carlo Cosentino, Francesco Amato
2015 conf
ECC
Francesco Amato, Carlo Cosentino, Gianmaria De Tommasi, Alfredo Pironti
2015 conf
EMBC
Mariaconcetta Bilotta, Carlo Cosentino, Declan G. Bates, Luca Salerno, Francesco Amato
2014 conf
ECC
Francesco Amato, Domenico Colacino, Carlo Cosentino, Alessio Merola
2014 conf
MED
Domenico Colacino, Alessio Merola, Carlo Cosentino, Francesco Amato
2013 C conf
BIBE
Carlo Cosentino, Mariaconcetta Bilotta, Alessio Merola, Francesco Amato
2013 C conf
BIBE
Francesco Amato, Paolo Bifulco, Mario Cesarelli, Domenico Colacino, Carlo Cosentino, Antonio Fratini, Alessio Merola, Maria Romano
2013 conf
MED
Francesco Amato, Domenico Colacino, Carlo Cosentino, Alessio Merola
2013 conf
ICM
Francesco Amato, Domenico Colacino, Carlo Cosentino, Alessio Merola
2013 conf
MED
Francesco Amato, Domenico Colacino, Carlo Cosentino, Alessio Merola
2013 J jnl
BMC Syst. Biol.
Luca Salerno, Carlo Cosentino, Alessio Merola, Declan G. Bates, Francesco Amato
2012 J jnl
J. Comput. Biol.
Carlo Cosentino, Luca Salerno, Antonio Passanti, Alessio Merola, Declan G. Bates, Francesco Amato
2011 J jnl
CoRR
Gianmaria De Tommasi, Roberto Ambrosino, Giuseppe Carannante, Carlo Cosentino, Alfredo Pironti, Francesco Amato
2011 conf
CDC/ECC
Francesco Montefusco, Carlo Cosentino, Francesco Amato, Declan G. Bates
2011 J jnl
Int. J. Control
Francesco Amato, Marco Ariola, Carlo Cosentino
2011 J jnl
Autom.
Francesco Amato, Francesco Calabrese, Carlo Cosentino, Alessio Merola
2010 J jnl
IEEE Trans. Autom. Control.
Francesco Amato, Marco Ariola, Carlo Cosentino
2010 J jnl
Autom.
Francesco Amato, Marco Ariola, Carlo Cosentino
2010 J jnl
Autom.
Francesco Amato, Roberto Ambrosino, Carlo Cosentino, Gianmaria De Tommasi
2010 conf
CDC
Francesco Amato, Marco Ariola, Carlo Cosentino, Alessio Merola
2010 J jnl
IEEE Trans. Autom. Control.
Francesco Amato, Carlo Cosentino, Alessio Merola
2009 J jnl
Biomed. Signal Process. Control.
Francesco Amato, Mario Cannataro, Carlo Cosentino, Aldo Garozzo, Nicola Lombardo, Claudia Manfredi, Francesco Montefusco, Giuseppe Tradigo, Pierangelo Veltri
2009 J jnl
Autom.
Francesco Amato, Roberto Ambrosino, Marco Ariola, Carlo Cosentino
2009 conf
ECC
Francesco Amato, Carlo Cosentino, Francesco Montefusco
2009 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Francesco Amato, Carlo Cosentino, Antonino S. Fiorillo, Alessio Merola
2009 J jnl
IEEE Trans. Autom. Control.
Roberto Ambrosino, Francesco Calabrese, Carlo Cosentino, Gianmaria De Tommasi
2009 conf
ECC
Francesco Amato, Carlo Cosentino, Alessio Merola
2008 Misc conf
SAC
Francesco Amato, Mario Cannataro, Carlo Cosentino, Francesco Montefusco, Giuseppe Tradigo, Pierangelo Veltri, Aldo Garozzo, Nicola Lombardo, Sergio Greco, Claudia Manfredi
2008 J jnl
Biomed. Signal Process. Control.
Alessio Merola, Carlo Cosentino, Francesco Amato
2008 C conf
ACC
Francesco Amato, Roberto Ambrosino, Marco Ariola, Francesco Calabrese, Carlo Cosentino
2008 conf
CDC
Francesco Amato, Roberto Ambrosino, Marco Ariola, Carlo Cosentino, Gianmaria De Tommasi
2008 C conf
ACC
Roberto Ambrosino, Francesco Calabrese, Carlo Cosentino, Gianmaria De Tommasi
2008 C conf
ACC
Francesco Amato, Francesco Calabrese, Carlo Cosentino, Alessio Merola
2007 conf
MAVEBA
Francesco Amato, Mario Cannataro, Carlo Cosentino, Aldo Garozzo, Nicola Lombardo, Claudia Manfredi, Francesco Montefusco, Giuseppe Tradigo, Pierangelo Veltri
2007 C conf
ACC
Francesco Amato, Carlo Cosentino, Alessio Merola
2007 C conf
ACC
Francesco Amato, Carlo Cosentino, Walter Curatola, Diego di Bernardo
2007 J jnl
Autom.
Francesco Amato, Carlo Cosentino, Alessio Merola
2007 J jnl
Biomed. Signal Process. Control.
Carlo Cosentino, Walter Curatola, Mukesh Bansal, Diego di Bernardo, Francesco Amato
2007 conf
CDC
Francesco Amato, Roberto Ambrosino, Marco Ariola, Carlo Cosentino, Alessio Merola
2006 conf
CDC
Francesco Amato, Marco Ariola, Marco Carbone, Carlo Cosentino
2006 J jnl
Autom.
Francesco Amato, Marco Ariola, Carlo Cosentino
2005 C conf
ACC
Francesco Amato, Marco Ariola, Carlo Cosentino
2004 conf
CDC
Francesco Amato, Marco Ariola, Marco Carbone, Carlo Cosentino
2004 C conf
ACC
Francesco Amato, Marco Carbone, Marco Ariola, Carlo Cosentino
2003 conf
CDC
Francesco Amato, Marco Ariola, Carlo Cosentino
2003 conf
ECC
Francesco Amato, Marco Ariola, Carlo Cosentino
2003 C conf
ACC
Francesco Amato, Marco Ariola, Carlo Cosentino, Chaouki T. Abdallah, Peter Dorato
2003 C conf
CCA
Francesco Amato, Carlo Cosentino, Raffaele Iervolino, Umberto Ciniglio
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"