Xiangning Lin

24 papers C 1Journal 21Unranked 2
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Internet Things J.
Zheyang An, Fanrong Wei, Xiangning Lin, Chengcheng Sun
2026 J jnl
IEEE Trans. Ind. Electron.
Kaijie Wang, Xiangning Lin, Fanrong Wei, Zhengtian Li, Jingyi Gao, Hanli Weng
2026 J jnl
CoRR
Mike A. Merrill, Alexander Glenn Shaw, Nicholas Carlini, Boxuan Li, Harsh Raj, Ivan Bercovich, Lin Shi, Jeong Yeon Shin, Thomas Walshe, Estefany Kelly Buchanan, Junhong Shen, Guanghao Ye, Haowei Lin, Jason Poulos, Maoyu Wang, Marianna Nezhurina, Jenia Jitsev, Di Lu, Orfeas Menis-Mastromichalakis, Zhiwei Xu, Zizhao Chen, Yue Liu, Robert Zhang, Leon Liangyu Chen, Anurag Kashyap, Jan-Lucas Uslu, Jeffrey Li, Jianbo Wu, Minghao Yan, Song Bian, Vedang Sharma, Ke Sun, Steven Dillmann, Akshay Anand, Andrew Lanpouthakoun, Bardia Koopah, Changran Hu, Etash Kumar Guha, Gabriel H. S. Dreiman, Jiacheng Zhu, Karl Krauth, Li Zhong, Niklas Muennighoff, Robert Amanfu, Shangyin Tan, Shreyas Pimpalgaonkar, Tushar Aggarwal, Xiangning Lin, Xin Lan, Xuandong Zhao, Yiqing Liang, Yuanli Wang, Zilong Wang, Changzhi Zhou, David Heineman, Hange Liu, Harsh Trivedi, John Yang, Junhong Lin, Manish Shetty, Michael Yang, Nabil Omi, Negin Raoof, Shanda Li, Terry Yue Zhuo, Wuwei Lin, Yiwei Dai, Yuxin Wang, Wenhao Chai, Shang Zhou, Dariush Wahdany, Ziyu She, Jiaming Hu, Zhikang Dong, Yuxuan Zhu, Sasha Cui, Ahson Saiyed, Arinbjörn Kolbeinsson, Jesse Hu, Christopher Michael Rytting, Ryan Marten, Yixin Wang, Alex Dimakis, Andy Konwinski, Ludwig Schmidt
2025 J jnl
IEEE Access
Di Cheng, Qunshan Li, Yang Wang, Yanbo Huang, Zheng Yang, Tao Kang, Fanrong Wei, Xiangning Lin
2024 J jnl
IEEE Trans. Smart Grid
Yuqi Wu, Zhengtian Li, Xiangning Lin, Zhongnan Feng, Shankang Cao, Fanrong Wei
2024 J jnl
IEEE Access
Weijie He, Lanxuan Guo, Wenhao Yang, Xiangning Lin, Fanrong Wei, Samir M. Dawoud
2024 J jnl
IEEE Access
Kaijie Wang, Xiangning Lin, Fanrong Wei, Hu Wei
2024 J jnl
IEEE Trans. Smart Grid
Quan Sui, Jingyu Zhang, Le Sun, Jing J. Liang, Fanrong Wei, Xiangning Lin
2023 J jnl
IEEE Trans. Smart Grid
Zhongnan Feng, Fanrong Wei, Chuantao Wu, Quan Sui, Xiangning Lin, Zhengtian Li
2023 J jnl
IEEE Trans. Smart Grid
Quan Sui, Fanrong Wei, Chuantao Wu, Xiangning Lin, Zhengtian Li
2023 J jnl
IEEE Access
Samir M. Dawoud, F. Selim, Xiangning Lin, Alaa A. Zaky
2021 J jnl
IEEE Access
Shumin Ma, Xiangning Lin, Zhengtian Li, Neng Jin, Zirui Rong, Peifu Zhang, Haibo Xu
2021 J jnl
IEEE Access
Shumin Ma, Xiangning Lin, Zhengtian Li, Neng Jin, Zirui Rong, Peifu Zhang, Haibo Xu
2020 J jnl
IEEE Trans. Ind. Electron.
Mian Hu, Yan-Wu Wang, Xiangning Lin, Yang Shi
2020 J jnl
IEEE Trans. Smart Grid
Fanrong Wei, Zhiqiang Wan, Haibo He, Xiangning Lin, Yuanzheng Li
2020 J jnl
IEEE Trans. Smart Grid
Quan Sui, Fanrong Wei, Chuantao Wu, Xiangning Lin, Zhengtian Li
2020 C conf
IAS
Ning Tong, Kaiqi Sun, Ke-Jun Li, Xuhuan Zhu, Xiangning Lin, Zhengtian Li, Wei-Jen Lee
2020 J jnl
IEEE Access
Ting Wen, Zheyuan Zhang, Xiangning Lin, Zhengtian Li, Chong Chen, Zhixun Wang
2020 J jnl
IEEE Trans. Smart Grid
Fanrong Wei, Zhiqiang Wan, Haibo He, Xiangning Lin
2019 J jnl
IEEE Trans. Smart Grid
Fanrong Wei, Yuanzheng Li, Quan Sui, Xiangning Lin, Le Chen, Zhe Chen, Zhengtian Li
2019 J jnl
IEEE Trans. Smart Grid
Le Chen, Xiangning Lin, Zhengtian Li, Fanrong Wei, Neng Jin, Ran Lyu, Chang Liu
2017 J jnl
J. Frankl. Inst.
Yan-Wu Wang, Xiaokang Liu, Jiang-Wen Xiao, Xiangning Lin
2016 conf
SysCon
Yixin Zhuo, Chong Chen, Zhicheng Wang, Pengyi Liao, Xiangning Lin, Jingyou Xu
2016 conf
SysCon
Ning Tong, Jihan Liang, Hui Li, Xiangning Lin, Zhengtian Li
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