Haili Ye

19 papers B 1Journal 13Unranked 5
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Noha Ghatwary, Pedro Chavarias Solano, Mohamed Ramzy Ibrahim, Adrian Krenzer, Frank Puppe, Stefano Realdon, Renato Cannizzaro, Jiacheng Wang, Liansheng Wang, Thuy Nuong Tran, Lena Maier-Hein, Amine Yamlahi, Patrick Godau, Quan He, Qiming Wan, Mariia Kokshaikyna, Mariia Dobko, Haili Ye, Heng Li, Ragu B, Antony Raj, Hanaa Nagdy, Osama E. Salem, James E. East, Dominique Lamarque, Thomas de Lange, Sharib Ali
2026 J jnl
Expert Syst. Appl.
Xiaoqing Zhang, Hanfeng Shi, Xiangyu Li, Haili Ye, Tao Xu, Yan Hu, Jiang Liu
2025 J jnl
CoRR
Xiao-Qing Zhang, Hanfeng Shi, Xiangyu Li, Haili Ye, Tao Xu, Na Li, Yan Hu, Fan Lv, Jiangfan Chen, Jiang Liu
2025 J jnl
Displays
Haili Ye, Yancheng Mo, Chen Tang, Mingqian Liao, Xiaoqing Zhang, Limeng Dai, Baihua Li, Jiang Liu
2025 J jnl
Big Data Min. Anal.
Xiaohui Chen, Jingqi Huang, Chen Tang, Haili Ye, Mingming Yang, Yan Hu, Xiaoqing Zhang, Jiang Liu
2025 J jnl
Pattern Recognit.
Haili Ye, Yuan-yuan Yang, Shunzhi Zhu, Da-Han Wang, Xu-Yao Zhang, Xin Yang, Heguang Huang
2025 J jnl
IEEE Trans. Image Process.
Haili Ye, Xiao-Qing Zhang, Yan Hu, Huazhu Fu, Jiang Liu
2024 J jnl
BMC Medical Imaging
Zhiyue Zhou, Yuxuan Jin, Haili Ye, Xiaoqing Zhang, Jiang Liu, Wenyong Zhang
2024 conf
EMBC
Haili Ye, Stephan Goerttler, Fei He
2024 J jnl
CoRR
Haili Ye, Stephan Goerttler, Fei He
2024 B conf
IJCNN
Yanlin Chen, Xiaoqing Zhang, Tianao Wang, Chen Tang, Haili Ye, Jiang Liu
2023 J jnl
Biomed. Signal Process. Control.
Hongyang Jiang, Yilin Hou, Hanpei Miao, Haili Ye, Mengdi Gao, Xiaoling Li, Richu Jin, Jiang Liu
2023 J jnl
CoRR
Haili Ye, Xiaoqing Zhang, Yan Hu, Huazhu Fu, Jiang Liu
2022 conf
ICCAI
Yi Yan, Da-Han Wang, Haili Ye, Shunzhi Zhu, Jianmin Li
2022 conf
ICCAI
Lei Gong, Da-Han Wang, Yun Wu, Haili Ye, Chenyan Zhu
2022 J jnl
CoRR
Haili Ye, Da-Han Wang
2022 conf
EndoCV@ISBI
Haili Ye, Hanpei Miao, Jiang Liu, Dahan Wang, Heng Li
2021 J jnl
CoRR
Imanol Luengo, Maria Grammatikopoulou, Rahim Mohammadi, Chris Walsh, Chinedu Innocent Nwoye, Deepak Alapatt, Nicolas Padoy, Zhen-Liang Ni, Chen-Chen Fan, Gui-Bin Bian, Zeng-Guang Hou, Heonjin Ha, Jiacheng Wang, Haojie Wang, Dong Guo, Lu Wang, Guotai Wang, Mobarakol Islam, Bharat Giddwani, Hongliang Ren, Theodoros Pissas, Claudio S. Ravasio, Martin Huber, Jeremy Birch, Joan M. Nunez Do Rio, Lyndon Da Cruz, Christos Bergeles, Hongyu Chen, Fucang Jia, Nikhil Kumar Tomar, Debesh Jha, Michael A. Riegler, Pål Halvorsen, Sophia Bano, Uddhav Vaghela, Jianyuan Hong, Haili Ye, Feihong Huang, Da-Han Wang, Danail Stoyanov
2019 conf
ICCPR
Haili Ye, Da-Han Wang, Jianmin Li, Shunzhi Zhu, Chenyan Zhu
tests/unit/test_decompile_scores.py
← Index tests/unit/test_decompile_scores.py python
"""Unit tests for bninja/analysis/scores.py — ObfuscationScores."""
import sys
import pytest
from unittest.mock import MagicMock

# Install binaryninja stubs before importing
from tests.unit.conftest_binja_stubs import (
    install_binja_stubs,
    HighLevelILOperation,
)
bn_mock = install_binja_stubs()

