Manfred Langen

12 papers Unranked 12
YearRankTypeTitle / Venue / Authors
2019 conf
ICE/ITMC
Manfred Langen, Sabrina Heinrich
2018 conf
MKWI
Daniel Braun, Adrian Hernandez-Mendez, Anne Faber, Manfred Langen, Florian Matthes
2017 conf
SIGDIAL Conference
Daniel Braun, Adrian Hernandez-Mendez, Florian Matthes, Manfred Langen
2017 conf
CBI (2)
Adrian Hernandez-Mendez, Daniel Braun, Florian Matthes, Manfred Langen
2016 conf
ICE/ITMC
Manfred Langen
2015 conf
OpenSym Companion
Manfred Langen
2011 conf
GeNeMe
Manfred Langen, Walter Christian Kammergruber, Karsten Ehms
2010 conf
CISIM
Walter Christian Kammergruber, Maximilian Viermetz, Karsten Ehms, Manfred Langen
2009 conf
GeNeMe
Walter Christian Kammergruber, Manfred Langen
2006 conf
GeNeMe
Manfred Langen, Karsten Ehms
1994 conf
IFIP Congress (1)
Katrin Braun, Joachim Grollmann, Michael Horn, Manfred Langen, Wolfgang Thulke, Walter Weigel
1992 conf
CHI Posters and Short Talks
Manfred Langen, Gerd Hornung
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