Weiping Wen

48 papers A 3B 8C 2Journal 22Unranked 9
YearRankTypeTitle / Venue / Authors
2026 J jnl
Reliab. Eng. Syst. Saf.
Jie Hu, Changhai Zhai, Weiping Wen
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Pengyu Jie, Wanquan Liu, Chenqiang Gao, Yihui Wen, Rui He, Weiping Wen, Pengcheng Li, Jintao Zhang, Deyu Meng
2025 conf
ICANN (2)
Jinsu Yang, Fen Xiao, Zexin Li, Ye Xiao, Wenhan Yao, Weiping Wen
2025 J jnl
Comput. Secur.
Hao Jiang, Kang Wang, Yujie Yang, Shan Zhong, Shuai Zhang, Chengjie Liu, Xiarun Chen, Weiping Wen
2025 conf
ICANN (3)
Wenhan Yao, Fen Xiao, Ye Xiao, Zexin Li, Xiarun Chen, Weiping Wen
2025 B conf
TrustCom
Siyang Cheng, Gaotian Liu, Rui Mei, Yilin Wang, Kejia Zhang, Kaishuo Wei, Yuqi Yu, Weiping Wen, Xiaojie Wu, Junhua Liu
2025 J jnl
CoRR
Siyang Cheng, Gaotian Liu, Rui Mei, Yilin Wang, Kejia Zhang, Kaishuo Wei, Yuqi Yu, Weiping Wen, Xiaojie Wu, Junhua Liu
2025 J jnl
IEEE Trans. Netw. Serv. Manag.
Hao Yin, Changling Zhou, Weiping Wen, Yiwei Liu
2025 J jnl
Comput. Aided Civ. Infrastructure Eng.
Chenyu Zhang, Weiping Wen, Changhai Zhai, Yuqiu Wei, Penghao Ruan
2025 J jnl
Neurocomputing
Wenhan Yao, Jiangkun Yang, Yongqiang He, Jia Liu, Weiping Wen
2025 J jnl
Adv. Eng. Informatics
Chenyu Zhang, Changhai Zhai, Weiping Wen, Penghao Ruan
2025 B conf
SMC
Zexin Li, Wenhan Yao, Ye Xiao, Jinsu Yang, Zedong Xing, Xiarun Chen, Fen Xiao, Weiping Wen
2025 A conf
INTERSPEECH
Zexin Li, Wenhan Yao, Ye Xiao, Jinsu Yang, Fen Xiao, Weiping Wen
2025 J jnl
Comput. Aided Civ. Infrastructure Eng.
Chenyu Zhang, Changhai Zhai, Weiping Wen, Guoqing Zhang
2025 B conf
IJCNN
Wenhan Yao, Fen Xiao, Xiarun Chen, Jia Liu, Yongqiang He, Weiping Wen
2025 J jnl
CoRR
Wenhan Yao, Fen Xiao, Xiarun Chen, Jia Liu, Yongqiang He, Weiping Wen
2025 B conf
IJCNN
Wenhan Yao, Fen Xiao, Xiarun Chen, Jia Liu, Yongqiang He, Weiping Wen
2025 J jnl
CoRR
Wenhan Yao, Fen Xiao, Xiarun Chen, Jia Liu, Yongqiang He, Weiping Wen
2025 J jnl
Reliab. Eng. Syst. Saf.
Jie Hu, Weiping Wen, Changhai Zhai, Shunshun Pei
2025 conf
ICANN (3)
Ye Xiao, Wenhan Yao, Zexin Li, Jinsu Yang, Yuhao Chen, Xiandang Luo, Fen Xiao, Weiping Wen
2024 J jnl
CoRR
Wenhan Yao, Zedong Xing, Bicheng Xiong, Jia Liu, Yongqiang He, Weiping Wen
2024 J jnl
CoRR
Wenhan Yao, Jiangkun Yang, Yongqiang He, Jia Liu, Weiping Wen
2024 J jnl
Comput. Secur.
Meng Wang, Yahao Zhang, Weiping Wen
2024 conf
PRICAI (4)
Zedong Xing, Bicheng Xiong, Weiping Wen
2024 B conf
ICTAI
Bicheng Xiong, Zedong Xing, Weiping Wen
2024 J jnl
Reliab. Eng. Syst. Saf.
Jie Hu, Weiping Wen, Changhai Zhai, Shunshun Pei
2024 J jnl
Comput. Aided Civ. Infrastructure Eng.
Weiping Wen, Jie Hu, Changhai Zhai, Shunshun Pei
2024 conf
CSAI
Bingtao Chang, Weiping Wen, Xiaojie Wu, Siyang Cheng, Jianchun Jiang, Rui Mei
2023 C conf
ICICS
Yeqi Fu, Yongzhi Liu, Qian Zhang, Zhou Yang, Xiarun Chen, Chenglin Xie, Weiping Wen
2022 conf
CNCERT
Rui Mei, Han-Bing Yan, Yongqiang He, Qinqin Wang, Shengqiang Zhu, Weiping Wen
2022 ed.
CNCERT
Wei Lu, Yuqing Zhang, Weiping Wen, Hanbing Yan, Chao Li
2022 ed.
CNCERT
Wei Lu, Yuqing Zhang, Weiping Wen, Hanbing Yan, Chao Li
2022 J jnl
CoRR
Chengyang Li, Tianbo Huang, Xiarun Chen, Chenglin Xie, Weiping Wen
2021 B conf
COMPSAC
Lian Yu, Ning Zhang, Weiping Wen
2021 conf
DSN Workshops
Yongzhi Liu, Xiarun Chen, Zhou Yang, Weiping Wen
2021 C conf
QRS
Lian Yu, Lei Zhang, Yuanyuan Zhang, Weiping Wen, Xuetao Du, Fei Cao
2021 B conf
TrustCom
Chenglin Xie, Yujie Guo, Shaosen Shi, Yu Sheng, Xiarun Chen, Chengyang Li, Weiping Wen
2021 J jnl
Genom. Proteom. Bioinform.
Tao Zuo, Xiaojian Wu, Weiping Wen, Ping Lan
2021 B conf
TrustCom
Xiarun Chen, Qien Li, Zhou Yang, Yongzhi Liu, Shaosen Shi, Chenglin Xie, Weiping Wen
2021 J jnl
ACM Trans. Softw. Eng. Methodol.
Bozhi Wu, Sen Chen, Cuiyun Gao, Lingling Fan, Yang Liu, Weiping Wen, Michael R. Lyu
2020 ed.
CNCERT
Wei Lu, Qiaoyan Wen, Yuqing Zhang, Bo Lang, Weiping Wen, Hanbing Yan, Chao Li, Li Ding, Ruiguang Li, Yu Zhou
2020 J jnl
CoRR
Bozhi Wu, Sen Chen, Cuiyun Gao, Lingling Fan, Yang Liu, Weiping Wen, Michael R. Lyu
2019 ed.
CNCERT
Xiaochun Yun, Weiping Wen, Bo Lang, Hanbing Yan, Li Ding, Jia Li, Yu Zhou
2018 conf
CNCERT
Jingwei Li, Bozhi Wu, Weiping Wen
2018 conf
TrustCom/BigDataSE
Judong Bao, Yongqiang He, Weiping Wen
2011 A conf
RAID
Kangjie Lu, Dabi Zou, Weiping Wen, Debin Gao
2011 A conf
ACSAC
Kangjie Lu, Dabi Zou, Weiping Wen, Debin Gao
2005 J jnl
Comput. Secur.
Sihan Qing, Weiping Wen
tests/unit/test_decompile_similarity.py
← Index tests/unit/test_decompile_similarity.py python
"""Unit tests for similarity modules:
- bninja/similarity/minhashcustom.py
- bninja/similarity/minhasher.py
"""
import numpy as np
import pytest

