Xiangyang Li

78 papers A* 19A 3B 8C 3Misc 1Journal 32Unranked 11
YearRankTypeTitle / Venue / Authors
2026 A* conf
AAAI
Zhiqiang Wang, Yichao Gao, Yanting Wang, Suyuan Liu, Haifeng Sun, Haoran Cheng, Guanquan Shi, Haohua Du, Xiangyang Li
2026 J jnl
IEEE Trans. Inf. Forensics Secur.
Ruiqi Li, Zhiqiang Wang, Jiahui Hou, Xiangyang Li, Feiyan Chen, Zhentan Feng
2026 A* conf
AAAI
Shuli Zeng, Sijia Zhang, Feng Wu, Shaojie Tang, Xiangyang Li
2025 A conf
ECAI
Peiyan Yuan, Ming Li, Chenyang Wang, Ledong An, Xiaoyan Zhao, Junna Zhang, Xiangyang Li, Huadong Ma
2025 J jnl
IEEE Internet Things J.
Xiang Cui, Yachen Mao, Qinmeng Du, Shanyue Wang, Yubo Yan, Hao Zhou, Xiangyang Li
2025 J jnl
CoRR
Shuli Zeng, Sijia Zhang, Shaoang Li, Feng Wu, Xiangyang Li
2025 J jnl
CoRR
Shuli Zeng, Mengjie Zhou, Sijia Zhang, Yixiang Hu, Feng Wu, Xiangyang Li
2025 conf
KDD (2)
Pengfei Zhou, Yunlong Liu, Junli Liang, Qi Song, Xiangyang Li
2025 A* conf
ICML
Sijia Zhang, Shuli Zeng, Shaoang Li, Feng Wu, Shaojie Tang, Xiangyang Li
2025 J jnl
IEEE Internet Things J.
Xiaoyan Zhao, Jiale Zhang, Chenyang Wang, Peiyan Yuan, Junna Zhang, Xiangyang Li
2025 A* conf
IJCAI
Xiaotian Pan, Junhao Fang, Feng Wu, Sijia Zhang, Yixiang Hu, Shaoang Li, Xiangyang Li
2025 J jnl
Mach. Learn.
Ling Zheng, Qi Song, Yihan Wang, Zhitao Wang, Xiangyang Li
2025 J jnl
ACM Trans. Sens. Networks
Haifeng Sun, Haohua Du, Xiaojing Yu, Jiahui Hou, Lan Zhang, Xiangyang Li
2025 J jnl
Neural Comput. Appl.
Fei Li, Youzhi Huang, Yanyan Wang, Zhengyi Chen, Yin Xu, Xiangyang Li
2025 A* conf
ICLR
Sijia Zhang, Shuli Zeng, Shaoang Li, Feng Wu, Xiangyang Li
2025 conf
ICC
Siyu Jing, Yunhao Yao, Haishi Du, Jinwei Fang, Jiahui Hou, Xiangyang Li
2025 J jnl
CoRR
Zeqian Ju, Dongchao Yang, Jianwei Yu, Kai Shen, Yichong Leng, Zhengtao Wang, Xu Tan, Xinyu Zhou, Tao Qin, Xiangyang Li
2025 J jnl
IEEE Internet Things J.
Xiao Li, Kaiwen Guo, Shicheng Zheng, Fei Shang, Chunyu He, Haohua Du, Xiangyang Li
2025 J jnl
Int. J. Mach. Learn. Cybern.
Fei Li, Yanyan Wang, Yin Xu, Shiling Wang, Junli Liang, Zhengyi Chen, Wenrui Liu, Qiangzhong Feng, Ticheng Duan, Youzhi Huang, Qi Song, Xiangyang Li
2025 J jnl
IEEE Trans. Mob. Comput.
Kaiwen Guo, Hui Tang, Tianyi Xu, Hao Zhou, Mengxia Lyu, Zhi Liu, Xiaoyan Wang, Xiangyang Li
2024 J jnl
IEEE J. Sel. Areas Commun.
Guangyu Wu, Fuhui Zhou, Kai-Kit Wong, Xiangyang Li
2024 J jnl
CoRR
Junyang Zhang, Mu Yuan, Ruiguang Zhong, Puhan Luo, Huiyou Zhan, Ningkang Zhang, Chengchen Hu, Xiangyang Li
2024 conf
MSN
Qinmeng Du, Shanyue Wang, Xiang Cui, Yachen Mao, Xiangyang Li
2024 J jnl
IEEE Internet Things J.
Xiaoyan Zhao, Jiale Zhang, Junna Zhang, Peiyan Yuan, Hu Jin, Xiangyang Li
2024 A conf
WSDM
Xiaoyu Wang, Yonghui Guo, Bin Tan, Tao Yang, Dongbo Huang, Lan Xu, Hao Zhou, Xiangyang Li
2024 A* conf
ICML
Zeqian Ju, Yuancheng Wang, Kai Shen, Xu Tan, Detai Xin, Dongchao Yang, Eric Liu, Yichong Leng, Kaitao Song, Siliang Tang, Zhizheng Wu, Tao Qin, Xiangyang Li, Wei Ye, Shikun Zhang, Jiang Bian, Lei He, Jinyu Li, Sheng Zhao
2024 B conf
IWQoS
Ruiqi Li, Jiahui Hou, Haikuo Yu, Xiangyang Li
2024 A* conf
ICLR
Yichong Leng, Zhifang Guo, Kai Shen, Zeqian Ju, Xu Tan, Eric Liu, Yufei Liu, Dongchao Yang, Leying Zhang, Kaitao Song, Lei He, Xiangyang Li, Sheng Zhao, Tao Qin, Jiang Bian
2023 conf
MSN
Junquan Fan, Jiahui Hou, Xiangyang Li
2023 J jnl
IEEE/ACM Trans. Netw.
Chi Zhang, Haisheng Tan, Haoqiang Huang, Zhenhua Han, Shaofeng H.-C. Jiang, Guopeng Li, Xiangyang Li
2023 B conf
IWQoS
Huiyou Zhan, Haisheng Tan, Huang Xu, Chi Zhang, Hongqiu Ni, Pengfei Zhang, Weihua Shan, Xiangyang Li
2023 A* conf
ICML
Shaoang Li, Lan Zhang, Yingqi Yu, Xiangyang Li
2023 J jnl
CoRR
Jiandong Liu, Lan Zhang, Chaojie Lv, Ting Yu, Nikolaos M. Freris, Xiangyang Li
2022 A* conf
NeurIPS
Yichong Leng, Zehua Chen, Junliang Guo, Haohe Liu, Jiawei Chen, Xu Tan, Danilo P. Mandic, Lei He, Xiangyang Li, Tao Qin, Sheng Zhao, Tie-Yan Liu
2022 A* conf
KDD
Xiaoyu Wang, Bin Tan, Yonghui Guo, Tao Yang, Dongbo Huang, Lan Xu, Nikolaos M. Freris, Hao Zhou, Xiangyang Li
2022 J jnl
CoRR
Mu Yuan, Lan Zhang, Fengxiang He, Xueting Tong, Miao-Hui Song, Xiangyang Li
2022 A* conf
MobiCom
Mu Yuan, Lan Zhang, Fengxiang He, Xueting Tong, Xiangyang Li
2022 J jnl
CoRR
Mu Yuan, Lan Zhang, Zimu Zheng, Yi-Nan Zhang, Xiangyang Li
2022 A* conf
INFOCOM
Chi Zhang, Haisheng Tan, Guopeng Li, Zhenhua Han, Shaofeng H.-C. Jiang, Xiangyang Li
2022 J jnl
Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.
Fei Shang, Panlong Yang, Yubo Yan, Xiangyang Li
2022 A conf
ICCAD
Mingyu Chen, Yu Zhang, Yongshang Li, Zhen Wang, Jun Li, Xiangyang Li
2022 J jnl
Inf. Manag.
Zhaoge Liu, Xiangyang Li, Xiao-han Zhu
2021 A* conf
NeurIPS
Yichong Leng, Xu Tan, Linchen Zhu, Jin Xu, Renqian Luo, Linquan Liu, Tao Qin, Xiangyang Li, Edward Lin, Tie-Yan Liu
2021 B conf
WCNC
Gang Huang, Panlong Yang, Hao Zhou, Yubo Yan, Xin He, Xiangyang Li
2021 B conf
ICPADS
Han Zheng, Yan Zhang, Lan Zhang, Hao Xia, Shaojie Bai, Guobin Shen, Tian He, Xiangyang Li
2021 J jnl
CoRR
Yichong Leng, Xu Tan, Sheng Zhao, Frank K. Soong, Xiangyang Li, Tao Qin
2021 J jnl
CoRR
Zeqian Ju, Peiling Lu, Xu Tan, Rui Wang, Chen Zhang, Songruoyao Wu, Kejun Zhang, Xiangyang Li, Tao Qin, Tie-Yan Liu
2020 conf
NaNA
Xiangyang Li
2020 J jnl
Comput. Networks
Yi Zhao, Ke Xu, Yifeng Zhong, Xiangyang Li, Ning Wang, Hui Su, Meng Shen, Ziwei Li
2020 C conf
PDCAT
Wanli Cao, Haisheng Tan, Zhenhua Han, Shuokang Han, Mingxia Li, Xiangyang Li
2020 J jnl
IEEE J. Sel. Areas Commun.
Haohua Du, Linlin Chen, Jianwei Qian, Jiahui Hou, Taeho Jung, Xiangyang Li
2019 conf
ACM TUR-C
Yang Shi, Fangyu Li, Wen-Zhan Song, Xiangyang Li, Jin Ye
2019 J jnl
IEEE/ACM Trans. Netw.
Xiangyang Li, Huiqi Liu, Lan Zhang, Zhenan Wu, Yaochen Xie, Ge Chen, Chunxiao Wan, Zhongwei Liang
2019 B conf
SMARTCOMP
José Clemente, Wenzhan Song, Maria Valero, Fangyu Li, Xiangyang Li
2019 conf
MSN
Yuanhao Feng, Panlong Yang, Ziyang Chen, Gang Huang, Yubo Yan, Xiangyang Li
2019 B conf
ICPADS
Ziyang Chen, Panlong Yang, Gang Huang, Yuanhao Feng, Haisheng Tan, Xiangyang Li
2018 A* conf
INFOCOM
Huiqi Liu, Xiangyang Li, Lan Zhang, Yaochen Xie, Zhenan Wu, Qian Dai, Ge Chen, Chunxiao Wan
2018 C conf
IPCCC
Maria Valero, Fangyu Li, Wenzhan Song, Xiangyang Li
2018 C conf
IPCCC
Shumin Cao, Xin He, Peide Zhu, Mingshi Chen, Xiangyang Li, Panlong Yang
2018 B conf
SECON
Shumin Cao, Panlong Yang, Xiangyang Li, Mingshi Chen, Peide Zhu
2017 J jnl
IEEE Trans. Intell. Transp. Syst.
Jun Zhang, Dayong Shen, Lai Tu, Fan Zhang, Chengzhong Xu, Yi Wang, Chen Tian, Xiangyang Li, Benxiong Huang, Zhengxi Li
2017 conf
BigCom
Jiaying Meng, Wenbin Shi, Haisheng Tan, Xiangyang Li
2017 A* conf
NDSS
Zhenhua Li, Weiwei Wang, Christo Wilson, Jian Chen, Chen Qian, Taeho Jung, Lan Zhang, Kebin Liu, Xiangyang Li, Yunhao Liu
2017 conf
FWC
José Clemente, Maria Valero, Javad Mohammadpour, Xiangyang Li, Wenzhan Song
2017 conf
CNS
Kun Jin, Si Fang, Chunyi Peng, Zhiyang Teng, XuFei Mao, Lan Zhang, Xiangyang Li
2017 J jnl
CoRR
Jianwei Qian, Haohua Du, Jiahui Hou, Linlin Chen, Taeho Jung, Xiangyang Li, Yu Wang, Yanbo Deng
2016 Misc conf
NSDI
Yong Cui, Shihan Xiao, Xin Wang, Zhenjie Yang, Chao Zhu, Xiangyang Li, Liu Yang, Ning Ge
2016 A* conf
MobiCom
Cihang Liu, Lan Zhang, Zongqian Liu, Kebin Liu, Xiangyang Li, Yunhao Liu
2016 A* conf
MobiCom
Haohua Du, Junze Han, Qiuyuan Huang, Xuesi Jian, Cheng Bo, Yu Wang, Hongli Xu, Xiangyang Li
2016 ed.
MSCC@MobiHoc
Xiangyang Li
2016 B conf
ICCCN
Jie Hu, Chuang Lin, Xiangyang Li
2015 A* conf
MobiCom
Lei Yang, Qiongzheng Lin, Xiangyang Li, Tianci Liu, Yunhao Liu
2014 A* conf
INFOCOM
Jing Zhao, Taeho Jung, Yu Wang, Xiangyang Li
2014 J jnl
J. Comput. Sci. Technol.
Zhiping Jiang, Wei Xi, Xiangyang Li, Shaojie Tang, Jizhong Zhao, Jinsong Han, Kun Zhao, Zhi Wang, Bo Xiao
2014 J jnl
IEEE Trans. Parallel Distributed Syst.
Xinglin Zhang, Zheng Yang, Zimu Zhou, Haibin Cai, Lei Chen, Xiangyang Li
2014 J jnl
ACM Trans. Sens. Networks
Ming Xia, Yabo Dong, Wenyuan Xu, Xiangyang Li, Dongming Lu
2014 J jnl
J. Comput. Sci. Technol.
Cheng Bo, Junze Han, Xiangyang Li, Yu Wang, Bo Xiao
2006 conf
CCNC
Wen-Zhan Song, Xiangyang Li
tests/unit/test_decompile_medium_level.py
← Index tests/unit/test_decompile_medium_level.py python
# tests/unit/test_decompile_medium_level.py
"""Unit tests (mocked BN) for bninja/analysis/medium_level.py
   and bninja/analysis/medium_level_normalization.py."""
