Wei Miao

44 papers A* 3B 2C 2Journal 30Unranked 7
YearRankTypeTitle / Venue / Authors
2026 J jnl
Clust. Comput.
Jingjing Sun, Zhiwen Wang, Long Li, Kangkang Yang, Jingxiao Zeng, Haoxu Wang, Wei Miao
2026 A* conf
AAAI
Long Chen, Wei Miao, Xin Gao, Yunzhi Zhuge, Hongming Xu, Yaxin Li, Qi Xu
2025 J jnl
Appl. Intell.
Bohan Zhang, Pan Zhang, Zhiwen Wang, Jiaqi Lv, Wei Miao
2025 A* conf
ACM Multimedia
Wei Miao, Jiangrong Shen, Hongming Xu, Tommi Kärkkäinen, Qi Xu, Yi Xu, Fengyu Cong
2025 J jnl
Discov. Comput.
Hanyang Sun, Xiangyuan Kong, Wei Miao, Zipeng Deng, Hamo Wan, Yijia Huang, Haotian Lu, Zihan Xu, Zheming Zhang
2025 A* conf
AAAI
Wei Miao, Jiangrong Shen, Qi Xu, Timo Hämäläinen, Yi Xu, Fengyu Cong
2024 conf
ASCC
Haoxu Wang, Long Li, Zhiwen Wang, Yanrong Lu, Jingxiao Zeng, Wei Miao
2024 conf
ASCC
Bowen Mao, Zhiwen Wang, Yanrong Lu, Long Li, Jindou Zhang, Wei Miao
2024 J jnl
Multim. Syst.
Wei Miao, Lijun Wang, Huchuan Lu, Kaining Huang, Xinchu Shi, Bocong Liu
2024 conf
EITCE
Bohan Zhang, Zhiwen Wang, Wei Miao
2023 J jnl
Expert Syst. J. Knowl. Eng.
Zicheng Shan, Wei Miao
2023 J jnl
Qual. Reliab. Eng. Int.
Junhua Chen, Longmiao Chen, Linfang Qian, Guangsong Chen, Wei Miao
2023 J jnl
CoRR
Tom Tongjia Chen, Hongshan Yu, Zhengeng Yang, Ming Li, Zechuan Li, Jingwen Wang, Wei Miao, Wei Sun, Chen Chen
2023 J jnl
Inf.
Wei Miao, Kai-Chieh Lin, Chih-Fu Wu, Jie Sun, Weibo Sun, Wei Wei, Chao Gu
2023 J jnl
Syst.
Chao Gu, Shuyuan Lin, Wei Wei, Chun Yang, Jiangjie Chen, Wei Miao, Jie Sun, Yingjie Zeng
2023 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Wei Miao, Vignesh Narayanan, Jr-Shin Li
2023 J jnl
CoRR
Wei Miao, Hong Zhao, Tom Tongjia Chen, Wei Huang, Changyan Xiao
2023 J jnl
Neural Comput. Appl.
Ji-dan Huang, Guanjie Cheng, Jinghan Zhang, Wei Miao
2022 conf
AISS
Liangjuan Zhou, Wei Miao
2021 J jnl
CoRR
Wei Miao, Jr-Shin Li
2021 J jnl
Mob. Inf. Syst.
Bozuo Zhao, Rui Kong, Wei Miao
2021 J jnl
CoRR
Wei Miao, Vignesh Narayanan, Jr-Shin Li
2021 C conf
ACC
Wei Miao, Gong Cheng, Jr-Shin Li
2021 J jnl
IEEE Control. Syst. Lett.
Wei Miao, Gong Cheng, Jr-Shin Li
2021 J jnl
CoRR
Wei Miao, Gong Cheng, Jr-Shin Li
2020 C conf
ACC
Wei Miao, Jr-Shin Li
2020 conf
CSIA (1)
Wei Miao
2019 J jnl
J. Chem. Inf. Model.
Wenze Li, Wei Miao, Jingxia Cui, Chao Fang, Shunting Su, Hongzhi Li, Li Hong Hu, Yinghua Lu, Guanhua Chen
2019 J jnl
IEEE Trans. Geosci. Remote. Sens.
Yilong Zhang, Yuan Ren, Wei Miao, Zhenhui Lin, Hao Gao, Shengcai Shi
2019 J jnl
Database J. Biol. Databases Curation
Wentao Yang, Chuanqi Jiang, Ying Zhu, Kai Chen, Guangying Wang, Dong-Xia Yuan, Wei Miao, Jie Xiong
2018 J jnl
Remote. Sens.
Yilong Zhang, Wei Miao, Zhenhui Lin, Hao Gao, Shengcai Shi
2016 J jnl
Int. J. Wirel. Mob. Comput.
Wei Miao, Gongfa Li, Ying Sun, Guozhang Jiang, Jianyi Kong, Honghai Liu
2013 conf
ASICON
Wenhua Qiang, Qi Zhang, Wei Miao, Guohong Li, Hui Wang, Songlin Feng
2011 J jnl
EURASIP J. Wirel. Commun. Netw.
Xiang Chen, Wei Miao, Yunzhou Li, Shidong Zhou, Jing Wang
2009 J jnl
Sensors
Qingyu Lin, Wei Miao, Wancheng Zhang, Qiuyu Fu, Nan-Jian Wu
2009 J jnl
IEICE Trans. Commun.
Wei Miao, Xiang Chen, Ming Zhao, Shidong Zhou, Jing Wang
2009 conf
ICC
Yuanzhang Xiao, Wei Miao, Ming Zhao, Shidong Zhou, Jing Wang
2008 J jnl
IEEE J. Solid State Circuits
Wei Miao, Qingyu Lin, Wancheng Zhang, Nan-Jian Wu
2008 J jnl
IEICE Trans. Inf. Syst.
Tan Peng, Xiangming Xu, Huijuan Cui, Kun Tang, Wei Miao
2008 J jnl
IEICE Trans. Commun.
Wei Miao, Yunzhou Li, Shidong Zhou, Jing Wang, Xibin Xu
2008 B conf
WCNC
Wei Miao, Limin Xiao, Yunzhou Li, Shidong Zhou, Jing Wang
2008 J jnl
IEICE Trans. Inf. Syst.
Tan Peng, Huijuan Cui, Kun Tang, Wei Miao
2008 J jnl
IEICE Trans. Commun.
Wei Miao, Yunzhou Li, Xiang Chen, Shidong Zhou, Jing Wang
2008 B conf
WCNC
Min Huang, Wei Miao, Gang Wu, Shidong Zhou, Jing Wang
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()