Chang Gao

82 papers A* 5A 1C 3Journal 51Unranked 22
YearRankTypeTitle / Venue / Authors
2026 J jnl
J. Comput. Inf. Sci. Eng.
Yifan Niu, Chang Gao, Chenxuan Hu, Haidong Yu
2026 J jnl
Commun. Nonlinear Sci. Numer. Simul.
Chang Gao, Ruotong Qi, Yu Xiao, Leszek Rutkowski
2026 J jnl
Biomed. Signal Process. Control.
Xinzi Xu, Yanxing Suo, Qiao Cai, Yunfang Zhang, Qinyu Chen, Chang Gao, Guoxing Wang, Yang Zhao
2026 J jnl
CoRR
Shenzhi Wang, Shixuan Liu, Jingren Zhou, Chang Gao, Xiong-Hui Chen, Binghai Wang, An Yang, Shiji Song, Bowen Yu, Gao Huang, Junyang Lin
2026 J jnl
CoRR
Binghai Wang, Yantao Liu, Yuxuan Liu, Tianyi Tang, Shenzhi Wang, Chang Gao, Chujie Zheng, Yichang Zhang, Le Yu, Shixuan Liu, Tao Gui, Qi Zhang, Xuanjing Huang, Bowen Yu, Fei Huang, Junyang Lin
2026 J jnl
CoRR
Liyuan Mao, Le Yu, Jingren Zhou, Chujie Zheng, Bowen Yu, Chang Gao, Shixuan Liu, An Yang, Weinan Zhang, Junyang Lin
2026 J jnl
Appl. Soft Comput.
Chang Gao, Chunlei Fan, Yuyao Luo
2026 J jnl
Expert Syst. Appl.
Yangyang Shen, Huali Sun, Chenxin Ma, Minfu Ma, Chang Gao
2025 J jnl
CoRR
Hanwen Dai, Chang Gao, Fang He, Congyuan Ji, Yanni Yang
2025 C conf
CSCWD
Chang Gao, Xinqiang Zhao, Xuren Wang, Le Wang, Zijing Fan, Yepeng Yao, Zhengwei Jiang
2025 J jnl
PeerJ Comput. Sci.
Yang Chen, Chang Gao, Sahin Akdag
2025 J jnl
J. Frankl. Inst.
Chang Gao, Yuzhi Huang, Yu Xiao, Leszek Rutkowski
2025 J jnl
Biomed. Signal Process. Control.
Jie Liu, Hongxiao Zhang, Junyan Chen, Ruiqing Meng, Chang Gao, Lihong Han, Yuting Song, Yang Tian, Yan Wang
2025 J jnl
CoRR
Shenzhi Wang, Le Yu, Chang Gao, Chujie Zheng, Shixuan Liu, Rui Lu, Kai Dang, Xionghui Chen, Jianxin Yang, Zhenru Zhang, Yuqiong Liu, An Yang, Andrew Zhao, Yang Yue, Shiji Song, Bowen Yu, Gao Huang, Junyang Lin
2025 J jnl
CoRR
He Du, Bowen Li, Chengxing Xie, Chang Gao, Kai Chen, Dacheng Tao
2025 J jnl
CoRR
Zhen Xu, Guorui Lu, Chang Gao, Qinyu Chen
2025 C conf
CSCWD
Chong Wang, Chang Gao, Famei He, Songheng He, Runshi Liu, Qianli Li, Wen Chen, Xuren Wang
2025 J jnl
CoRR
Chujie Zheng, Shixuan Liu, Mingze Li, Xiong-Hui Chen, Bowen Yu, Chang Gao, Kai Dang, Yuqiong Liu, Rui Men, An Yang, Jingren Zhou, Junyang Lin
2025 conf
ACL (Findings)
Chang Gao, Wenxuan Zhang, Guizhen Chen, Wai Lam
2025 A* conf
ASE
Yuhao Yang, Chijin Zhou, Runzhe Wang, Weibo Zhang, Yuheng Shen, Xiaohai Shi, Tao Ma, Chang Gao, Zhe Wang, Ying Fu, Heyuan Shi
2025 J jnl
CoRR
Yanghao Li, Rui Qian, Bowen Pan, Haotian Zhang, Haoshuo Huang, Bowen Zhang, Jialing Tong, Haoxuan You, Xianzhi Du, Zhe Gan, Hyunjik Kim, Chao Jia, Zhenbang Wang, Yinfei Yang, Mingfei Gao, Zi-Yi Dou, Wenze Hu, Chang Gao, Dongxu Li, Philipp Dufter, Zirui Wang, Guoli Yin, Zhengdong Zhang, Chen Chen, Yang Zhao, Ruoming Pang, Zhifeng Chen
2025 J jnl
CoRR
Chang Gao, Kang Zhao, Jianfei Chen, Liping Jing
2025 J jnl
Comput. Vis. Image Underst.
Chang Gao, Jiaqi Wang, Liping Jing
2025 J jnl
CoRR
Yizhuo Wu, Francesco Fioranelli, Chang Gao
2025 J jnl
CoRR
Yizhuo Wu, Ang Li, Chang Gao
2025 J jnl
CoRR
Yizhuo Wu, Francesco Fioranelli, Chang Gao
2025 conf
ACL (Findings)
Chengxing Xie, Bowen Li, Chang Gao, He Du, Wai Lam, Difan Zou, Kai Chen
2025 J jnl
CoRR
Chengxing Xie, Bowen Li, Chang Gao, He Du, Wai Lam, Difan Zou, Kai Chen
2025 J jnl
CoRR
Chang Gao, Chujie Zheng, Xionghui Chen, Kai Dang, Shixuan Liu, Bowen Yu, An Yang, Shuai Bai, Jingren Zhou, Junyang Lin
2025 J jnl
CoRR
Manno Versluis, Yizhuo Wu, Chang Gao
2025 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Chang Gao, Chenxuan Hu, Shuojie Gao, Haidong Yu
2024 J jnl
CoRR
Chang Gao, Jianfei Chen, Kang Zhao, Jiaqi Wang, Liping Jing
2024 J jnl
Eng. Appl. Artif. Intell.
Chang Gao, Lu Zhang, Haiying Zhang, Yu Xiao
2024 J jnl
Commun. Nonlinear Sci. Numer. Simul.
Chang Gao, Hao Gu, Yu Xiao, Beibei Guo
2024 J jnl
Syst. Control. Lett.
Chang Gao, Junchen Bao, Haiying Zhang, Yu Xiao
2024 J jnl
Neurocomputing
Chang Gao, Beibei Guo, Yu Xiao, Junchen Bao
2024 J jnl
CoRR
Kang Zhao, Tao Yuan, Han Bao, Zhenfeng Su, Chang Gao, Zhaofeng Sun, Zichen Liang, Liping Jing, Jianfei Chen
2024 conf
ACL (Findings)
Qibing Ren, Chang Gao, Jing Shao, Junchi Yan, Xin Tan, Wai Lam, Lizhuang Ma
2024 J jnl
CoRR
Rui Xie, Zhengran Zeng, Zhuohao Yu, Chang Gao, Shikun Zhang, Wei Ye
2024 conf
ICCT
Chang Gao, Xiaonan Hui, Chongwen Huang, Zhao Wang, Xianmin Zhang, Yulin Zhou
2024 J jnl
CoRR
Qibing Ren, Chang Gao, Jing Shao, Junchi Yan, Xin Tan, Yu Qiao, Wai Lam, Lizhuang Ma
2024 conf
DASFAA (7)
Tianlong Zhang, Chang Gao, Yuxiang Zeng, Shuyuan Li, Yi Xu, Yuanyuan Zhang
2024 conf
EMNLP (System Demonstrations)
Zhuohao Yu, Chang Gao, Wenjin Yao, Yidong Wang, Zhengran Zeng, Wei Ye, Jindong Wang, Yue Zhang, Shikun Zhang
2024 J jnl
CoRR
Zhuohao Yu, Chang Gao, Wenjin Yao, Yidong Wang, Zhengran Zeng, Wei Ye, Jindong Wang, Yue Zhang, Shikun Zhang
2024 conf
ACL (1)
Zhuohao Yu, Chang Gao, Wenjin Yao, Yidong Wang, Wei Ye, Jindong Wang, Xing Xie, Yue Zhang, Shikun Zhang
2024 J jnl
CoRR
Zhuohao Yu, Chang Gao, Wenjin Yao, Yidong Wang, Wei Ye, Jindong Wang, Xing Xie, Yue Zhang, Shikun Zhang
2024 J jnl
Wirel. Networks
He Zhang, Jianxun Zhang, Rui Wang, Yazhe Huang, Mengxiao Zhang, Xuefeng Shang, Chang Gao
2024 A* conf
NeurIPS
Chang Gao, Haiyun Jiang, Deng Cai, Shuming Shi, Wai Lam
2024 J jnl
Proc. VLDB Endow.
Chang Gao, Tianlong Zhang, Yuxiang Zeng, Yi Xu, Shuyuan Li, Yuanyuan Zhang
2023 J jnl
IEEE Access
Qing Bao, Ya-Gang Wang, Chang Gao, Liangxiao Sha, Feifei Lee
2023 conf
ACL (Findings)
Chang Gao, Wenxuan Zhang, Wai Lam, Lidong Bing
2023 J jnl
CoRR
Chang Gao, Wenxuan Zhang, Wai Lam, Lidong Bing
2023 J jnl
CoRR
Chang Gao, Wenxuan Zhang, Guizhen Chen, Wai Lam
2023 A* conf
NeurIPS
Wenxuan Zhang, Mahani Aljunied, Chang Gao, Yew Ken Chia, Lidong Bing
2023 J jnl
CoRR
Wenxuan Zhang, Sharifah Mahani Aljunied, Chang Gao, Yew Ken Chia, Lidong Bing
2023 J jnl
CoRR
Chang Gao, Xi Lin, Fang He, Xindi Tang
2023 C conf
CSCWD
Xinshuai Zhu, Songheng He, Xuren Wang, Chang Gao, Yushi Wang, Peian Yang, Yuxia Fu
2023 J jnl
CoRR
Chang Gao, Haiyun Jiang, Deng Cai, Shuming Shi, Wai Lam
2022 J jnl
CoRR
Chang Gao, Shu-Fu Shih, J. Paul Finn, Xiaodong Zhong
2022 A* conf
EMNLP
Yingxiu Zhao, Yinhe Zheng, Zhiliang Tian, Chang Gao, Jian Sun, Nevin L. Zhang
2022 J jnl
CoRR
Yingxiu Zhao, Yinhe Zheng, Zhiliang Tian, Chang Gao, Bowen Yu, Haiyang Yu, Yongbin Li, Jian Sun, Nevin L. Zhang
2022 conf
ECIR (1)
Chang Gao, Wai Lam
2022 conf
SciSec
Zhiting Ling, Huamin Feng, Xiong Ding, Xuren Wang, Chang Gao, Peian Yang
2022 conf
EMNLP (Findings)
Chang Gao, Bowen Li, Wenxuan Zhang, Wai Lam, Binhua Li, Fei Huang, Luo Si, Yongbin Li
2022 J jnl
CoRR
Chang Gao, Bowen Li, Wenxuan Zhang, Wai Lam, Binhua Li, Fei Huang, Luo Si, Yongbin Li
2022 conf
ACL (2)
Chang Gao, Wenxuan Zhang, Wai Lam
2022 J jnl
CoRR
Chang Gao, Wenxuan Zhang, Wai Lam
2021 conf
TFC
Yindi Sun, Guozhong Cao, Chang Gao, Wendan Yang, Wei-Pei Han, Kang Wang
2020 conf
6GN
He Zhang, Jianxun Zhang, Rui Wang, Qianrui Peng, Xuefeng Shang, Chang Gao
2020 J jnl
Sensors
Long Zhang, Ziping Zhao, Chunmei Ma, Linlin Shan, Huazhi Sun, Lifen Jiang, Shiwen Deng, Chang Gao
2020 A conf
CIKM
Chang Gao, Chengjie Sun, Lili Shan, Lei Lin, Mingjiang Wang
2019 conf
ICMSSP
Tingting Qiao, Xu Yang, Yisong Zhai, Debao Fan, Keyan Gao, Xuemei Bai, Chang Gao, Xiaohe Lv, Hongyan Hong
2019 conf
ICIG (2)
Qing Guo, Chang Gao, Min Liu, Huaqing Wang, Hongfang Yuan
2018 conf
NCTCS
Rulin Xu, Chang Gao, Jingfei Jiang
2017 conf
iThings/GreenCom/CPSCom/SmartData
Haifang Zhou, Chang Gao, Xunyun Liu
2016 conf
RCAR
Shihui Shen, Chang Gao, Yong Zhao, Haojian Lu, Yajing Shen, Chunbao Wang, Tongyang Sun, Quanquan Liu, Qing Shi, Jianjun Long, Yulong Wang, Zhengzhi Wu, Jian Qin, Weiguang Li, Massimiliano Zecca, Atsuo Takanishi
2016 A* conf
VR
Hao Jiang, Chang Gao, Tianlu Mao, Hui Li, Zhaoqi Wang
2015 J jnl
Int. J. Pattern Recognit. Artif. Intell.
Chang Gao, Lin Ma, Haifeng Li
2015 J jnl
Neurocomputing
Haifeng Li, Chang Gao, Lin Ma, Yuezhong Song
2014 conf
ICAILP
Chang Gao, Haifeng Li, Lin Ma
2011 conf
WISM (2)
Chang Gao, Xiaoguang Hong, Zhaohui Peng, Hongda Chen
2009 conf
GCC
An Qin, Dandan Tu, Chengchun Shu, Chang Gao
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