from redb.extractors.decompiler.bninja.similarity.minhashcustom import MinHashCustom
from redb.extractors.decompiler.bninja.analysis.low_level_normalization import LowLevelNormalization


# ============================================================================
# 2a. MinHashCustom
# ============================================================================

class TestMinHashCustomInit:
    def test_init_empty(self):
        mh = MinHashCustom()
        assert not mh.hasMinHash()
        assert mh.minhash == b""
        assert mh.minhash_int == []

    def test_init_from_signature(self):
        sig = [10, 20, 30, 40]
        mh = MinHashCustom(minhash_signature=sig)
        assert mh.hasMinHash()
        assert mh.minhash_int == sig

    def test_init_from_bytes_uint32(self):
        """Verify round-trip: ints -> bytes -> MinHashCustom -> ints."""
        sig = [100, 200, 300]
        packed = np.array(sig, dtype=np.uint32).tobytes()
        # np.frombuffer returns numpy scalars; setMinHash does % 2**32 which
        # overflows numpy uint32, so verify the raw bytes round-trip instead.
        raw_arr = np.frombuffer(packed, dtype=np.uint32)
        assert list(raw_arr) == sig

    def test_init_from_bytes_uint8(self):
        """Verify round-trip: ints -> bytes -> back."""
        sig = [10, 20, 30]
        packed = np.array(sig, dtype=np.uint8).tobytes()
        raw_arr = np.frombuffer(packed, dtype=np.uint8)
        assert list(raw_arr) == sig

    def test_init_both_raises(self):
        sig = [1, 2, 3]
        packed = np.array(sig, dtype=np.uint32).tobytes()
        with pytest.raises(ValueError, match="only one"):
            MinHashCustom(minhash_bytes=packed, minhash_signature=sig)


