Weimin Li

20 papers Journal 15Unranked 5
YearRankTypeTitle / Venue / Authors
2025 conf
KDD (2)
Huaming Du, Yujia Zheng, Baoyu Jing, Yu Zhao, Gang Kou, Guisong Liu, Tao Gu, Weimin Li, Carl Yang
2025 J jnl
Adv. Intell. Syst.
Renjie Xu, Zhanlue Liang, Dan Wang, Rui Zhang, Jiayi Li, Lingfeng Bi, Kai Zhang, Weimin Li
2024 J jnl
Database J. Biol. Databases Curation
Jianchao Duan, Peiyi Li, Aibin Shao, Xuechao Hao, Ruihao Zhou, Cheng Bi, Xingyun Liu, Weimin Li, Huadong Zhu, Guo Chen, Bairong Shen, Tao Zhu
2024 J jnl
Medical Image Anal.
Yongbei Zhu, Shuo Wang, He Yu, Weimin Li, Jie Tian
2023 J jnl
IEEE Trans. Emerg. Top. Comput. Intell.
Zhe Li, Shuo Wang, He Yu, Yongbei Zhu, Qingxia Wu, Liusu Wang, Zhangjie Wu, Yuncui Gan, Weimin Li, Bensheng Qiu, Jie Tian
2023 J jnl
CoRR
Hong-Yu Zhou, Yizhou Yu, Chengdi Wang, Shu Zhang, Yuanxu Gao, Jia Pan, Jun Shao, Guangming Lu, Kang Zhang, Weimin Li
2023 J jnl
Comput. Methods Programs Biomed.
Quan Guo, Chengdi Wang, Jixiang Guo, Hongli Bai, Xiuyuan Xu, Lan Yang, Jianyong Wang, Nan Chen, Zihuai Wang, Yuncui Gan, Lunxu Liu, Weimin Li, Zhang Yi
2022 conf
ISBI
Meili Liu, Shuo Wang, He Yu, Yongbei Zhu, Liusu Wang, Mingyu Zhang, Zhangjie Wu, Xiaohu Li, Weimin Li, Jie Tian
2022 J jnl
IEEE J. Biomed. Health Informatics
Jiangdian Song, Shih-Cheng Huang, Brendan Kelly, Guanqun Liao, Jingyun Shi, Ning Wu, Weimin Li, Zaiyi Liu, Lei Cui, Matthew P. Lungren, Michael E. Moseley, Peng Gao, Jie Tian, Kristen W. Yeom
2022 conf
ISBI
Yongbei Zhu, Liusu Wang, He Yu, Meili Liu, Mingyu Zhang, Weimin Li, Shuo Wang, Jie Tian
2022 J jnl
npj Digit. Medicine
Chengdi Wang, Jiechao Ma, Shu Zhang, Jun Shao, Yanyan Wang, Hong-Yu Zhou, Lujia Song, Jie Zheng, Yizhou Yu, Weimin Li
2022 J jnl
IEEE Trans. Medical Imaging
Feng Shi, Bojiang Chen, Qiqi Cao, Ying Wei, Qing Zhou, Rui Zhang, Yaojie Zhou, Wenjie Yang, Xiang Wang, Rongrong Fan, Fan Yang, Yanbo Chen, Weimin Li, Yaozong Gao, Dinggang Shen
2021 conf
EMBC
Liusu Wang, Shuo Wang, He Yu, Yongbei Zhu, Weimin Li, Jie Tian
2021 J jnl
Int. J. Comput. Assist. Radiol. Surg.
Jinxin Liu, Chengdi Wang, Jixiang Guo, Jun Shao, Xiuyuan Xu, Xiaoxin Liu, Hongxia Li, Weimin Li, Zhang Yi
2021 J jnl
CoRR
Hong-Yu Zhou, Chengdi Wang, Haofeng Li, Gang Wang, Shu Zhang, Weimin Li, Yizhou Yu
2021 J jnl
Medical Image Anal.
Hong-Yu Zhou, Chengdi Wang, Haofeng Li, Gang Wang, Shu Zhang, Weimin Li, Yizhou Yu
2020 J jnl
Knowl. Based Syst.
Xiuyuan Xu, Chengdi Wang, Jixiang Guo, Lan Yang, Hongli Bai, Weimin Li, Zhang Yi
2020 J jnl
Medical Image Anal.
Xiuyuan Xu, Chengdi Wang, Jixiang Guo, Yuncui Gan, Jianyong Wang, Hongli Bai, Lei Zhang, Weimin Li, Zhang Yi
2019 J jnl
J. Medical Syst.
Sihang Chen, Jixiang Guo, Chengdi Wang, Xiuyuan Xu, Zhang Yi, Weimin Li
2017 conf
Computer-Aided Diagnosis
Jiangdian Song, Yali Zang, Weimin Li, Wenzhao Zhong, Jingyun Shi, Di Dong, Mengjie Fang, Zaiyi Liu, Jie Tian
tests/unit/test_decompile_strings.py
← Index tests/unit/test_decompile_strings.py python
"""Unit tests for bninja/analysis/strings.py — StringAnalysis."""
import pytest
import math
from unittest.mock import MagicMock


