Hai Chen

77 papers A* 3A 1B 2C 5Misc 2Journal 52Unranked 12
YearRankTypeTitle / Venue / Authors
2026 J jnl
Bioinform.
Hai Chen, Jingmin Shu, Rekha Mudappathi, Elaine Li, Panwen Wang, Leif Bergsagel, Ping Yang, Zhifu Sun, Logan Zhao, Changxin Shi, Jeffrey P. Townsend, Carlo Maley, Li Liu
2026 J jnl
IEEE Trans. Wirel. Commun.
Ziqi Lin, Jinming Li, Hai Chen, Di Zhang, Shimin Gong, Bo Gu
2025 J jnl
ACM Trans. Knowl. Discov. Data
Fulan Qian, Yuanjun Zou, Mengyao Xu, Xuejun Zhang, Chonghao Zhang, Chenchu Xu, Hai Chen
2025 J jnl
IEEE Trans. Wirel. Commun.
Zihao Huang, Hai Chen, Bo Gu, Shimin Gong, Zhou Su, Mohsen Guizani
2025 J jnl
Eng. Appl. Artif. Intell.
Xu Wang, Weiqi Qian, Tun Zhao, Hai Chen, Lei He, Haisheng Sun, Yuan Tian
2025 J jnl
IEEE Trans. Big Data
Hai Chen, Shu Zhao, Xiao Yang, Huanqian Yan, Yuan He, Hui Xue, Fulan Qian, Hang Su
2025 J jnl
CoRR
Dayu Tan, Cheng Kong, Yansen Su, Hai Chen, Dongliang Yang, Junfeng Xia, Chun-Hou Zheng
2025 Misc conf
ICASSP
Chang Liu, Hai Chen, Boxiang Wang, Shibao Zheng
2025 J jnl
Knowl. Based Syst.
Fulan Qian, Wenbin Chen, Hai Chen, Jinggang Liu, Shu Zhao, Yan-ping Zhang
2025 J jnl
IET Comput. Vis.
Haiyan Long, Hai Chen, Mengyao Xu, Chonghao Zhang, Fulan Qian
2025 A conf
ICME
Mengkui Li, Xinrui Chen, Hai Chen, Kang Zhao, Yanping Zhang, Shu Zhao, Fulan Qian
2025 J jnl
IEEE Trans. Intell. Transp. Syst.
Fulan Qian, Jiacheng Hong, Huanqian Yan, Hai Chen, Chonghao Zhang, Hang Su, Shu Zhao
2025 J jnl
IEEE Signal Process. Lett.
Hai Chen, Shu Zhao, Yuanting Yan, Fulan Qian
2025 J jnl
IET Comput. Vis.
Mengyao Xu, Hai Chen, Chonghao Zhang, Yuanjun Zou, Chenchu Xu, Yanping Zhang, Fulan Qian
2025 J jnl
CoRR
Xingyu Zhou, Qifan Li, Xiaobin Hu, Hai Chen, Shuhang Gu
2025 J jnl
Comput. Mater. Continua
Haiyan Long, Chonghao Zhang, Xudong Qiu, Hai Chen, Gang Chen
2025 J jnl
Knowl. Based Syst.
Fulan Qian, Yan Cui, Mengyao Xu, Hai Chen, Wenbin Chen, Qian Xu, Caihong Wu, Yuanting Yan, Shu Zhao
2025 J jnl
IEICE Trans. Fundam. Electron. Commun. Comput. Sci.
Yu Li, Hai Chen, Cheng Zhang, Shimin Gong, Bo Gu
2025 A* conf
ICML
Kexuan Shi, Hai Chen, Leheng Zhang, Shuhang Gu
2025 J jnl
IET Image Process.
Hai Chen, Yanli Chen, Zhicheng Dong, Yongrong Wang, Asad Malik, Hanzhou Wu
2025 A* conf
EMNLP
Yuchen Ji, Bo Xu, Jie Shi, Jiaqing Liang, Deqing Yang, Yu Mao, Hai Chen, Yanghua Xiao
2025 J jnl
CoRR
Yuchen Ji, Bo Xu, Jie Shi, Jiaqing Liang, Deqing Yang, Yu Mao, Hai Chen, Yanghua Xiao
2025 J jnl
ACM Trans. Knowl. Discov. Data
Fulan Qian, Wenbin Chen, Hai Chen, Yan Cui, Shu Zhao, Yanping Zhang
2024 J jnl
IEEE Trans. Intell. Transp. Syst.
Hai Chen, Huanqian Yan, Xiao Yang, Hang Su, Shu Zhao, Fulan Qian
2024 conf
IJCRS (2)
Fulan Qian, Caoge Yao, Hai Chen, Shu Zhao
2024 J jnl
Symmetry
Xu Wang, Weiqi Qian, Tun Zhao, Lei He, Hai Chen, Haisheng Sun, Yuan Tian, Jinlei Cui
2024 J jnl
CoRR
Kexuan Shi, Hai Chen, Leheng Zhang, Shuhang Gu
2024 B conf
GLOBECOM
Ziqi Lin, Xu Zhang, Hai Chen, Lanhua Li, Shimin Gong, Bo Gu
2024 J jnl
IEEE Trans. Instrum. Meas.
Fan Wang, Xiaochen Yuan, Junqi Bao, Chan-Tong Lam, Guoheng Huang, Hai Chen
2024 J jnl
IEEE Trans. Comput. Soc. Syst.
Fulan Qian, Yan Cui, Hai Chen, Wenbin Chen, Yuanting Yan, Shu Zhao
2024 J jnl
CoRR
Lingdong Kong, Shaoyuan Xie, Hanjiang Hu, Yaru Niu, Wei Tsang Ooi, Benoit R. Cottereau, Lai Xing Ng, Yuexin Ma, Wenwei Zhang, Liang Pan, Kai Chen, Ziwei Liu, Weichao Qiu, Wei Zhang, Xu Cao, Hao Lu, Ying-Cong Chen, Caixin Kang, Xinning Zhou, Chengyang Ying, Wentao Shang, Xingwei Wang, Yinpeng Dong, Bo Yang, Shengyin Jiang, Zeliang Ma, Dengyi Ji, Haiwen Li, Xingliang Huang, Yu Tian, Genghua Kou, Fan Jia, Yingfei Liu, Tiancai Wang, Ying Li, Xiaoshuai Hao, Yifan Yang, Hui Zhang, Mengchuan Wei, Yi Zhou, Haimei Zhao, Jing Zhang, Jinke Li, Xiao He, Xiaoqiang Cheng, Bingyang Zhang, Lirong Zhao, Dianlei Ding, Fangsheng Liu, Yixiang Yan, Hongming Wang, Nanfei Ye, Lun Luo, Yubo Tian, Yiwei Zuo, Zhe Cao, Yi Ren, Yunfan Li, Wenjie Liu, Xun Wu, Yifan Mao, Ming Li, Jian Liu, Jiayang Liu, Zihan Qin, Cunxi Chu, Jialei Xu, Wenbo Zhao, Junjun Jiang, Xianming Liu, Ziyan Wang, Chiwei Li, Shilong Li, Chendong Yuan, Songyue Yang, Wentao Liu, Peng Chen, Bin Zhou, Yubo Wang, Chi Zhang, Jianhang Sun, Hai Chen, Xiao Yang, Lizhong Wang, Dongyi Fu, Yongchun Lin, Huitong Yang, Haoang Li, Yadan Luo, Xianjing Cheng, Yong Xu
2024 J jnl
ACM Trans. Inf. Syst.
Hai Chen, Fulan Qian, Chang Liu, Yanping Zhang, Hang Su, Shu Zhao
2023 J jnl
Inf. Syst.
Fulan Qian, Kaili Qin, Hai Chen, Jie Chen, Shu Zhao, Yanping Zhang
2023 J jnl
IEEE Trans. Big Data
Fulan Qian, Bei Yuan, Hai Chen, Jie Chen, Defu Lian, Shu Zhao
2023 A* conf
CVPR
Zijian Zhu, Yichi Zhang, Hai Chen, Yinpeng Dong, Shu Zhao, Wenbo Ding, Jiachen Zhong, Shibao Zheng
2023 J jnl
CoRR
Zijian Zhu, Yichi Zhang, Hai Chen, Yinpeng Dong, Shu Zhao, Wenbo Ding, Jiachen Zhong, Shibao Zheng
2023 J jnl
Knowl. Inf. Syst.
Fulan Qian, Kaili Qin, Hai Chen, Jie Chen, Shu Zhao, Peng Zhou, Yanping Zhang
2022 conf
ISCSIC
Bowen Liu, Kefeng Fan, Hai Chen, Lixin Liu, Huihua Yang
2022 conf
PRIS
Hai Chen, Tun Zhao, Weiqi Qian
2022 J jnl
Expert Syst. Appl.
Fulan Qian, Yuhui Zhu, Hai Chen, Jie Chen, Shu Zhao, Yanping Zhang
2021 J jnl
Expert Syst. Appl.
Hai Chen, Fulan Qian, Jie Chen, Shu Zhao, Yanping Zhang
2021 J jnl
Neurocomputing
Hai Chen, Fulan Qian, Jie Chen, Shu Zhao, Yanping Zhang
2020 J jnl
ISPRS Int. J. Geo Inf.
Jingyi Xu, Xiaoying Liang, Hai Chen
2020 J jnl
Symmetry
Hai Chen, Lei He, Weiqi Qian, Song Wang
2020 J jnl
IEEE Access
Mianjie Li, Xiaochen Yuan, Hai Chen, Jianqing Li
2019 J jnl
Multim. Syst.
Di Han, Jianqing Li, Wenting Li, Ruibin Liu, Hai Chen
2019 J jnl
Comput. Methods Programs Biomed.
Hai Chen, Xiaochen Yuan, Jianqing Li, Zhiyuan Pei, Xiaobin Zheng
2019 J jnl
EURASIP J. Image Video Process.
Jing Huang, Yunyi Shang, Hai Chen
2019 J jnl
Sensors
Hui Fang, Hai Chen, Hao Jiang, Yu Wang, Yufei Liu, Fei Liu, Yong He
2019 J jnl
IEEE Access
Hai Chen, Xiaochen Yuan, Zhiyuan Pei, Mianjie Li, Jianqing Li
2018 J jnl
CoRR
Min Zhang, Qianli Ma, Chengfeng Wen, Hai Chen, Deruo Liu, Xianfeng Gu, Jie He, Xiaoyin Xu
2017 C conf
VCIP
Xuesen Shang, Wenming Yang, Shuifa Sun, Yapeng Tian, Hai Chen, Kaiquan Chen
2017 J jnl
IEEE Access
Shihua Cao, Yunan Han, Hai Chen, Jianqing Li
2016 J jnl
Int. J. Online Eng.
Yiwang Wang, Houjun Tang, Shuki Fan, Hai Chen, Rui Wang
2016 J jnl
IEEE Trans. Multim.
Wenming Yang, Yapeng Tian, Fei Zhou, Qingmin Liao, Hai Chen, Chenglin Zheng
2016 J jnl
IEEE Trans. Ind. Electron.
Rajdeep Bondade, Yi Zhang, Bingqing Wei, Taoli Gu, Hai Chen, Dongsheng Brian Ma
2016 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yanlong Bu, Wenlin Tang, Wenzhe Fa, Chibiao Ding, Geshi Tang, Yang Yang, Jianfeng Cao, Hai Chen, Hejun Yin
2015 J jnl
IEEE J. Solid State Circuits
Yi Zhang, Hai Chen, Dongsheng Ma
2015 J jnl
Signal Process. Image Commun.
Anmin Liu, Weisi Lin, Hai Chen, Philipp Zhang
2015 conf
ROBIO
Hai Chen, Yi Cao, You-lei Qin, Chun-Cheng Shan
2012 conf
VLSIC
Yi Zhang, Hai Chen, Dongsheng Ma
2012 conf
CHINACOM
Guohua Li, Hai Chen, Jinhu Chen
2011 conf
WOCC
Hai Chen, Doug Clark, Zheng Li, Marc Shelton, Rong Zhang, Guoyong Chen, Yu Wan, Jiaguan Leng
2011 C conf
ISCAS
Sandip Uprety, Hai Chen, Dongsheng Ma
2011 C conf
ISCAS
Joseph Sankman, Hai Chen, Dongsheng Ma
2010 C conf
CSCWD
Lizhen Liu, Chengli Wang, Lin Bai, Hai Chen
2010 C conf
CSCWD
Lizhen Liu, Lei Chen, Cuixia Shi, Hai Chen
2009 J jnl
NeuroImage
Chunshui Yu, Chaozhe Zhu, Yujin Zhang, Hai Chen, Wen Qin, Moli Wang, Kuncheng Li
2008 conf
ICYCS
Jie Zhou, Hai Chen, Yue Chen
2006 conf
APCCAS
Hai Chen, Xiaobo Wu, Xiaolang Yan
2006 conf
ACCV (2)
Hai Chen, Kwan-Yee Kenneth Wong, Chen Liang, Yue Chen
2006 conf
APCCAS
Danyan Zhang, Xiaobo Wu, Menglian Zhao, Hai Chen, Xiaolang Yan
2005 conf
ASP-DAC
Hai Chen, Xiaobo Wu
2003 J jnl
IEEE Trans. Commun.
Hai Chen, Richard Perry, Kevin Buckley
2003 B conf
ACM Symposium on Document Engineering
Hai Chen, Frank Wm. Tompa
2001 Misc conf
ICASSP
Hai Chen, Richard Perry, Kevin Buckley
1999 J jnl
J. Am. Medical Informatics Assoc.
Yuval Shahar, Hai Chen, Daniel P. Stites, Lawrence V. Basso, Herbert Kaizer, Darrell M. Wilson, Mark A. Musen
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"