class TestMinHashCustomSetGet:
    def test_set_and_get_minhash(self):
        mh = MinHashCustom()
        sig = [5, 10, 15]
        mh.setMinHash(sig)
        raw = mh.getMinHash()
        assert raw == np.array(sig, dtype=np.uint32).tobytes()
        assert mh.getMinHashInt() == sig

    def test_minhash_int_truncation(self):
        mh = MinHashCustom(minhash_bits=8)
        # Values > 256 should be truncated mod 2^8
        mh.setMinHash([300, 500, 256])
        for val in mh.minhash_int:
            assert 0 <= val < 256


class TestMinHashCustomHashData:
    def test_hash_data_string(self):
        result = MinHashCustom.hashData("hello", 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_bytes(self):
        result = MinHashCustom.hashData(b"bytes", 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_list(self):
        result = MinHashCustom.hashData([1, 2, 3], 42)
        assert isinstance(result, int)
        assert 0 <= result <= 0xFFFFFFFF

    def test_hash_data_unsupported_type(self):
        with pytest.raises(NotImplementedError, match="Type not supported"):
            MinHashCustom.hashData(123, 42)

    def test_hash_data_deterministic(self):
        assert MinHashCustom.hashData("test", 7) == MinHashCustom.hashData("test", 7)


class TestMinHashCustomScore:
    def test_score_identical(self):
        sig = [1, 2, 3, 4, 5]
        mh1 = MinHashCustom(minhash_signature=sig)
        mh2 = MinHashCustom(minhash_signature=sig)
        score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert score == 100.0

    def test_score_different(self):
        mh1 = MinHashCustom(minhash_signature=[1, 2, 3, 4, 5])
        mh2 = MinHashCustom(minhash_signature=[6, 7, 8, 9, 10])
        score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert score < 100.0

    def test_score_against(self):
        sig1 = [1, 2, 3, 4, 5]
        sig2 = [1, 2, 99, 4, 5]
        mh1 = MinHashCustom(minhash_signature=sig1)
        mh2 = MinHashCustom(minhash_signature=sig2)
        instance_score = mh1.scoreAgainst(mh2)
        static_score = MinHashCustom.calculateMinHashScore(
            mh1.getMinHash(), mh2.getMinHash()
        )
        assert instance_score == static_score


class TestMinHashCustomBitModes:
    def test_8bit_mode(self):
        mh = MinHashCustom(minhash_bits=8)
        mh.setMinHash([10, 20, 30])
        raw = mh.getMinHash()
        arr = np.frombuffer(raw, dtype=np.uint8)
        assert list(arr) == [10, 20, 30]

    def test_32bit_mode(self):
        mh = MinHashCustom(minhash_bits=32)
        mh.setMinHash([10, 20, 30])
        raw = mh.getMinHash()
        arr = np.frombuffer(raw, dtype=np.uint32)
        assert list(arr) == [10, 20, 30]


# ============================================================================
# 2b. MinHasher
# ============================================================================


class MockILNode:
    """Mock IL node with operation and operands for normalization."""
    def __init__(self, operation, operands=None):
        self.operation = operation
        self.operands = operands or []


class MockLLILBasicBlock:
    """Mock LLIL basic block that yields IL instructions."""
    def __init__(self, instructions):
        self._instructions = instructions

    def __iter__(self):
        return iter(self._instructions)


class MockLLILFunction:
    """Mock LLIL function with basic blocks."""
    def __init__(self, basic_blocks):
        self.basic_blocks = basic_blocks


# Import MinHasher after we know the module can handle the import
from redb.extractors.decompiler.bninja.similarity.minhasher import (
    MinHasher,
    MINHASH_SIGNATURE_LENGTH,
    MINHASH_SIGNATURE_BITS,
)


class TestMinHasherMakeNgrams:
    def setup_method(self):
        # Create a minimal minhasher with a mock LLIL function
        empty_func = MockLLILFunction([])
        self.hasher = MinHasher(seed=42, il_function=empty_func)

    def test_make_ngrams_basic(self):
        result = self.hasher.make_ngrams(["a", "b", "c", "d"], n=3)
        assert result == [("a", "b", "c"), ("b", "c", "d")]

    def test_make_ngrams_short_input(self):
        result = self.hasher.make_ngrams(["a", "b"], n=3)
        assert result == []

    def test_make_ngrams_exact_n(self):
        result = self.hasher.make_ngrams(["a", "b", "c"], n=3)
        assert result == [("a", "b", "c")]


class TestMinHasherCalculate:
    def _make_llil_function(self, num_instructions=10):
        """Create a mock LLIL function with enough instructions."""
        instructions = [
            MockILNode(operation=i % 20) for i in range(num_instructions)
        ]
        bb = MockLLILBasicBlock(instructions)
        return MockLLILFunction([bb])

    def test_calculate_minhash_empty_function(self):
        # Function with < 3 LLIL instructions -> empty list
        func = self._make_llil_function(num_instructions=2)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        assert result == []

    def test_calculate_minhash_deterministic(self):
        func = self._make_llil_function(num_instructions=20)
        h1 = MinHasher(seed=42, il_function=func)
        h2 = MinHasher(seed=42, il_function=func)
        assert h1.calculateMinHash() == h2.calculateMinHash()

    def test_calculate_minhash_length(self):
        func = self._make_llil_function(num_instructions=20)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        assert len(result) == MINHASH_SIGNATURE_LENGTH

    def test_calculate_minhash_value_range(self):
        func = self._make_llil_function(num_instructions=20)
        hasher = MinHasher(seed=42, il_function=func)
        result = hasher.calculateMinHash()
        for val in result:
            assert 0 <= val < 2 ** MINHASH_SIGNATURE_BITS

    def test_shingle_hash_deterministic(self):
        func = self._make_llil_function(num_instructions=5)
        hasher = MinHasher(seed=42, il_function=func)
        shingle = ([1, 2], [3, 4], [5, 6])
        assert hasher.shingle_hash(shingle, 99) == hasher.shingle_hash(shingle, 99)

    def test_seed_reproducibility(self):
        func = self._make_llil_function(num_instructions=20)
        h1 = MinHasher(seed=1, il_function=func)
        h2 = MinHasher(seed=2, il_function=func)
        r1 = h1.calculateMinHash()
        r2 = h2.calculateMinHash()
        # Different seeds should (very likely) produce different results
        assert r1 != r2