Haifeng Li

65 papers A* 4A 8B 2C 4Misc 1Journal 24Unranked 22
YearRankTypeTitle / Venue / Authors
2026 J jnl
Biomed. Signal Process. Control.
Kaixuan Wang, Cong Xu, Wenhao Jiang, Shihang Ding, Qinglong Liu, Lin Ma, Haifeng Li
2026 A* conf
AAAI
Wenchao Liu, Hongwei Li, Zhouyang Xu, Lin Ma, Haifeng Li
2026 J jnl
Frontiers Comput. Sci.
Yuhong He, Guangyu Wang, Wenchao Liu, Lin Ma, Haifeng Li
2025 J jnl
Expert Syst. Appl.
Hongjia Zhu, Cong Xu, Lin Ma, Haifeng Li
2025 conf
BIBM
Guangyu Wang, Lin Ma, Haifeng Li
2025 conf
BIBM
Shihang Ding, Kaichen Lan, Lin Ma, Haifeng Li
2025 A* conf
ICML
Qinglong Liu, Cong Xu, Wenhao Jiang, Kaixuan Wang, Lin Ma, Haifeng Li
2024 A conf
ECAI
Wenchao Liu, Guagnyu Wang, Yuhong He, Hongjian Bo, Lin Ma, Haifeng Li
2024 J jnl
Neurocomputing
Hongjia Zhu, Cong Xu, Lin Ma, Haifeng Li
2024 J jnl
Frontiers Comput. Neurosci.
Congshan Sun, Cong Xu, Hongwei Li, Hongjian Bo, Lin Ma, Haifeng Li
2024 J jnl
IEEE Signal Process. Lett.
Congshan Sun, Hongwei Li, Cong Xu, Lin Ma, Haifeng Li
2024 A* conf
NeurIPS
Guangyu Wang, Wenchao Liu, Yuhong He, Cong Xu, Lin Ma, Haifeng Li
2024 A* conf
ACM Multimedia
Yuhong He, Wenchao Liu, Guangyu Wang, Lin Ma, Haifeng Li
2024 conf
BIBM
Wenhao Jiang, Zhiguo Lin, Kaixuan Wang, Shihang Ding, Chunying Fang, Hongjian Bo, Cong Xu, Shengkun Yu, Tianyu Wang, Yifei Gu, Tiejun Zhao, Haifeng Li
2024 A conf
ECAI
Qinglong Liu, Wenhao Jiang, Shihang Ding, Kaixuan Wang, Hongjian Bo, Cong Xu, Lin Ma, Haifeng Li
2024 conf
BIBM
Wenhao Jiang, Qinglong Liu, Kaixuan Wang, Shihang Ding, Hongjian Bo, Cong Xu, Lin Ma, Haifeng Li
2024 conf
BIBM
Shihang Ding, Kaixuan Wang, Wenhao Jiang, Cong Xu, Hongjian Bo, Lin Ma, Haifeng Li
2023 A conf
ECAI
Yuhong He, Guangyu Wang, Lin Ma, Haifeng Li
2023 J jnl
Sensors
Zihao Wang, Haifeng Li, Lin Ma
2022 conf
ICME Workshops
Hongjian Bo, Cong Xu, Boying Wu, Lin Ma, Haifeng Li
2022 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Haifeng Li, Cong Xu, Lin Ma, Hongjian Bo, David Zhang
2022 J jnl
Pattern Recognit. Lett.
Yuhong He, Zhongliang Xu, Lin Ma, Haifeng Li
2021 J jnl
Int. J. Multim. Data Eng. Manag.
Jing Chen, Haifeng Li, Lin Ma, Hongjian Bo
2021 J jnl
Algorithms
Hongjian Bo, Haifeng Li, Boying Wu, Hongwei Li, Lin Ma
2021 conf
MIPR
Hongwei Li, Hongjian Bo, Lin Ma, Lexiang Wang, Haifeng Li
2020 J jnl
Algorithms
Shang Feng, Haifeng Li, Lin Ma, Zhongliang Xu
2020 conf
MIPR
Jing Chen, Haifeng Li, Lin Ma, Hongjian Bo, Xuerong Gao
2020 conf
MIPR
Hongjian Bo, Haifeng Li, Boying Wu, Lin Ma, Hongwei Li
2020 J jnl
IEEE Access
Haifeng Li, Shang Feng, Lin Ma, Zhongliang Xu, Ruifeng Xu, Tzyy-Ping Jung
2020 J jnl
Frontiers Digit. Health
Kun Qian, Xiao Li, Haifeng Li, Shengchen Li, Wei Li, Zuoliang Ning, Shuai Yu, Limin Hou, Gang Tang, Jing Lu, Feng Li, Shufei Duan, Chengcheng Du, Yao Cheng, Yujun Wang, Lin Gan, Yoshiharu Yamamoto, Björn W. Schuller
2020 J jnl
Digit. Signal Process.
Lin Ma, Haifeng Li, Kunpeng Yu
2019 C conf
ICCC
Kang Liu, Chunying Fang, Haifeng Li, Tingpeng Li
2019 J jnl
Int. J. Mach. Learn. Cybern.
Hongjian Bo, Lin Ma, Quansheng Liu, Ruifeng Xu, Haifeng Li
2019 C conf
ICCC
Cong Xu, Haifeng Li, Hongjian Bo, Lin Ma
2019 C conf
ICCC
Chenzhi Shao, Haifeng Li, Lin Ma
2019 J jnl
Speech Commun.
Feng-Long Xie, Frank K. Soong, Haifeng Li
2018 conf
ISCSLP
Feng-Long Xie, Frank K. Soong, Xi Wang, Lei He, Haifeng Li
2018 A conf
INTERSPEECH
Wenjing Han, Huabin Ruan, Xiaomin Chen, Zhixiang Wang, Haifeng Li, Björn W. Schuller
2017 J jnl
Comput. Math. Methods Medicine
Chunying Fang, Haifeng Li, Lin Ma, Mancai Zhang
2017 conf
EMBC
Hongjian Bo, Lin Ma, Haifeng Li
2016 A conf
INTERSPEECH
Feng-Long Xie, Frank K. Soong, Haifeng Li
2016 Misc conf
ICASSP
Feng-Long Xie, Frank K. Soong, Haifeng Li
2016 J jnl
Comput. Math. Methods Medicine
Bo Yu, Lin Ma, Haifeng Li, Lun Zhao, Hongjian Bo, Xunda Wang
2016 conf
BICS
Chunying Fang, Haifeng Li, Lin Ma
2016 conf
BICS
Hongjian Bo, Haifeng Li, Lin Ma, Bo Yu
2015 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Chang Gao, Lin Ma, Haifeng Li
2015 J jnl
Neurocomputing
Haifeng Li, Chang Gao, Lin Ma, Yuezhong Song
2014 conf
ICMB
Lin Ma, Ying He, Haifeng Li, Naimin Li, David Zhang
2014 conf
ICAILP
Hongjian Bo, Haifeng Li, Lin Ma, Bo Yu
2014 conf
ICAILP
Chang Gao, Haifeng Li, Lin Ma
2014 conf
ICMB
Chunying Fang, Haifeng Li, Lin Ma, Bing Jiang
2014 conf
ISCSLP
Feng-Long Xie, Yao Qian, Frank K. Soong, Haifeng Li
2014 A conf
INTERSPEECH
Feng-Long Xie, Yao Qian, Yuchen Fan, Frank K. Soong, Haifeng Li
2013 C conf
VINCI
Haifeng Li, Dayi Yang, Yangyang Fu, Hujie Huang, Hongyuan Fang
2013 A conf
INTERSPEECH
Wenjing Han, Haifeng Li, Huabin Ruan, Lin Ma, Jiayin Sun, Björn W. Schuller
2013 conf
BICS
Chunying Fang, Haifeng Li, Lin Ma
2013 J jnl
J. Multim.
Long Zhang, Haifeng Li, Lin Ma, Jianhua Wang, Wei Zhang
2013 conf
ICIC (2)
Chunying Fang, Haifeng Li, Lin Ma, Xiaopeng Zhang
2012 B conf
ICPR
Long Zhang, Haifeng Li, Lin Ma
2012 A conf
INTERSPEECH
Long Zhang, Haifeng Li
2012 B conf
ICMI
Wenjing Han, Haifeng Li, Florian Eyben, Lin Ma, Jiayin Sun, Björn W. Schuller
2012 J jnl
J. Softw.
Bo Yu, Haifeng Li, Chunying Fang
2011 J jnl
Int. J. Knowl. Based Intell. Eng. Syst.
Jiayin Sun, Haifeng Li, Lin Ma
2010 conf
ICIMCS
Haifeng Li, Tian Zhang, Lin Ma, Jin Bao
2010 conf
ICIMCS
Song Li, Haifeng Li, Lin Ma
redb/extractors/decompiler/bninja/analysis/cfg.py
← Index redb/extractors/decompiler/bninja/analysis/cfg.py python
from binaryninja.enums import LowLevelILOperation as LLIL_OP