# StringAnalysis has no binaryninja imports, just collections and math
from redb.extractors.decompiler.bninja.analysis.strings import StringAnalysis


# ============================================================================
# Helper mocks
# ============================================================================

class MockStringEntry:
    """Mock for a Binary Ninja string reference."""
    def __init__(self, value, raw=None, start=0, length=0, type_name="Utf8String"):
        self.value = value
        self.raw = raw if raw is not None else (value.encode("utf-8") if isinstance(value, str) else value)
        self.start = start
        self.length = length if length else len(self.raw)
        self.type = MagicMock()
        self.type.name = type_name


class MockBinaryView:
    """Mock binary view with a strings list."""
    def __init__(self, strings=None):
        self.strings = strings or []


# ============================================================================
# 6a. StringAnalysis
# ============================================================================


class TestStringAnalysisEntropy:
    def setup_method(self):
        self.sa = StringAnalysis(bv=MockBinaryView(), functions=[])

    def test_entropy_empty_string(self):
        assert self.sa.entropy("") == 0.0

    def test_entropy_single_char(self):
        assert self.sa.entropy("aaaa") == 0.0

    def test_entropy_uniform_distribution(self):
        # "abcd" -> 4 unique chars, each p=1/4, entropy = log2(4) = 2.0
        result = self.sa.entropy("abcd")
        assert result == pytest.approx(2.0)

    def test_entropy_binary_string(self):
        # "ab" -> 2 unique chars, each p=1/2, entropy = log2(2) = 1.0
        result = self.sa.entropy("ab")
        assert result == pytest.approx(1.0)


class TestStringAnalysisAnalyze:
    def test_analyze_deduplication(self):
        """Duplicate (string, encoding) pairs -> only first kept."""
        entries = [
            MockStringEntry("hello", start=100, type_name="Utf8String"),
            MockStringEntry("hello", start=200, type_name="Utf8String"),
        ]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        assert result[0]["string_offset"] == 100

    def test_analyze_sorted_by_address(self):
        """First occurrence (lowest offset) is the one kept."""
        entries = [
            MockStringEntry("world", start=500, type_name="Utf8String"),
            MockStringEntry("world", start=100, type_name="Utf8String"),
        ]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        # The analyze() sorts by start, so 100 comes first
        assert result[0]["string_offset"] == 100

    def test_analyze_empty_bv(self):
        bv = MockBinaryView(strings=[])
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert result == []

    def test_analyze_output_schema(self):
        entries = [MockStringEntry("test_string", start=0, type_name="Utf8String")]
        bv = MockBinaryView(strings=entries)
        sa = StringAnalysis(bv=bv, functions=[])
        result = sa.analyze()
        assert len(result) == 1
        r = result[0]
        required_keys = [
            "string",
            "string_raw",
            "string_encoding",
            "string_offset",
            "string_length",
            "string_raw_length",
            "string_entropy",
        ]
        for key in required_keys:
            assert key in r, f"Missing key: {key}"