Malcolm Davidson

40 papers C 35Journal 2Unranked 3
YearRankTypeTitle / Venue / Authors
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Stefano Perna, Francesco Longo, Simona Zoffoli, Malcolm Davidson, Lorenzo Iannini, Riccardo Lanari
2024 C conf
IGARSS
Stefano Perna, Francesco Longo, Simona Zoffoli, Malcolm Davidson, Lorenzo Iannini, Riccardo Lanari
2023 C conf
IGARSS
Daniele Petrolati, Nicolas Gebert, Dirk Geudtner, Tobias Bollian, Steve Osborne, Marco Cesa, Andrea Simonini, Malcolm Davidson, Lorenzo Iannini, Gianluigi Di Cosimo
2023 C conf
IGARSS
Ramón Torres, Dirk Geudtner, Malcolm Davidson
2023 C conf
IGARSS
Malcolm Davidson, Julia Kubanek, Lorenzo Iannini, Robert Furnell, Gianluigi Di Cosimo, Nicolas Gebert, Daniele Petrolati, Dirk Geudtner, Steve Osborne
2022 C conf
IGARSS
Stefano Perna, Francesco Longo, Simona Zoffoli, Malcolm Davidson, L. Lannini, Riccardo Lanari
2022 C conf
IGARSS
Ramón Torres, Dirk Geudtner, Malcolm Davidson, David Bibby, Ignacio Navas Traver, Ana Isabel, García Hernandez, Gregory Ladureé, Jelle Poupaert, Mario Cossu, Marie Touveneau, Stefan Graham
2022 C conf
IGARSS
Wolfgang Dierking, Lorenzo Iannini, Malcolm Davidson
2022 C conf
IGARSS
Malcolm Davidson, Lorenzo Iannini, Ramon Torres, Dirk Geudtner
2021 C conf
IGARSS
Ramón Torres, Malcolm Davidson, Dirk Geudtner, Robert Furnell
2021 C conf
IGARSS
Dirk Geudtner, Michel Tossaint, Malcolm Davidson, Ramón Torres
2021 C conf
IGARSS
Suman Singha, A. Malin Johansson, Gunnar Spreen, Stephen Howell, Shin-ichi Sobue, Malcolm Davidson
2020 C conf
IGARSS
Ramón Torres, Malcolm Davidson, Dirk Geudtner
2020 C conf
IGARSS
Wolfgang Dierking, Malcolm Davidson
2020 C conf
IGARSS
Francesco Mattia, Anna Balenzano, Francesco Paolo Lovergine, Davide Palmisano, Giuseppe Satalino, Malcolm Davidson
2019 C conf
IGARSS
Ramón Torres, Malcolm Davidson
2017 C conf
IGARSS
Klaus Scipal, Malcolm Davidson
2016 C conf
IGARSS
Yves-Louis Desnos, Malcolm Davidson, Klaus Scipal
2015 C conf
IGARSS
Freek J. van Leijen, Björn Rommen, Malcolm Davidson, Ramon F. Hanssen
2014 C conf
IGARSS
Dirk Geudtner, Ramon Torres, Paul Snoeij, Malcolm Davidson, Björn Rommen
2013 C conf
IGARSS
Michael Ludwig, Elena Daganzo-Eusebio, Malcolm Davidson
2012 C conf
IGARSS
Jørgen Dall, Anders Kusk, Steen S. Kristensen, Ulrik Nielsen, René Forsberg, Chung-Chi Lin, Nicolas Gebert, Tânia Casal, Malcolm Davidson, David Bekaert, Christopher Buck
2012 C conf
IGARSS
Desmond Power, Malcolm Davidson, Nick Walker, Chris Williams, Bruce Ramsay, Kim C. Partington, David G. Barber, Matt Arkett, Roger de Abreu, Klaus Scipal
2012 C conf
IGARSS
Giuseppe Satalino, Anna Balenzano, Francesco Mattia, Malcolm Davidson
2012 C conf
IGARSS
Thuy Le Toan, Lars M. H. Ulander, Kostas Papathanassiou, Fabio Rocca, Shaun Quegan, Malcolm Davidson, Klaus Scipal
2012 C conf
IGARSS
Ramon Torres, Paul Snoeij, Malcolm Davidson, David Bibby, Svein Lokas
2011 C conf
IGARSS
Juha Lemmetyinen, Jouni Pulliainen, Ali Nadir Arslan, Anna Kontu, Kimmo Rautiainen, Juho Vehvilainen, Andreas Wiesmann, Thomas Nagler, Helmut Rott, Malcolm Davidson, Dirk Schuettemeyer, Michael Kern
2011 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Henning Skriver, Francesco Mattia, Giuseppe Satalino, Anna Balenzano, Valentijn R. N. Pauwels, Niko E. C. Verhoest, Malcolm Davidson
2011 conf
SAR
Paul Snoeij, Mike Brown, Malcolm Davidson, Björn Rommen, Nicolas Floury, Dirk Geudtner, Ramon Torres
2010 C conf
IGARSS
Marco Arcioni, Paolo Bensi, Jean-Loup Bézy, Bernardo Carnicero Domínguez, Malcolm Davidson, Mark Drinkwater, Franco Fois, Antonio Gabriele, Roger Haagmans, Florence Hélière, Paul Ingmann, Ville Kangas, Michael Kern, Stefan Kraft, Joerg Langen, Arnaud Lecuyot, Ching-Chi Lin, Roland Meynart, Klaus Scipal, Pierluigi Silvestrin
2010 C conf
IGARSS
Jouni Pulliainen, Juha Lemmetyinen, Anna Kontu, Ali Nadir Arslan, Andreas Wiesmann, Thomas Nagler, Helmut Rott, Malcolm Davidson, Dirk Schuettemeyer, Michael Kern
2010 C conf
IGARSS
Pascale Dubois-Fernandez, Hélène Oriot, Colette Coulombeix, Hubert Cantalloube, Olivier Ruault du Plessis, Thuy Le Toan, Sandrine Daniel, Jérôme Chave, Lilian Blanc, Malcolm Davidson, Michel Petit
2009 conf
IGARSS (1)
Evert Attema, Malcolm Davidson, Paul Snoeij, Björn Rommen, Nicolas Floury
2008 conf
IGARSS (1)
Evert Attema, Paul Snoeij, Malcolm Davidson, Nicolas Floury, Guido Levrini, Björn Rommen, Betlem Rosich
2007 C conf
IGARSS
Jean-Loup Bézy, Paolo Bensi, Chung-Chi Lin, Yannig Durand, Florence Hélière, Amanda Regan, Paul Ingmann, Joerg Langen, Michael Berger, Malcolm Davidson, Helge Rebhan
2007 C conf
IGARSS
Alexander Loew, Dirk H. Hoekman, Irena Hajnsek, Malcolm Davidson
2005 C conf
IGARSS
Irena Hajnsek, Florian Kugler, Kostas Papathanassiou, Ralf Horn, Rolf Scheiber, Alberto Moreira, Dirk H. Hoekman, Malcolm Davidson
2004 C conf
IGARSS
Constantin Mavrocordatos, Evert Attema, Malcolm Davidson, Harald Lentz, Uwe Nixdorf
2003 C conf
IGARSS
Jérôme M. B. Louis, Nicolas Floury, Malcolm Davidson, Evert Attema, Maurice Borgeaud
2002 C conf
IGARSS
Maurice Borgeaud, Malcolm Davidson, Evert Attema, Jérôme M. B. Louis, Laura Dente, Nicolas Floury, Betlem Rosich Tell
tests/unit/conftest_binja_stubs.py
← Index tests/unit/conftest_binja_stubs.py python
"""Stubs for binaryninja module so decompiler unit tests can import
without a Binary Ninja license."""

