Haifeng He

12 papers A* 1A 1B 1C 1Misc 1Journal 1Unranked 5
YearRankTypeTitle / Venue / Authors
2026 J jnl
Biomed. Signal Process. Control.
Kai Wang, Di Wu, Wen Liu, Haifeng He, Huawei Chen
2023 conf
ITSC
Amir Hossein Karbasi, Mingsai Xu, Haifeng He, Steven Budisa, Hao Yang, Cancan Yang
2009
Haifeng He
2007 A conf
CGO
Haifeng He, John Trimble, Somu Perianayagam, Saumya K. Debray, Gregory R. Andrews
2007 conf
IPC
Weitao Zheng, Yong Ma, Haifeng He
2007 conf
IPC
Yong Ma, Weitao Zheng, Haifeng He
2007 conf
IPC
Mingnong Yi, Weitao Zheng, Yong Ma, Haifeng He
2007 Misc conf
EMSOFT
Haifeng He, Saumya K. Debray, Gregory R. Andrews
2005 conf
AADEBUG
Xiangyu Zhang, Haifeng He, Neelam Gupta, Rajiv Gupta
2005 A* conf
ASE
Neelam Gupta, Haifeng He, Xiangyu Zhang, Rajiv Gupta
2005 C conf
ISADS
Ying Lu, An Zhang, Haifeng He, Zhiqun Deng
2004 B conf
FASE
Haifeng He, Neelam Gupta
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