Haisen Zhang

22 papers B 1Journal 16Unranked 5
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Zihao Lin, Haisen Zhang, Peng Gao, Fei Yu, Tingting Wu, Xiaoming Xiong, Shuting Cai
2025 J jnl
Int. J. Comput. Math.
Walid Remili, Khelifa Djendel, Azedine Rahmoune, Haisen Zhang
2023 J jnl
J. Optim. Theory Appl.
Ze You, Haisen Zhang
2023 conf
RobCE
Haisen Zhang, Huang Zhang, Changshun Wang
2023 J jnl
Syst. Control. Lett.
Haisen Zhang, Xianfeng Zhang
2021 J jnl
SIAM J. Control. Optim.
Qi Lü, Haisen Zhang, Xu Zhang
2020 J jnl
IEEE Trans. Netw. Sci. Eng.
Haijun Zhang, Haisen Zhang, Keping Long, George K. Karagiannidis
2020 J jnl
CoRR
Haijun Zhang, Haisen Zhang, Keping Long, George K. Karagiannidis
2020 conf
ICC
Haisen Zhang, Haijun Zhang, Wei Liu, Keping Long, Jiangbo Dong, Victor C. M. Leung
2020 J jnl
IEEE J. Sel. Areas Commun.
Haijun Zhang, Haisen Zhang, Wei Liu, Keping Long, Jiangbo Dong, Victor C. M. Leung
2019 B conf
GLOBECOM
Haisen Zhang, Haijun Zhang, Wei Huangfu, Wei Liu, Jiangbo Dong, Keping Long, Arumugam Nallanathan
2018 J jnl
SIAM Rev.
Haisen Zhang, Xu Zhang
2018 J jnl
SIAM J. Control. Optim.
Hélène Frankowska, Haisen Zhang, Xu Zhang
2017 J jnl
SIAM J. Control. Optim.
Tianxiao Wang, Haisen Zhang
2017 J jnl
SIAM J. Control. Optim.
Haisen Zhang, Xu Zhang
2015 J jnl
SIAM J. Control. Optim.
Haisen Zhang, Xu Zhang
2014 J jnl
Int. J. Comput. Assist. Lang. Learn. Teach.
Haisen Zhang, Wei Song, Ronghuai Huang
2013 J jnl
Br. J. Educ. Technol.
Haisen Zhang
2013 J jnl
Comput. Biol. Chem.
Yongqing Zhang, Yi-Fei Pu, Haisen Zhang, Yabo Su, Lifang Zhang, Jiliu Zhou
2012 conf
ICHL
Ronghuai Huang, Haisen Zhang, YuShun Li, Junfeng Yang
2010 conf
ICHL
Haisen Zhang, Ronghuai Huang
2008 conf
ICHL
Ronghuai Huang, Ding Ma, Haisen Zhang
tests/unit/test_decompile_function_type.py
← Index tests/unit/test_decompile_function_type.py python
"""Unit tests for bninja/function_type.py."""
import sys
import pytest
from unittest.mock import MagicMock

# Install binaryninja stubs before importing
from tests.unit.conftest_binja_stubs import install_binja_stubs, SymbolType
install_binja_stubs()

from redb.extractors.decompiler.bninja.function_type import (
    FunctionType,
    FunctionTypeAnalysis,
)


# ============================================================================
# 4a. FunctionType / FunctionTypeAnalysis
# ============================================================================


class TestFunctionTypeEnum:
    def test_function_type_enum_values(self):
        assert FunctionType.USER.value == "USER"
        assert FunctionType.LIBRARY.value == "LIBRARY"
        assert FunctionType.EXTERNAL.value == "EXTERNAL"
        assert FunctionType.THUNK.value == "THUNK"
        assert FunctionType.UNKNOWN.value == "UNKNOWN"


class TestFunctionTypeAnalysis:
    def _make_function(self, symbol_type=None, is_thunk=False, raise_on_symbol=False):
        func = MagicMock()
        func.is_thunk = is_thunk
        if raise_on_symbol:
            type(func).symbol = property(lambda self: (_ for _ in ()).throw(Exception("no symbol")))
        else:
            func.symbol.type = symbol_type if symbol_type is not None else SymbolType.FunctionSymbol
        return func

    def test_user_function_type(self):
        func = self._make_function(symbol_type=SymbolType.FunctionSymbol)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.USER

    def test_external_function_type(self):
        func = self._make_function(symbol_type=SymbolType.ImportedFunctionSymbol)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.EXTERNAL

    def test_library_function_type(self):
        func = self._make_function(symbol_type=SymbolType.LibraryFunctionSymbol)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.LIBRARY

    def test_thunk_function_type(self):
        # Thunk overrides the symbol type
        func = self._make_function(
            symbol_type=SymbolType.FunctionSymbol, is_thunk=True
        )
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.THUNK

    def test_exception_returns_unknown(self):
        func = self._make_function(raise_on_symbol=True)
        analysis = FunctionTypeAnalysis(func)
        assert analysis.get_function_type() == FunctionType.UNKNOWN