# Support both package and standalone imports
try:
    from . import cfg_features
except ImportError:
    from redb.extractors.decompiler.bninja.analysis import cfg_features


# ---------------------------------------------------------------------------
# Task 2.2: Build LLIL operation maps at import time using real enum values
# ---------------------------------------------------------------------------

# Prime product map: LLIL operation integer value -> small prime
cfg_features.LLIL_OP_PRIMES = {
    # SET_REG, SET_REG_SPLIT
    LLIL_OP.LLIL_SET_REG.value: 2,
    LLIL_OP.LLIL_SET_REG_SPLIT.value: 2,
    # SET_FLAG
    LLIL_OP.LLIL_SET_FLAG.value: 3,
    # LOAD
    LLIL_OP.LLIL_LOAD.value: 5,
    # STORE
    LLIL_OP.LLIL_STORE.value: 7,
    # PUSH, POP
    LLIL_OP.LLIL_PUSH.value: 11,
    LLIL_OP.LLIL_POP.value: 13,
    # CALL, TAILCALL, SYSCALL
    LLIL_OP.LLIL_CALL.value: 17,
    LLIL_OP.LLIL_TAILCALL.value: 17,
    LLIL_OP.LLIL_SYSCALL.value: 19,
    # RET, NORET
    LLIL_OP.LLIL_RET.value: 23,
    LLIL_OP.LLIL_NORET.value: 23,
    # IF, GOTO
    LLIL_OP.LLIL_IF.value: 29,
    LLIL_OP.LLIL_GOTO.value: 31,
    # ADD, SUB
    LLIL_OP.LLIL_ADD.value: 37,
    LLIL_OP.LLIL_SUB.value: 41,
    # AND, OR, XOR
    LLIL_OP.LLIL_AND.value: 43,
    LLIL_OP.LLIL_OR.value: 47,
    LLIL_OP.LLIL_XOR.value: 53,
    # LSL, LSR, ASR, ROL, ROR
    LLIL_OP.LLIL_LSL.value: 59,
    LLIL_OP.LLIL_LSR.value: 61,
    LLIL_OP.LLIL_ASR.value: 67,
    LLIL_OP.LLIL_ROL.value: 71,
    LLIL_OP.LLIL_ROR.value: 73,
    # MUL, DIVU, DIVS, MODU, MODS
    LLIL_OP.LLIL_MUL.value: 79,
    LLIL_OP.LLIL_DIVU.value: 83,
    LLIL_OP.LLIL_DIVS.value: 83,
    LLIL_OP.LLIL_MODU.value: 89,
    LLIL_OP.LLIL_MODS.value: 89,
    # NEG, NOT
    LLIL_OP.LLIL_NEG.value: 97,
    LLIL_OP.LLIL_NOT.value: 101,
    # CMP_E, CMP_NE, CMP_SLT, CMP_ULT, CMP_SLE, CMP_ULE
    # CMP_SGT, CMP_UGT, CMP_SGE, CMP_UGE
    LLIL_OP.LLIL_CMP_E.value: 103,
    LLIL_OP.LLIL_CMP_NE.value: 103,
    LLIL_OP.LLIL_CMP_SLT.value: 107,
    LLIL_OP.LLIL_CMP_ULT.value: 107,
    LLIL_OP.LLIL_CMP_SLE.value: 109,
    LLIL_OP.LLIL_CMP_ULE.value: 109,
    LLIL_OP.LLIL_CMP_SGT.value: 113,
    LLIL_OP.LLIL_CMP_UGT.value: 113,
    LLIL_OP.LLIL_CMP_SGE.value: 127,
    LLIL_OP.LLIL_CMP_UGE.value: 127,
    # NOP
    LLIL_OP.LLIL_NOP.value: 1,
    # SX, ZX, LOW_PART, BOOL_TO_INT
    LLIL_OP.LLIL_SX.value: 131,
    LLIL_OP.LLIL_ZX.value: 137,
    LLIL_OP.LLIL_LOW_PART.value: 139,
    LLIL_OP.LLIL_BOOL_TO_INT.value: 149,
    # JUMP, JUMP_TO
    LLIL_OP.LLIL_JUMP.value: 151,
    LLIL_OP.LLIL_JUMP_TO.value: 151,
}