import sys
from unittest.mock import MagicMock
from enum import IntEnum


# Stub binaryninja.enums
class BranchType(IntEnum):
    UnconditionalBranch = 0
    FalseBranch = 1
    TrueBranch = 2
    CallDestination = 3
    FunctionReturn = 4
    SystemCall = 5
    IndirectBranch = 6
    ExceptionBranch = 7
    UnresolvedBranch = 8
    UserDefinedBranch = 9


class InstructionTextTokenType(IntEnum):
    TextToken = 0
    InstructionToken = 1
    RegisterToken = 2
    IntegerToken = 3
    PossibleAddressToken = 4
    BeginMemoryOperandToken = 10
    EndMemoryOperandToken = 11
    FloatingPointToken = 12
    AnnotationToken = 13
    CodeRelativeAddressToken = 14
    ArgumentNameToken = 15
    HexDumpByteValueToken = 16
    HexDumpSkippedByteToken = 17
    HexDumpInvalidByteToken = 18
    HexDumpTextToken = 19
    OpcodeToken = 20
    StringToken = 21
    CharacterConstantToken = 22
    KeywordToken = 23
    TypeNameToken = 24
    FieldNameToken = 25
    NameSpaceToken = 26
    NameSpaceSeparatorToken = 27
    TagToken = 28
    StructOffsetToken = 29
    StructOffsetByteValueToken = 30
    StructureHexDumpTextToken = 31
    GotoLabelToken = 32
    CommentToken = 33
    PossibleValueToken = 34
    PossibleValueTypeToken = 35
    ArrayIndexToken = 36
    IndentationToken = 37
    UnknownMemoryToken = 38
    EnumerationMemberToken = 39
    OperationToken = 40
    BaseStructureOffsetToken = 41
    BaseStructureSeparatorToken = 42
    BraceToken = 43
    PlainTextToken = 44
    CollapsedInformationToken = 45