# tests/unit/test_decompile_medium_level.py
import sys
from unittest.mock import MagicMock, patch

# Installa gli stubs BN
from tests.unit.conftest_binja_stubs import install_binja_stubs
install_binja_stubs()

# ── Definisci MockMLILInstruction PRIMA di importare il modulo ──
class MockMLILInstruction:
    def __init__(self, operation, address=0, operands=None):
        self.operation = operation
        self.address = address
        self.operands = operands or []

# ── Patcha il modulo BN in modo che isinstance() funzioni ──
sys.modules["binaryninja"].MediumLevelILInstruction = MockMLILInstruction
sys.modules["binaryninja"].SSAVariable = type("SSAVariable", (), {})
sys.modules["binaryninja"].Variable = type("Variable", (), {})
sys.modules["binaryninja"].ILIntrinsic = type("ILIntrinsic", (), {})

# Ora importa il modulo — vede già i tipi corretti
from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
    MediumLevelNormalization,
)	

class MockMLILFunction:
    def __init__(self, instructions):
        self._instructions = instructions

    @property
    def instructions(self):
        return iter(self._instructions)

    @property
    def basic_blocks(self):
        # one block containing all instructions, good enough for MinHasher
        block = MagicMock()
        block.__iter__ = lambda self_: iter([])  # not used by MediumLevelAnalysis
        return [block]