# Category map: LLIL operation integer value -> category index
_ARITHMETIC = {
    LLIL_OP.LLIL_ADD, LLIL_OP.LLIL_ADC, LLIL_OP.LLIL_SUB, LLIL_OP.LLIL_SBB,
    LLIL_OP.LLIL_MUL, LLIL_OP.LLIL_MULU_DP, LLIL_OP.LLIL_MULS_DP,
    LLIL_OP.LLIL_DIVU, LLIL_OP.LLIL_DIVU_DP, LLIL_OP.LLIL_DIVS,
    LLIL_OP.LLIL_DIVS_DP, LLIL_OP.LLIL_MODU, LLIL_OP.LLIL_MODS,
    LLIL_OP.LLIL_NEG,
}
_LOGIC = {
    LLIL_OP.LLIL_AND, LLIL_OP.LLIL_OR, LLIL_OP.LLIL_XOR, LLIL_OP.LLIL_NOT,
    LLIL_OP.LLIL_LSL, LLIL_OP.LLIL_LSR, LLIL_OP.LLIL_ASR,
    LLIL_OP.LLIL_ROL, LLIL_OP.LLIL_RLC, LLIL_OP.LLIL_ROR, LLIL_OP.LLIL_RRC,
}
_TRANSFER = {
    LLIL_OP.LLIL_SET_REG, LLIL_OP.LLIL_SET_REG_SPLIT, LLIL_OP.LLIL_SET_FLAG,
    LLIL_OP.LLIL_GOTO, LLIL_OP.LLIL_IF, LLIL_OP.LLIL_JUMP, LLIL_OP.LLIL_JUMP_TO,
    LLIL_OP.LLIL_RET, LLIL_OP.LLIL_NORET, LLIL_OP.LLIL_PUSH, LLIL_OP.LLIL_POP,
}
_CALL = {
    LLIL_OP.LLIL_CALL, LLIL_OP.LLIL_TAILCALL, LLIL_OP.LLIL_SYSCALL,
}
_COMPARISON = {
    LLIL_OP.LLIL_CMP_E, LLIL_OP.LLIL_CMP_NE,
    LLIL_OP.LLIL_CMP_SLT, LLIL_OP.LLIL_CMP_ULT,
    LLIL_OP.LLIL_CMP_SLE, LLIL_OP.LLIL_CMP_ULE,
    LLIL_OP.LLIL_CMP_SGE, LLIL_OP.LLIL_CMP_UGE,
    LLIL_OP.LLIL_CMP_SGT, LLIL_OP.LLIL_CMP_UGT,
    LLIL_OP.LLIL_TEST_BIT, LLIL_OP.LLIL_FLAG_COND,
}
_MEMORY = {
    LLIL_OP.LLIL_LOAD, LLIL_OP.LLIL_STORE,
}