class SymbolType(IntEnum):
    FunctionSymbol = 0
    ImportAddressSymbol = 1
    ImportedFunctionSymbol = 2
    DataSymbol = 3
    ImportedDataSymbol = 4
    ExternalSymbol = 5
    LibraryFunctionSymbol = 6
    SymbolicFunctionSymbol = 7
    LocalLabelSymbol = 8


class HighLevelILOperation(IntEnum):
    HLIL_NOP = 0
    HLIL_ADD = 1
    HLIL_SUB = 2
    HLIL_MUL = 3
    HLIL_DIVS = 4
    HLIL_NEG = 5
    HLIL_NOT = 6
    HLIL_AND = 7
    HLIL_OR = 8
    HLIL_XOR = 9
    HLIL_LSR = 10
    HLIL_LSL = 11
    HLIL_MODS = 12
    HLIL_IF = 13
    HLIL_GOTO = 14
    HLIL_RET = 15
    HLIL_ASSIGN = 16
    HLIL_CALL = 17
    HLIL_VAR = 18
    HLIL_CONST = 19
    HLIL_BLOCK = 20


class LowLevelILOperation(IntEnum):
    LLIL_NOP = 0
    LLIL_SET_REG = 1
    LLIL_SET_REG_SPLIT = 2
    LLIL_SET_FLAG = 3
    LLIL_LOAD = 4
    LLIL_STORE = 5
    LLIL_PUSH = 6
    LLIL_POP = 7
    LLIL_REG = 8
    LLIL_CONST = 9
    LLIL_CONST_PTR = 10
    LLIL_FLAG = 11
    LLIL_FLAG_BIT = 12
    LLIL_ADD = 13
    LLIL_ADC = 14
    LLIL_SUB = 15
    LLIL_SBB = 16
    LLIL_AND = 17
    LLIL_OR = 18
    LLIL_XOR = 19
    LLIL_LSL = 20
    LLIL_LSR = 21
    LLIL_ASR = 22
    LLIL_ROL = 23
    LLIL_RLC = 24
    LLIL_ROR = 25
    LLIL_RRC = 26
    LLIL_MUL = 27
    LLIL_MULU_DP = 28
    LLIL_MULS_DP = 29
    LLIL_DIVU = 30
    LLIL_DIVU_DP = 31
    LLIL_DIVS = 32
    LLIL_DIVS_DP = 33
    LLIL_MODU = 34
    LLIL_MODS = 35
    LLIL_NEG = 36
    LLIL_NOT = 37
    LLIL_SX = 38
    LLIL_ZX = 39
    LLIL_LOW_PART = 40
    LLIL_JUMP = 41
    LLIL_JUMP_TO = 42
    LLIL_CALL = 43
    LLIL_CALL_SSA = 44
    LLIL_RET = 45
    LLIL_NORET = 46
    LLIL_IF = 47
    LLIL_GOTO = 48
    LLIL_FLAG_COND = 49
    LLIL_CMP_E = 50
    LLIL_CMP_NE = 51
    LLIL_CMP_SLT = 52
    LLIL_CMP_ULT = 53
    LLIL_CMP_SLE = 54
    LLIL_CMP_ULE = 55
    LLIL_CMP_SGE = 56
    LLIL_CMP_UGE = 57
    LLIL_CMP_SGT = 58
    LLIL_CMP_UGT = 59
    LLIL_TEST_BIT = 60
    LLIL_BOOL_TO_INT = 61
    LLIL_TAILCALL = 62
    LLIL_SYSCALL = 63
    LLIL_BP = 64
    LLIL_TRAP = 65
    LLIL_UNDEF = 66
    LLIL_UNIMPL = 67
    LLIL_UNIMPL_MEM = 68