class MockFunction:
    def __init__(self, name="func", start=0x1000, mlil=None):
        self.name = name
        self.start = start
        self.mlil = mlil



class TestMediumLevelNormalization:
    def setup_method(self):
        from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
            MediumLevelNormalization,
        )
        self.norm = MediumLevelNormalization()

    def test_normalize_skeleton_single_instruction(self):
        il = MockMLILInstruction(operation=42, operands=[])
        result = self.norm.normalize_instruction_all_levels(il)
        assert result == [42]

    def test_normalize_skeleton_nested(self):
        inner = MockMLILInstruction(operation=7, operands=[])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [1, 7]

    def test_normalize_skeleton_with_list_operand(self):
        inner_a = MockMLILInstruction(operation=10, operands=[])
        inner_b = MockMLILInstruction(operation=11, operands=[])
        outer = MockMLILInstruction(operation=2, operands=[[inner_a, inner_b]])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [2, 10, 11]

    def test_normalize_skeleton_none(self):
        result = self.norm.normalize_instruction_all_levels(None)
        # collect on None should leave ops empty
        assert result == []

    def test_normalize_typed_appends_leaf_types(self):
        # operand is a plain int -> "CONST"
        il = MockMLILInstruction(operation=3, operands=[42])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [3, "CONST"]

    def test_normalize_typed_bool_before_int(self):
        # bool must be detected before int (since bool is an int subclass)
        il = MockMLILInstruction(operation=4, operands=[True])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [4, "BOOL"]

    def test_normalize_typed_float(self):
        il = MockMLILInstruction(operation=5, operands=[1.5])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [5, "FLOAT_CONST"]

    def test_normalize_typed_str(self):
        il = MockMLILInstruction(operation=6, operands=["hello"])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [6, "STR"]

    def test_normalize_typed_unknown_falls_back_to_typename(self):
        class Weird:
            pass
        il = MockMLILInstruction(operation=8, operands=[Weird()])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [8, "WEIRD"]

    def test_normalize_typed_nested_mlil(self):
        inner = MockMLILInstruction(operation=99, operands=[7])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instr_with_operands(outer)
        assert result == [1, 99, "CONST"]

    def test_normalize_typed_list_mixed(self):
        inner = MockMLILInstruction(operation=50, operands=[])
        il = MockMLILInstruction(operation=2, operands=[[inner, 99]])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [2, 50, "CONST"]


