Man Zhang

114 papers A* 1A 2B 6C 4Journal 76Unranked 25
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Zengbin Wang, Xuecai Hu, Yong Wang, Feng Xiong, Man Zhang, Xiangxiang Chu
2026 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Rui Tian, Jiaxuan Zhang, Yongqiang Zhang, Man Zhang, Zian Zhang, Yin Zhang, Yongqiang Li, Wangmeng Zuo
2026 J jnl
Pattern Recognit.
Yin Zhang, Yongqiang Zhang, Zian Zhang, Man Zhang, Rui Tian, Mingli Ding, Bogdan Raducanu, Dan Liu
2026 J jnl
CoRR
Man Zhang, Tao Yue, Yihua He
2026 J jnl
IEEE Trans. Ind. Informatics
Man Zhang, Chong Lin, Bing Chen
2026 J jnl
Appl. Intell.
Man Zhang, Yongqiang Zhang, Rui Tian, Yin Zhang, Zian Zhang, Jinwei Sun
2026 J jnl
CoRR
Man Zhang, Yunyang Li, Tao Yue
2026 J jnl
Pattern Recognit.
Rui Tian, Yongqiang Zhang, Zhixiang Zhang, Man Zhang, Zian Zhang, Yin Zhang, Yongqiang Li, Wangmeng Zuo
2025 J jnl
IEEE Geosci. Remote. Sens. Lett.
Zhenhua Wu, Dayi Zhu, Yice Cao, Man Zhang, Lixia Yang
2025 J jnl
IEEE Trans. Veh. Technol.
Man Zhang, Jini Li, Yu Lai, Sha Huan, Wenli Shang
2025 J jnl
IEEE Trans. Dependable Secur. Comput.
Wenli Shang, Jiayue Lu, Zhong Cao, Lei Ding, Man Zhang, Sha Huan
2025 J jnl
CoRR
Man Zhang, Ying Li, Yang Peng, Yijia Sun, Wenxin Guo, Huiqing Hu, Shi Chen, Qingbai Zhao
2025 J jnl
Multim. Syst.
Kun Qu, Man Zhang, Yang Yang, Hao Xue, Xiang-Jun Shen
2025 J jnl
Concurr. Comput. Pract. Exp.
Man Zhang, Zheng Kou
2025 J jnl
IEEE Trans. Cybern.
Man Zhang, Chong Lin
2025 J jnl
Comput. Electron. Agric.
Ying Han, Yongsheng Si, Zhijiang He, Qian Li, Zhiruo Li, Man Zhang, Gang Liu
2025 J jnl
CoRR
Man Zhang, Yuechen Li, Tao Yue, Kai-Yuan Cai
2025 J jnl
Intell. Data Anal.
Hongwei Chen, Man Zhang, Fangrui Liu, Zexi Chen
2025 J jnl
IEEE Geosci. Remote. Sens. Lett.
Zhenhua Wu, Tengxin Wang, Yice Cao, Man Zhang, Wenjie Guo, Lixia Yang
2025 J jnl
Adv. Intell. Syst.
Man Zhang, Yongqiang Zhang, Jinwei Sun, Kai-Leung Yung, Lidong Yang
2025 B conf
PRICAI
Man Zhang, Yun Xiang, Zhi Wang, Jiajie Deng
2025 J jnl
CoRR
Sida Deng, Rubing Huang, Man Zhang, Chenhui Cui, Dave Towey, Rongcun Wang
2025 J jnl
CoRR
Man Zhang, Yuechen Li, Tao Yue, Kai-Yuan Cai
2025 conf
HCI (12)
Man Zhang, Xiaoshuang Jiang, Zhi Wang, Zhi Yang, Kuan Shen
2025 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Zian Zhang, Yongqiang Zhang, Yancheng Bai, Man Zhang, Rui Tian, Yin Zhang, Mingli Ding, Wangmeng Zuo
2025 J jnl
Earth Sci. Informatics
Tonggen Yang, Liang Huang, Bo-Hui Tang, Zhitao Fu, Zhen Zhang, Zhongxi Ge, Man Zhang, Siming Pu
2025 J jnl
Comput. Electron. Agric.
Guixin Li, Bingjin Zhou, Minjian Ni, Huiying Chen, Yiwei Liu, Yinghua Zhang, Man Zhang, Minjuan Wang
2025 J jnl
Expert Syst. J. Knowl. Eng.
Hongwei Chen, Man Zhang, Zexi Chen
2025 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Zhenhua Wu, Tengxin Wang, Yice Cao, Man Zhang, Wenjie Guo, Lixia Yang
2025 J jnl
IEEE Access
Zeqing Zhang, Xue Wang, Jiamin Shen, Man Zhang, Sen Yang, Fanchang Yang, Wei Zhao, Jia Wang
2024 J jnl
Intell. Data Anal.
Hongwei Chen, Dewei Shi, Xun Zhou, Man Zhang, Luanxuan Liu
2024 J jnl
IEEE Trans. Instrum. Meas.
Zhong Cao, Kaihong Chen, Junzuo Chen, Zhaohui Chen, Man Zhang
2024 C conf
ISPA
Man Zhang, Dongning Liu
2024 J jnl
Informatica (Slovenia)
Man Zhang, Ning Chen
2024 conf
ICAIE
Man Zhang, Xin Qiao
2024 J jnl
Appl. Math. Comput.
Man Zhang, Chong Lin, Bing Chen
2024 J jnl
Environ. Model. Softw.
Xue Li, Qi-Liang Sun, Yanfei Zhang, Jian Sha, Man Zhang
2024 J jnl
Symmetry
Meng Wang, Chen Fu, Xiaoyang Wang, Kunpeng Liu, Sheng Meng, Man Zhang, Juan Yu, Xi Xia, Yi Gao
2024 J jnl
Eng. Appl. Artif. Intell.
Si Yang, Lihua Zheng, Tingting Wu, Shi Sun, Man Zhang, Minzan Li, Minjuan Wang
2024 A* conf
AAAI
Yin Zhang, Yongqiang Zhang, Zian Zhang, Man Zhang, Rui Tian, Mingli Ding
2024 J jnl
Vis. Comput.
Junkai Huang, Rui Zheng, Youyong Cheng, Jiaqian Hu, Weijun Hu, Wenli Shang, Man Zhang, Zhong Cao
2024 J jnl
IEEE Trans. Veh. Technol.
Jiwei Huang, Man Zhang, Jiangyuan Wan, Ying Chen, Ning Zhang
2024 J jnl
Appl. Math. Comput.
Jipeng Tan, Man Zhang, Fengming Liu
2024 conf
PRCV (2)
Zhengle Wang, Ruifeng Wang, Minjuan Wang, Tianyun Lai, Man Zhang
2024 J jnl
CoRR
Zhengle Wang, Ruifeng Wang, Minjuan Wang, Tianyun Lai, Man Zhang
2024 J jnl
Concurr. Comput. Pract. Exp.
Man Zhang, Zheng Kou
2023 conf
NaNA
Jini Li, Man Zhang, Yu Lai
2023 conf
ICEIC
Man Zhang, Dong Myung Lee
2023 J jnl
Networks Heterog. Media
Lifang Pei, Man Zhang, Meng Li
2023 conf
HCI (12)
Man Zhang, Jing Wang, Danwen Ji
2023 J jnl
IEEE Geosci. Remote. Sens. Lett.
Zhenhua Wu, Jun Qian, Man Zhang, Yice Cao, Tengxin Wang, Lixia Yang
2023 J jnl
Int. J. Emerg. Technol. Learn.
Man Zhang, Xiaohui Wei
2023 conf
PCCNT
Jichao Qin, Cheng Chen, Jun Zhang, Chang Liu, Man Zhang
2023 B conf
ICPADS
Man Zhang, Chunyan An, Conghao Yang
2023 J jnl
Sensors
Sha Huan, Limei Wu, Man Zhang, Zhaoyue Wang, Chao Yang
2023 conf
CloudNet
Xiang Tang, Houlin Zhou, Man Zhang, Yuheng Zhang, Guocheng Wu, Hui Lu, Xiang Yu, Zhihong Tian
2023 J jnl
Int. J. Comput. Commun. Control
Xuemei You, Man Zhang, Yinghong Ma
2023 J jnl
Symmetry
Man Zhang, Xing Li, Qianhan Wu
2023 conf
HCI (24)
Man Zhang, Zhen Liu, Kaixin Lai
2022 conf
PDC (2)
Man Zhang, Danwen Ji, Xue'er Chen
2022 J jnl
Sensors
Man Zhang, Sha Huan, Zeya Zhao, Zhibin Wang
2022 conf
HCI (10)
Man Zhang
2022 J jnl
Sensors
Zhenhua Wu, Fafa Zhao, Man Zhang, Sha Huan, Xueli Pan, Wei Chen, Lixia Yang
2022 B conf
IWCMC
Jiajun Chen, Yin Gao, Yingjun Zhou, Zhuang Liu, Dapeng Li, Man Zhang
2022 conf
ICAIS (3)
Xiaowei Chen, HeFang Jiang, Shaocheng Wu, Tao Liu, Tong An, Zhongwei Xu, Man Zhang, Muhammad Shafiq
2022 J jnl
Remote. Sens.
Zhenhua Wu, Fafa Zhao, Man Zhang, Jun Qian, Lixia Yang
2022 C conf
ICCC
Jian Wang, Tengfei Cao, Xiaoying Wang, Man Zhang, Jianfeng Guan
2021 J jnl
IEEE Trans. Ind. Informatics
Jian Li, Daiyu Deng, Junbo Zhao, Dongsheng Cai, Weihao Hu, Man Zhang, Qi Huang
2021 J jnl
J. Comput. Phys.
Mengqing Liu, Man Zhang, Caixia Li, Fang Shen
2021 B conf
IWCMC
Yin Gao, Man Zhang, Jiajun Chen, Jiren Han, Dapeng Li, Ruitao Qiu
2021 B conf
IWCMC
Yingjun Zhou, Jiajun Chen, Man Zhang, Dapeng Li, Yin Gao
2021 conf
ITSC
Junbo Wang, Yi Yang, Miaoxin Pan, Man Zhang, Minzhao Zhu, Mengyin Fu
2021 J jnl
IEEE Access
Wei Cao, Jianying Yan, Zili Jin, Zhao Han, Han Zhang, Jinxiu Qu, Man Zhang
2021 J jnl
Mob. Inf. Syst.
Zheng Kou, Man Zhang
2021 J jnl
IEEE Access
Man Zhang, Chong Lin, Yadong Li, Bing Chen
2021 conf
ICAIIS
Man Zhang, Chengcheng Zhang, Wei Wang, Ruizhao Du, Shaohua Meng
2021 A conf
ICME
Zhuoyuan Wu, Zhenyu Zhang, Jiechong Song, Man Zhang
2021 J jnl
IEEE Trans. Ind. Informatics
Man Zhang, Imen Bahri, Xavier Mininger, Cristina Vlad, Honqin Xie, Eric Berthelot, Weihao Hu
2020 conf
SimuTools (2)
Zheng Kou, Qun Gao, Man Zhang
2020 B conf
IWCMC
Man Zhang, Lijun Zhang, Yiping Zhang
2020 J jnl
Sensors
Zhichao Meng, Man Zhang, Hongxian Wang
2020 J jnl
Multim. Tools Appl.
Cong Wang, Man Zhang, Zhixun Su, Guangle Yao
2020 J jnl
Multim. Tools Appl.
Yafei Zhang, Man Zhang, Yongxia Cui, Dongyuan Zhang
2020 J jnl
Sensors
Sha Huan, Man Zhang, Gane Dai, Huaguo Gan
2020 J jnl
Health Informatics J.
Dan Li, Jianqian Chao, Jing Kong, Gui Cao, Mengru Lv, Man Zhang
2019 conf
AIM
Yi Yang, Weifeng Wang, Zhenhui Fan, Man Zhang, Tong Liu
2019 J jnl
J. Quant. Linguistics
Man Zhang
2019 J jnl
IEEE Access
Cong Wang, Man Zhang, Zhixun Su, Guangle Yao, Yan Wang, Xiyan Sun, Xiaonan Luo
2019 J jnl
Signal Process. Image Commun.
Cong Wang, Man Zhang, Zhixun Su, Yutong Wu, Guangle Yao, Hongyan Wang
2019 conf
AHFE (15)
Man Zhang, Jiangtao Du, Yuyang Tang
2019 J jnl
J. Electronic Imaging
Cong Wang, Man Zhang, Jinshan Pan, Zhixun Su
2018 J jnl
Complex.
Dandan Tang, Man Zhang, Jiabo Xu, Xueliang Zhang, Fang Yang, Huling Li, Li Feng, Kai Wang, Yujian Zheng
2018 conf
ICNC-FSKD
Weiqing Li, Jiahua Wu, Xuesong Liu, Man Zhang, Yuanbiao Hu
2018 J jnl
Sensors
Jingyu Feng, Man Zhang, Yun Xiao, Hongzhou Yue
2017 J jnl
BMC Bioinform.
Tao Huang, Hong Mi, Cheng-Yuan Lin, Ling Zhao, Linda L. D. Zhong, Fengbin Liu, Ge Zhang, Ai-Ping Lu, Zhaoxiang Bian, Shuhai Lin, Man Zhang, Yanhong Li, Dongdong Hu, Chung-Wah Cheng
2017 conf
REV
Yu Long, Man Zhang, Weifeng Qiao
2016 conf
IGTA
Jinghuan Wei, Zhihang Li, Dong Cao, Man Zhang, Cheng Zeng
2016 J jnl
Int. J. High Perform. Comput. Netw.
Man Zhang, Zhenhua Duan, Qingshan Li, Hua Chu
2015 J jnl
IEEE Trans. Ind. Electron.
Shoujun Song, Man Zhang, Lefei Ge
2015 J jnl
IEEE Trans. Instrum. Meas.
Shoujun Song, Lefei Ge, Shaojie Ma, Man Zhang, Lusheng Wang
2015 conf
Smart Graphics
Man Zhang, Yuki Igarashi, Yoshihiro Kanamori, Jun Mitani
2015 J jnl
Intell. Autom. Soft Comput.
Y. Q. Jiang, T. Li, Man Zhang, S. Sha, Y. H. Ji
2014 conf
SIGGRAPH Posters
Man Zhang, Jun Mitani, Yoshihiro Kanamori, Yukio Fukui
2014 conf
CCECE
Man Zhang, Chunpeng Zhang, Qirong Jiang, Xiaorong Xie
2013 J jnl
Inf. Syst. J.
Man Zhang, Saonee Sarker, Suprateek Sarker
2013 J jnl
Math. Comput. Model.
Man Zhang, Minzan Li, Weizhen Wang, Chunhong Liu, Hongju Gao
2009 conf
ACIS-ICIS
Chenting Zhao, Zhenhua Duan, Man Zhang
2008 A conf
ICSOC
Man Zhang, Zhenhua Duan
2008 J jnl
J. Glob. Inf. Manag.
Man Zhang, Suprateek Sarker, Jim McCullough
2008 C conf
CSCWD
Man Zhang, Zhenhua Duan, Chenting Zhao
2008 J jnl
Inf. Syst. J.
Man Zhang, Saonee Sarker, Suprateek Sarker
2007 C conf
ICIS
Saonee Sarker, Suprateek Sarker, Man Zhang
2004 J jnl
J. Comput. Methods Sci. Eng.
Di Wu, Zhi-Ru Li, Yi-Hong Ding, Man Zhang, Zhi-Ren Zheng, Bing-Qiang Wang, Xi-Yun Hao
2004 conf
CIC
Kevin J. Parker, Man Zhang
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"