class AnalysisState(IntEnum):
    IdleState = 0
    DisassembleState = 1
    AnalyzeState = 2


def install_binja_stubs():
    """Install binaryninja module stubs into sys.modules.
    Call this BEFORE importing any decompiler modules.
    Idempotent — returns the existing mock if already installed.
    """
    if "binaryninja" in sys.modules and not isinstance(sys.modules["binaryninja"], MagicMock):
        return sys.modules["binaryninja"]
    if "binaryninja" in sys.modules and hasattr(sys.modules["binaryninja"], "_redb_stub"):
        return sys.modules["binaryninja"]

    # Create the main mock
    bn_mock = MagicMock()
    bn_mock._redb_stub = True

    # Wire up enums as real enums (not mocks)
    enums_mod = MagicMock()
    enums_mod.BranchType = BranchType
    enums_mod.InstructionTextTokenType = InstructionTextTokenType
    enums_mod.SymbolType = SymbolType
    enums_mod.HighLevelILOperation = HighLevelILOperation
    enums_mod.LowLevelILOperation = LowLevelILOperation
    enums_mod.AnalysisState = AnalysisState

    bn_mock.enums = enums_mod
    bn_mock.enums.BranchType = BranchType
    bn_mock.enums.InstructionTextTokenType = InstructionTextTokenType
    bn_mock.enums.SymbolType = SymbolType
    bn_mock.enums.HighLevelILOperation = HighLevelILOperation
    bn_mock.enums.LowLevelILOperation = LowLevelILOperation
    bn_mock.enums.AnalysisState = AnalysisState

    # LowLevelILOperation on the top-level module
    bn_mock.LowLevelILOperation = LowLevelILOperation
    bn_mock.LowLevelILInstruction = MagicMock

    # highlevelil sub-module
    hlil_mod = MagicMock()
    hlil_mod.HighLevelILInstruction = type("HighLevelILInstruction", (), {})
    bn_mock.highlevelil = hlil_mod

    # lowlevelil sub-module
    llil_mod = MagicMock()
    llil_mod.LowLevelILAdd = type("LowLevelILAdd", (), {})
    llil_mod.LowLevelILConst = type("LowLevelILConst", (), {})
    llil_mod.LowLevelILConstPtr = type("LowLevelILConstPtr", (), {})
    llil_mod.LowLevelILLoad = type("LowLevelILLoad", (), {})
    llil_mod.LowLevelILLsl = type("LowLevelILLsl", (), {})
    llil_mod.LowLevelILMul = type("LowLevelILMul", (), {})
    llil_mod.LowLevelILPop = type("LowLevelILPop", (), {})
    llil_mod.LowLevelILPush = type("LowLevelILPush", (), {})
    llil_mod.LowLevelILReg = type("LowLevelILReg", (), {})
    llil_mod.LowLevelILStore = type("LowLevelILStore", (), {})
    llil_mod.LowLevelILSub = type("LowLevelILSub", (), {})
    bn_mock.lowlevelil = llil_mod

    # mediumlevelil sub-module
    mlil_mod = MagicMock()
    mlil_mod.MediumLevelILConst = type("MediumLevelILConst", (), {})
    mlil_mod.MediumLevelILConstPtr = type("MediumLevelILConstPtr", (), {})
    bn_mock.mediumlevelil = mlil_mod

    sys.modules["binaryninja"] = bn_mock
    sys.modules["binaryninja.enums"] = enums_mod
    sys.modules["binaryninja.lowlevelil"] = llil_mod
    sys.modules["binaryninja.highlevelil"] = hlil_mod
    sys.modules["binaryninja.mediumlevelil"] = mlil_mod

    return bn_mock


