Viet-Vu Vu

34 papers A 1B 1C 1Journal 10Unranked 21
YearRankTypeTitle / Venue / Authors
2024 C conf
ISPA
Yuxin You, Hong-Seng Gan, Akinobu Shimizu, Muhammad Hanif Ramlee, Hafiz Basarudin, Viet-Vu Vu
2024 J jnl
J. Intell. Inf. Syst.
Alireza Khabbazan, Ahmad Ali Abin, Viet-Vu Vu
2023 conf
ICACT
Dinh-Lam Pham, Byeongnam Yoon, Viet-Vu Vu, Joo-Chang Kim, Sang-Eun Ahn, Jeong-Hyun Chang, Hyun Yoo, Kyonghee Sun, Kyoung-Sook Kim, Kwanghoon Pio Kim
2023 conf
RIVF
Thanh-Hung Nguyen, Hong-Quan Do, Tuyen Danh Pham, Tung Trung Doan, Viet-Vu Vu
2023 conf
ICACT
Viet-Thang Vu, Thanh Quyen Bui Thi, Hong-Seng Gan, Viet-Vu Vu, Do Manh Quang, Vu Thanh Duc, Dinh-Lam Pham
2023 J jnl
Int. J. Data Warehous. Min.
Viet-Thang Vu, Thanh Quyen Bui Thi, Tien Loi Nguyen, Doan-Vinh Tran, Hong-Quan Do, Viet-Vu Vu, Sergey M. Avdoshin
2023 conf
ICACT
Viet-Vu Vu, Byeongnam Yoon, Dinh-Lam Pham, Hong-Quan Do, Hai-Minh Nguyen, Tran-Chung Dao, Thi-Hai-Yen Nguyen, Doan-Vinh Tran, Thi-Huong-Ly Nguyen, Viet-Thang Vu
2023 J jnl
KSII Trans. Internet Inf. Syst.
Huy-Hoang Dinh, Hong-Quan Do, Tung Trung Doan, Cuong Le, Ngo Xuan Bach, Tu Minh Phuong, Viet-Vu Vu
2023 conf
ICIIT
Anh Thi Lan Nguyen, Hong-Quan Do, Tung Trung Doan, Viet-Vu Vu, Cuong Le
2022 conf
ICACT
Dinh-Lam Pham, Viet-Vu Vu, Byeongnam Yoon, Kyoungsook Kim, Kwanghoon Pio Kim
2022 conf
ICACT
Hong-Quan Do, T. H.-An Nguyen, Quoc-Anh Nguyen, Trung-Hieu Nguyen, Viet-Vu Vu, Cuong Le
2022 conf
ICACT
Viet-Vu Vu, Byeongnam Yoon, Hong-Quan Do, Hai-Minh Nguyen, Tran-Chung Dao, Cong-Mau Tran, Doan-Vinh Tran, Thi-Nhuong Phi, Viet-Thang Vu, Tien-Dung Duong
2022 conf
ICACT
Viet-Vu Vu, Byeongnam Yoon, Cuong Le, Hong-Quan Do, Hai-Minh Nguyen, Chung Tran, Viet-Thang Vu, Cong-Mau Tran, Doan-Vinh Tran, Tien-Dung Duong
2022 conf
ICACT
Viet-Vu Vu, Byeongnam Yoon, Hong-Quan Do, Hai-Minh Nguyen, Tran-Chung Dao, Cong-Mau Tran, Doan-Vinh Tran
2022 conf
ICACT
Vu-Tuan Dang, Hong-Quan Do, Viet-Vu Vu, Byeongnam Yoon
2021 conf
ACOMP
Hong-Quan Do, Thi-Ha Nguyen, Viet-Vu Vu, Thi-Mai Hoang, Hai-Minh Nguyen, T. Thuy-Duong Nguyen
2021 conf
ICACT
Vu-Tuan Dang, Hong-Quan Do, Viet-Vu Vu, Byeongnam Yoon
2020 J jnl
Expert Syst. Appl.
Ahmad Ali Abin, Viet-Vu Vu
2020 conf
RIVF
Hai Vu, Van Ngoc Duong, Viet-Vu Vu
2020 J jnl
CoRR
Mahdi Dehghan, Hossein A. Rahmani, Ahmad Ali Abin, Viet-Vu Vu
2020 J jnl
Inf. Process. Manag.
Mahdi Dehghan, Hossein A. Rahmani, Ahmad Ali Abin, Viet-Vu Vu
2019 conf
ICACT
Byeongnam Yoon, Dinh-Lam Pham, Pham Hai Son, Pham Thanh Dat, Do Van Thien, Viet-Vu Vu, Hong-Quan Do, Nang-Toan Do
2019 J jnl
Intell. Data Anal.
Viet-Vu Vu, Hong-Quan Do, Vu-Tuan Dang, Nang-Toan Do
2018 J jnl
Intell. Data Anal.
Viet-Vu Vu
2018 conf
ICACT
Byeongnam Yoon, Kwanghoon Pio Kim, Dinh-Lam Pham, Pham Thanh Dat, Viet-Vu Vu, Hong-Quan Do, Nang-Toan Do
2017 J jnl
Intell. Data Anal.
Viet-Vu Vu, Nicolas Labroche
2017 conf
KSE
Viet-Vu Vu, Hong-Quan Do
2017 conf
SoICT
Viet-Vu Vu, Hong-Quan Do
2014 conf
SCIS&ISIS
Violaine Antoine, Nicolas Labroche, Viet-Vu Vu
2012 J jnl
Pattern Recognit.
Viet-Vu Vu, Nicolas Labroche, Bernadette Bouchon-Meunier
2010 conf
ICTAI (1)
Viet-Vu Vu, Nicolas Labroche, Bernadette Bouchon-Meunier
2010 B conf
ICPR
Viet-Vu Vu, Nicolas Labroche, Bernadette Bouchon-Meunier
2010 A conf
ECAI
Viet-Vu Vu, Nicolas Labroche, Bernadette Bouchon-Meunier
2009 conf
RIVF
Viet-Vu Vu, Nicolas Labroche, Bernadette Bouchon-Meunier
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