class TestMediumLevelAnalysis:
    def _make_analysis(self, instructions=None, mlil=True, start=0x1000):
        from redb.extractors.decompiler.bninja.analysis.medium_level import (
            MediumLevelAnalysis,
        )
        mlil_func = MockMLILFunction(instructions or []) if mlil else None
        func = MockFunction(name="testfunc", start=start, mlil=mlil_func)
        bv = MagicMock()
        return MediumLevelAnalysis(func, bv, MagicMock())

    def test_collect_returns_empty_when_no_mlil(self):
        a = self._make_analysis(mlil=False)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk == [] and sk_addr == [] and ty == [] and ty_addr == []

    def test_collect_skeleton_and_typed_basic(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()

        assert sk == [[1], [2]]
        assert ty == [[1], [2, "CONST"]]
        assert sk_addr == [(0, [1]), (4, [2])]
        assert ty_addr == [(0, [1]), (4, [2, "CONST"])]

    def test_collect_negative_offset_clamped_to_zero(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x900, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        _, sk_addr, _, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk_addr[0][0] == 0
        assert ty_addr[0][0] == 0

    def test_log_error_records_entry(self):
        a = self._make_analysis()
        a.log_error("boom", "fname", 0x1234, ValueError("x"), "loc")
        assert len(a.errors) == 1
        err = a.errors[0]
        assert err["function_name"] == "fname"
        assert err["function_address"] == "4660"  # hex 0x1234
        assert err["error_location"] == "loc"
        assert err["error_message"] == "boom"
        assert err["error_type"] == "ValueError"
        assert "timestamp" in err

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_returns_expected_keys(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = [1, 2, 3]

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        result, errors = a.analyze()

        expected_keys = {
            "function_address",
            "body_mlil_skeleton_vector",
            "sha256_mlil_skeleton",
            "tlsh_mlil_skeleton",
            "minhash_mlil_skeleton",
            "body_mlil_typed_vector",
            "sha256_mlil_typed",
            "tlsh_mlil_typed",
            "minhash_mlil_typed",
        }
        assert set(result.keys()) == expected_keys
        assert result["function_address"] == 0x1000
        assert result["minhash_mlil_skeleton"] == [1, 2, 3]
        assert result["minhash_mlil_typed"] == [1, 2, 3]
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_empty_mlil(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []
        a = self._make_analysis(mlil=False)
        result, errors = a.analyze()
        assert result["body_mlil_skeleton_vector"] == []
        assert result["body_mlil_typed_vector"] == []
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_sha256_differs_skeleton_vs_typed(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[42]),
            MockMLILInstruction(operation=2, address=0x1004, operands=["foo"]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[True]),
        ]
        a = self._make_analysis(instructions=instrs)
        result, _ = a.analyze()
        # skeleton ignores operand leaves, typed includes them -> different hashes
        assert result["sha256_mlil_skeleton"] != result["sha256_mlil_typed"]


class TestMinHasherMLILKinds:
    def _make_func(self, instrs):
        # MinHasher iterates basic_blocks then over each block
        block = MagicMock()
        block.__iter__ = lambda self_: iter(instrs)
        f = MagicMock()
        f.basic_blocks = [block]
        return f

    def test_mlil_skeleton_uses_medium_normalizer(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=i, operands=[]) for i in range(5)
        ]
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        result = hasher.calculateMinHash()
        # 5 instructions -> 3 trigrams -> non-empty signature
        assert result != []

    def test_typed_mlil_differs_from_skeleton(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=1, operands=[42]),
            MockMLILInstruction(operation=2, operands=["s"]),
            MockMLILInstruction(operation=3, operands=[True]),
            MockMLILInstruction(operation=4, operands=[1.5]),
        ]
        func = self._make_func(instrs)
        skel = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL).calculateMinHash()
        typed = MinHasher(seed=42, il_function=func, kind=TokenKind.TYPED_MLIL).calculateMinHash()
        # Same seed, same instructions, but typed has extra leaf tokens
        # -> hashes should generally differ
        assert skel != typed

    def test_mlil_too_few_instructions(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [MockMLILInstruction(operation=1, operands=[])] * 2
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        assert hasher.calculateMinHash() == []

    def test_unsupported_kind_raises(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import MinHasher
        func = self._make_func([])
        hasher = MinHasher(seed=42, il_function=func, kind="bogus")
        with pytest.raises(ValueError):
            hasher.calculateMinHash()