# ============================================================================
# Mock Factories
# ============================================================================

class MockToken:
    """Mock for instruction text tokens."""
    def __init__(self, text, token_type=None):
        self.text = text
        if token_type is None:
            self.type = InstructionTextTokenType.TextToken
        else:
            self.type = token_type

    def __str__(self):
        return self.text


class MockDisassemblyLine:
    """Mock for a disassembly text line."""
    def __init__(self, tokens=None):
        self.tokens = tokens or []

    def __str__(self):
        return "".join(t.text for t in self.tokens)


class MockEdge:
    """Mock for a basic block edge."""
    def __init__(self, source=None, target=None, edge_type=None):
        self.source = source
        self.target = target
        self.type = edge_type


class MockBasicBlock:
    """Mock for a basic block."""
    def __init__(
        self,
        start=0,
        end=0,
        disassembly_text=None,
        outgoing_edges=None,
        incoming_edges=None,
        dominators=None,
        post_dominators=None,
        dominance_frontier=None,
        dominator_tree_children=None,
        instruction_count=None,
    ):
        self.start = start
        self.end = end
        self.disassembly_text = disassembly_text or []
        self.outgoing_edges = outgoing_edges or []
        self.incoming_edges = incoming_edges or []
        self.dominators = dominators if dominators is not None else [self]
        self.post_dominators = post_dominators if post_dominators is not None else [self]
        self.dominance_frontier = dominance_frontier if dominance_frontier is not None else set()
        self.dominator_tree_children = dominator_tree_children or []
        self.instruction_count = instruction_count if instruction_count is not None else len(self.disassembly_text)

    def __iter__(self):
        return iter(self.disassembly_text)


class MockFunction:
    """Mock for a Binary Ninja function."""
    def __init__(
        self,
        name="sub_1000",
        start=0x1000,
        basic_blocks=None,
        instructions=None,
        hlil=None,
        llil=None,
        mlil=None,
        symbol=None,
        is_thunk=False,
        stack_adjustment=0,
        call_sites=None,
        caller_sites=None,
        low_level_il=None,
    ):
        self.name = name
        self.start = start
        self.basic_blocks = basic_blocks or []
        self._instructions = instructions or []
        self.hlil = hlil
        self.llil = llil
        self.mlil = mlil
        self.symbol = symbol
        self.is_thunk = is_thunk
        self.stack_adjustment = stack_adjustment
        self.call_sites = call_sites or []
        self.caller_sites = caller_sites or []
        self.low_level_il = low_level_il

    @property
    def instructions(self):
        return iter(self._instructions)

    def get_basic_block_at(self, addr):
        for bb in self.basic_blocks:
            if bb.start <= addr < bb.end or bb.start == addr:
                return bb
        return self.basic_blocks[0] if self.basic_blocks else None

    def get_regs_read_by(self, addr, arch):
        return []

    def get_regs_written_by(self, addr, arch):
        return []

    def __str__(self):
        return f"uint64_t {self.name}()"


class MockBinaryView:
    """Mock for a Binary Ninja binary view."""
    def __init__(
        self,
        functions=None,
        strings=None,
        arch=None,
    ):
        self.functions = functions or []
        self.strings = strings or []
        self.arch = arch

    def get_segment_at(self, addr):
        return None

    def get_section_at(self, addr):
        return None

    def get_symbol_at(self, addr):
        return None

    def get_functions_at(self, addr):
        return []

    def get_string_at(self, addr):
        return None

    def get_data_var_at(self, addr):
        return None


class MockSymbol:
    """Mock for a Binary Ninja symbol."""
    def __init__(self, symbol_type=None, name="unknown"):
        self.type = symbol_type if symbol_type is not None else SymbolType.FunctionSymbol
        self.name = name
        self.full_name = name


class MockILInstruction:
    """Mock for an IL instruction (LLIL/HLIL)."""
    def __init__(self, operation, operands=None, address=0):
        self.operation = operation
        self.operands = operands or []
        self.address = address


class MockStringEntry:
    """Mock for a Binary Ninja string reference."""
    def __init__(self, value, raw=None, start=0, length=0, string_type=None):
        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 = string_type or MockStringType("Utf8String")


class MockStringType:
    """Mock for string type."""
    def __init__(self, name="Utf8String"):
        self.name = name