Xiaoguang Ma

67 papers A* 3A 2B 4C 3Journal 48Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Haozhou Li, Xiangyu Dong, Huiyan Jiang, Yaoming Zhou, Xiaoguang Ma
2026 J jnl
CoRR
Keru Hua, Ding Wang, Yaoying Gu, Xiaoguang Ma
2026 J jnl
CoRR
Kun Luo, Xiaoguang Ma
2026 J jnl
CoRR
Fuhai Chen, Pengpeng Huang, Junwen Wu, Hehong Zhang, Shiping Wang, Xiaoguang Ma, Xuri Ge
2026 J jnl
J. Intell. Manuf.
Haotian Zhang, Stuart Dereck Semujju, Zhicheng Wang, Xianwei Lv, Kang Xu, Liang Wu, Ye Jia, Jing Wu, Wensheng Liang, Ruiyan Zhuang, Zhuo Long, Ruijun Ma, Xiaoguang Ma
2026 J jnl
Eng. Appl. Artif. Intell.
Kairong Tu, Xiaoguang Ma, Zhenxing Qian, Puhong Duan
2026 J jnl
CoRR
Yang Chen, Xiaoguang Ma, Bin Zhao
2026 J jnl
CoRR
Jiang Gao, Xiangyu Dong, Haozhou Li, Haoran Zhao, Yaoming Zhou, Xiaoguang Ma
2026 J jnl
CoRR
Jiacheng Bao, Haoran Yang, Yucheng Xin, Junhong Liu, Yuecheng Xu, Han Liang, Pengfei Han, Xiaoguang Ma, Dong Wang, Bin Zhao
2026 J jnl
Biomed. Signal Process. Control.
Xiaoyu Jiang, Jinchuan Qian, Aoguang Gu, Xiaoguang Ma, Kai Jin, Xinmin Zhang, Zhihuan Song
2026 J jnl
CoRR
Haoyu Tong, Xiangyu Dong, Xiaoguang Ma, Haoran Zhao, Yaoming Zhou, Chenghao Lin
2026 A* conf
AAAI
Fuhai Chen, Feng Zhang, Xiaoguang Ma, Yiyi Zhou, Jiarong Liu, Xuri Ge
2025 J jnl
Biomed. Signal Process. Control.
Gongtao Yue, Xiaoguang Ma, Wenrui Li, Ziheng An, Chen Yang
2025 A conf
IROS
Jun Xie, Jianwei Tan, Wensheng Liang, Zhicheng Wang, Xiaoguang Ma
2025 J jnl
IEEE Trans. Instrum. Meas.
Zhenrui Wu, Zhuo Long, Chunbo Luo, Shangbo Wang, Xiaoguang Ma
2025 J jnl
IEEE Trans. Multim.
Junjie Shi, Puhong Duan, Xiaoguang Ma, Jianning Chi, Yong Dai
2025 J jnl
IEEE Trans Autom. Sci. Eng.
Xiaoyu Jiang, Junhua Zheng, Ziyi Chen, Zhiqiang Ge, Zhihuan Song, Xiaoguang Ma
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Chunchao Li, Jun Li, Mingrui Peng, Behnood Rasti, Puhong Duan, Xuebin Tang, Xiaoguang Ma
2025 A* conf
ICRA
Shulei Huang, Haotian Zhang, Kang Xu, Xianwei Lv, Xiaoguang Ma
2025 B conf
MASS
Joseph Mikkelson, Dominic G. De La Cerda, Yanwei Wu, Xiaoguang Ma
2025 J jnl
Int. J. Inf. Sec.
Xiaotong Liu, Xiaoguang Tian, Xiaoguang Ma, Yanwei Wu, Fang Yang
2025 J jnl
CoRR
Xiangyu Dong, Haoran Zhao, Jiang Gao, Haozhou Li, Xiaoguang Ma, Yaoming Zhou, Fuhai Chen, Juan Liu
2025 J jnl
J. Electronic Imaging
Debin Zeng, Puhong Duan, Xiaoguang Ma
2025 A conf
ECAI
Jun Xie, Zhicheng Wang, Jianwei Tan, Huanxu Lin, Yang Jiang, Xiaoguang Ma
2025 J jnl
IEEE Trans. Reliab.
Xiaoyu Jiang, Yubin Cheng, Zhihuan Song, Xiaoguang Ma, Lingjian Ye, Zhiqiang Ge
2025 J jnl
Knowl. Based Syst.
Qianqian Wang, Xiaoguang Ma, Xiaoyu Jiang, Jianmin Ji, Honghu Pan
2024 J jnl
CoRR
Wensheng Liang, Jun Xie, Zhicheng Wang, Jianwei Tan, Xiaoguang Ma
2024 J jnl
IEEE Trans. Instrum. Meas.
Baosheng Zhang, Xiaoguang Ma, Hongjun Ma, Chunbo Luo
2024 J jnl
CoRR
Shuai Li, Xiaoguang Ma, Shancheng Jiang, Lu Meng
2024 B conf
SRDS
Zhiqi Liang, Jiajie Zeng, Shuai Peng, Xiaoguang Ma, Huan Yang
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Shicai Wei, Chunbo Luo, Xiaoguang Ma, Yang Luo
2024 J jnl
CoRR
Wu Liang, Xiaoguang Ma
2024 J jnl
IEEE Internet Things J.
Siyan Gu, Chunbo Luo, Yang Luo, Xiaoguang Ma
2024 J jnl
Comput. Electr. Eng.
Baosheng Zhang, Yelan Xian, Xiaoguang Ma
2024 J jnl
IEEE Trans. Intell. Transp. Syst.
Hankang Gu, Shangbo Wang, Xiaoguang Ma, Dongyao Jia, Guoqiang Mao, Eng Gee Lim, Cheuk Pong Ryan Wong
2024 J jnl
CoRR
Liang Wu, Xiaoguang Ma
2024 J jnl
CoRR
Wensheng Liang, Ruiyan Zhuang, Xianwei Shi, Shuai Li, Zhicheng Wang, Xiaoguang Ma
2024 J jnl
CoRR
Jun Xie, Zhicheng Wang, Jianwei Tan, Huanxu Lin, Xiaoguang Ma
2024 J jnl
Sensors
Youpei Huang, Xiaoguang Ma, Lihui Ren
2024 J jnl
CoRR
Shuai Li, Xiaoyu Jiang, Xiaoguang Ma
2024 C conf
FIE
Xiaoguang Ma, Jing Wang
2023 conf
RICAI
Xianwei Lv, Xiaoguang Ma
2023 J jnl
IEEE Trans. Ind. Informatics
Zhongchao Liang, Zhongnan Wang, Jing Zhao, Xiaoguang Ma
2023 J jnl
IEEE Trans. Instrum. Meas.
Shaowei Yang, Yangxia Xiang, Zhuo Long, Xiaoguang Ma, Qichuan Ding, Jie Jia
2023 J jnl
CoRR
Haotian Zhang, Stuart Dereck Semujju, Zhicheng Wang, Xianwei Lv, Kang Xu, Liang Wu, Ye Jia, Jing Wu, Zhuo Long, Wensheng Liang, Xiaoguang Ma, Ruiyan Zhuang
2023 conf
ITSC
Yuli Zhang, Shangbo Wang, Xiaoguang Ma, Wenwei Yue, Ruiyuan Jiang
2023 J jnl
IEEE Trans. Geosci. Remote. Sens.
Shicai Wei, Yang Luo, Xiaoguang Ma, Peng Ren, Chunbo Luo
2023 J jnl
J. Grid Comput.
Jinfeng Dou, Fangzheng Yuan, Jiabao Cao, Xuejia Meng, Xiaoguang Ma, Zhongwen Guo
2023 conf
ISAIMS
Haotian Zhang, Xiaoguang Ma, Zhizhe Lin
2023 C conf
FIE
Asad Azemi, Xiaoguang Ma
2022 J jnl
CoRR
Xiaoguang Ma, Ya Wang, Baosheng Zhang, Hong-Jun Ma, Chunbo Luo
2022 J jnl
J. Frankl. Inst.
Jing Zhao, Jingang Dong, Pak-Kin Wong, Xiaoguang Ma, Yongfu Wang, Chao Lv
2022 J jnl
Comput. Biol. Medicine
Hongtuo Lin, Chufan Jian, Yang Cao, Xiaoguang Ma, Hailiang Wang, Fen Miao, Xiaomao Fan, Jinzhu Yang, Gansen Zhao, Hui Zhou
2022 J jnl
Comput. Methods Programs Biomed.
Haowen Dou, Jie Tan, Huiling Wei, Fei Wang, Jinzhu Yang, Xiaoguang Ma, Jiaqi Wang, Teng Zhou
2021 C conf
FIE
Xiaoguang Ma, Asad Azemi, Dale Buechler
2021 A* conf
CHI
Minjing Yu, Meng Zhang, Chun Yu, Xiaoguang Ma, Xing-Dong Yang, Jiawan Zhang
2019 conf
ICCPS
Huan Yang, Liang Cheng, Xiaoguang Ma
2019 conf
INFOCOM Workshops
Huan Yang, Liang Cheng, Xiaoguang Ma
2017 conf
e-Energy
Huan Yang, Liang Cheng, Xiaoguang Ma
2014 J jnl
IEEE Trans. Veh. Technol.
Ming Yu, Xiaoguang Ma, MengChu Zhou
2013 B conf
GLOBECOM
Ming Yu, Xiaoguang Ma
2012 J jnl
Comput. Commun.
Ming Yu, Xiaoguang Ma, Wei Su, Leonard J. Tung
2011 J jnl
Biosyst.
Yubing Gong, Yinghang Hao, Xiu Lin, Li Wang, Xiaoguang Ma
2010 J jnl
Int. J. Bifurc. Chaos
Yubing Gong, Xiu Lin, Yinghang Hao, Xiaoguang Ma
2010 conf
CCTA (2)
Jingyuan Liu, Xiaoguang Ma, Zhihong Li, Xiaoying Wu, Nan Sun
2010 J jnl
Neurocomputing
Yinghang Hao, Yubing Gong, Xiu Lin, Yanhang Xie, Xiaoguang Ma
2007 B conf
IWCMC
Ming Yu, Bing W. Kwan, Xiaoguang Ma
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"