from redb.extractors.decompiler.bninja.analysis.scores import (
    ObfuscationScores,
    get_dominated_by,
    uses_mba,
)
import binaryninja.highlevelil as hlil_mod


# ============================================================================
# Helper: Mock HLIL instruction
# ============================================================================

class MockHLILInstruction(hlil_mod.HighLevelILInstruction):
    """Mock HLIL instruction with operation and operands."""
    def __init__(self, operation, operands=None):
        self.operation = operation
        self.operands = operands or []


class MockHLILBasicBlock:
    """Mock HLIL basic block for flattened score testing."""
    def __init__(self, incoming_edges=None, dominator_tree_children=None):
        self.incoming_edges = incoming_edges or []
        self.dominator_tree_children = dominator_tree_children or []


# ============================================================================
# 5a. ObfuscationScores
# ============================================================================


class TestFlattenedScore:
    def test_flattened_score_no_back_edges(self):
        """Linear CFG with no back edges -> score 0.0."""
        block = MockHLILBasicBlock(incoming_edges=[], dominator_tree_children=[])
        func = MagicMock()
        func.basic_blocks = [block]
        scores = ObfuscationScores(func)
        assert scores.flattened_score() == 0.0

    def test_flattened_score_with_loop(self):
        """CFG with a back edge -> score > 0.0."""
        block = MockHLILBasicBlock(dominator_tree_children=[])
        # Create a back edge: an incoming edge whose source is in the dominated set
        edge = MagicMock()
        edge.source = block  # source IS the dominator -> back edge
        block.incoming_edges = [edge]
        func = MagicMock()
        func.basic_blocks = [block]
        scores = ObfuscationScores(func)
        assert scores.flattened_score() > 0.0

    def test_flattened_score_fully_flat(self):
        """Flattened CFG: one block dominates all -> ratio close to 1.0."""
        children = [MockHLILBasicBlock() for _ in range(4)]
        root = MockHLILBasicBlock(dominator_tree_children=children)
        # Back edge from root incoming
        edge = MagicMock()
        edge.source = root
        root.incoming_edges = [edge]
        all_blocks = [root] + children
        func = MagicMock()
        func.basic_blocks = all_blocks
        scores = ObfuscationScores(func)
        assert scores.flattened_score() == pytest.approx(1.0)


class TestMBAScore:
    def test_mba_score_no_mixed_ops(self):
        """Instructions with only arithmetic -> score 0.0."""
        instr = MockHLILInstruction(HighLevelILOperation.HLIL_ADD, operands=[])
        func = MagicMock()
        func.instructions = [instr]
        scores = ObfuscationScores(func)
        assert scores.MBA_score() == 0.0

    def test_mba_score_mixed_ops(self):
        """Instructions with arithmetic + logic -> score > 0.0."""
        inner_logic = MockHLILInstruction(HighLevelILOperation.HLIL_XOR, operands=[])
        outer_arith = MockHLILInstruction(
            HighLevelILOperation.HLIL_ADD, operands=[inner_logic]
        )
        func = MagicMock()
        func.instructions = [outer_arith]
        scores = ObfuscationScores(func)
        assert scores.MBA_score() > 0.0

    def test_mba_score_all_mixed(self):
        """Every instruction has both -> score 1.0."""
        inner_logic = MockHLILInstruction(HighLevelILOperation.HLIL_NOT, operands=[])
        outer_arith = MockHLILInstruction(
            HighLevelILOperation.HLIL_SUB, operands=[inner_logic]
        )
        func = MagicMock()
        func.instructions = [outer_arith]
        scores = ObfuscationScores(func)
        assert scores.MBA_score() == 1.0


class TestGetDominatedBy:
    def test_get_dominated_by(self):
        child1 = MockHLILBasicBlock(dominator_tree_children=[])
        child2 = MockHLILBasicBlock(dominator_tree_children=[])
        root = MockHLILBasicBlock(dominator_tree_children=[child1, child2])
        result = get_dominated_by(root)
        assert root in result
        assert child1 in result
        assert child2 in result
        assert len(result) == 3


class TestUsesMBA:
    def test_uses_mba_arithmetic_only(self):
        instr = MockHLILInstruction(HighLevelILOperation.HLIL_ADD, operands=[])
        assert uses_mba(instr) is False

    def test_uses_mba_logic_only(self):
        instr = MockHLILInstruction(HighLevelILOperation.HLIL_XOR, operands=[])
        assert uses_mba(instr) is False

    def test_uses_mba_mixed(self):
        inner = MockHLILInstruction(HighLevelILOperation.HLIL_AND, operands=[])
        outer = MockHLILInstruction(HighLevelILOperation.HLIL_ADD, operands=[inner])
        assert uses_mba(outer) is True