cfg_features.LLIL_OP_CATEGORIES = {}
for _op in _ARITHMETIC:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_ARITHMETIC
for _op in _LOGIC:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_LOGIC
for _op in _TRANSFER:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_TRANSFER
for _op in _CALL:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_CALL
for _op in _COMPARISON:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_COMPARISON
for _op in _MEMORY:
    cfg_features.LLIL_OP_CATEGORIES[_op.value] = cfg_features.CAT_MEMORY

# Set of CALL operation values for counting
_CALL_OPS = {op.value for op in _CALL}


# ---------------------------------------------------------------------------
# Task 2.1 + 2.3: Rewritten CFGAnalysis
# ---------------------------------------------------------------------------

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

    def extract_function_cfg(self):
        """Extract function-level CFG features as a flat dictionary."""

        if self.function is None:
            return None

        blocks = list(self.function.basic_blocks)
        if not blocks:
            return None

        n = len(blocks)

        # 1. Build index-based adjacency from Binary Ninja blocks
        addr_to_idx = {b.start: i for i, b in enumerate(blocks)}
        successors = [[] for _ in range(n)]
        predecessors = [[] for _ in range(n)]
        for i, block in enumerate(blocks):
            for edge in block.outgoing_edges:
                if edge.target is None:
                    continue
                target_idx = addr_to_idx.get(edge.target.start)
                if target_idx is not None:
                    successors[i].append(target_idx)
                    predecessors[target_idx].append(i)

        # 2. BFS order (reusable across multiple features)
        bfs = cfg_features.bfs_order(successors, n)

        # 3. Collect per-block LLIL operations (for prime product + ACFG features)
        block_llil_ops = self._collect_block_llil_ops(blocks, addr_to_idx, n)
        all_llil_ops = [op for block_ops in block_llil_ops for op in block_ops]

        # 4. Structural counts
        edge_count = sum(len(s) for s in successors)
        total_llil = sum(len(ops) for ops in block_llil_ops)
        call_count = sum(
            1 for ops in block_llil_ops for op in ops
            if op in _CALL_OPS
        )

        # 5. Compute all features
        bb_features = cfg_features.build_block_features(block_llil_ops, successors, n)

        return {
            "cfg_topology_hash": cfg_features.compute_topology_hash(successors, bfs, n),
            "block_count": n,
            "edge_count": edge_count,
            "llil_total_operations": total_llil,
            "call_count": call_count,
            "cyclomatic_complexity": edge_count - n + 2,
            "loop_count": cfg_features.count_back_edges(successors, n),
            "max_depth": cfg_features.bfs_max_depth(successors, n),
            "max_fan_out": max((len(s) for s in successors), default=0),
            "md_index_topdown": cfg_features.compute_md_index_topdown(successors, predecessors, bfs),
            "md_index_bottomup": cfg_features.compute_md_index_bottomup(successors, predecessors, n),
            "prime_product_llil": cfg_features.compute_prime_product(all_llil_ops),
            "cfg_feature_tlsh": cfg_features.compute_cfg_feature_tlsh(bb_features, bfs),
            "wl_minhash": cfg_features.compute_wl_minhash(successors, predecessors, bb_features, n),
            "bb_features": bb_features,
            "cfg_adjacency": cfg_features.pack_adjacency(successors),
        }

    def _collect_block_llil_ops(self, blocks, addr_to_idx, n):
        """
        Collect LLIL operation integers per native basic block.
        Walks the full expression tree of each instruction so that
        nested operations (e.g. ADD inside SET_REG) are captured.
        Returns list of n lists, one per block.
        """
        block_ops = [[] for _ in range(n)]

        if self.llil_function is None:
            return block_ops

        try:
            for llil_block in self.llil_function.basic_blocks:
                # Map LLIL block to native block via source_block
                if llil_block.source_block is not None:
                    native_idx = addr_to_idx.get(llil_block.source_block.start)
                    if native_idx is not None:
                        for instr in llil_block:
                            self._walk_llil_ops(instr, block_ops[native_idx])
        except Exception:
            pass  # Return empty ops — LLIL-dependent fields will be 0/null

        return block_ops

    @staticmethod
    def _walk_llil_ops(expr, ops_list):
        """Collect operation values from an LLIL expression tree iteratively."""
        stack = [expr]
        while stack:
            node = stack.pop()
            if hasattr(node, 'operation'):
                ops_list.append(node.operation.value)
            if hasattr(node, 'operands'):
                for operand in node.operands:
                    if hasattr(operand, 'operation'):
                        stack.append(operand)