Nectaria Tryfona

45 papers A* 1A 3B 3C 7Journal 9Unranked 16
YearRankTypeTitle / Venue / Authors
2017 ch.
Encyclopedia of GIS
Sotiris Brakatsoulas, Dieter Pfoser, Nectaria Tryfona, Agnès Voisard
2017 ch.
Encyclopedia of GIS
Nectaria Tryfona, Christian S. Jensen
2013 conf
MobiGIS
Kostas Makedos, Nectaria Tryfona
2008 ch.
Encyclopedia of GIS
Sotiris Brakatsoulas, Dieter Pfoser, Nectaria Tryfona, Agnès Voisard
2008 conf
GIS
Dieter Pfoser, Sotiris Brakatsoulas, Petra Brosch, Martina Umlauft, Nectaria Tryfona, Giorgos Tsironis
2008 ch.
Encyclopedia of GIS
Nectaria Tryfona, Christian S. Jensen
2006 B conf
SSDBM
Dieter Pfoser, Nectaria Tryfona, Agnès Voisard
2006 J jnl
GeoInformatica
Panayotis Partsinevelos, Nectaria Tryfona
2005 B conf
ICALT
Thanasis Hadzilacos, Nectaria Tryfona
2005 J jnl
J. Data Semant.
Nectaria Tryfona, Dieter Pfoser
2005 J jnl
GeoInformatica
Dieter Pfoser, Nectaria Tryfona, Christian S. Jensen
2005 A* conf
ICDE
Sotiris Brakatsoulas, Dieter Pfoser, Nectaria Tryfona
2004 C conf
IDEAS
Sotiris Brakatsoulas, Dieter Pfoser, Nectaria Tryfona
2003 conf
Spatio-Temporal Databases: The CHOROCHRONOS Approach
Nectaria Tryfona, Rosanne Price, Christian S. Jensen
2003 conf
WISE Workshops
Dieter Pfoser, Nectaria Tryfona, Vassilios S. Verykios
2003 ed.
Spatio-Temporal Databases: The CHOROCHRONOS Approach
Manolis Koubarakis, Timos K. Sellis, Andrew U. Frank, Stéphane Grumbach, Ralf Hartmut Güting, Christian S. Jensen, Nikos A. Lorentzos, Yannis Manolopoulos, Enrico Nardelli, Barbara Pernici, Hans-Jörg Schek, Michel Scholl, Babis Theodoulidis, Nectaria Tryfona
2002 ch.
Advanced Topics in Database Research, Vol. 1
Rosanne Price, Nectaria Tryfona, Christian S. Jensen
2002 C conf
IDEAS
Anders Friis-Christensen, David Skogan, Christian S. Jensen, Gerhard Skagestein, Nectaria Tryfona
2002 conf
ACM-GIS
Dieter Pfoser, Evaggelia Pitoura, Nectaria Tryfona
2001 C conf
ADBIS
Dieter Pfoser, Nectaria Tryfona
2001 conf
HERCMA
José Ramon Rios Viqueira, Nikos A. Lorentzos, Nectaria Tryfona
2001 conf
ScanGIS
Christian S. Jensen, Anders Friis-Christensen, Torben Bach Pedersen, Dieter Pfoser, Simonas Saltenis, Nectaria Tryfona
2001 A conf
ER
Rosanne Price, Nectaria Tryfona, Christian S. Jensen
2001 C conf
ADBIS
Helle L. Christensen, Mads L. Haslund, Henrik N. Nielsen, Nectaria Tryfona
2001 B conf
SSTD
Torben Bach Pedersen, Nectaria Tryfona
2001 conf
ACM-GIS
Anders Friis-Christensen, Nectaria Tryfona, Christian S. Jensen
2000 J jnl
J. Database Manag.
Rosanne Price, Nectaria Tryfona, Christian S. Jensen
2000 conf
ACM-GIS
Rosanne Price, Nectaria Tryfona, Christian S. Jensen
2000 conf
SAC (1)
Nectaria Tryfona, Christian S. Jensen
1999 J jnl
GeoInformatica
Nectaria Tryfona, Christian S. Jensen
1999 conf
Integrated Spatial Databases
Nikos A. Lorentzos, Nectaria Tryfona, José Ramon Rios Viqueira
1999 C conf
DOLAP
Nectaria Tryfona, Frank Busborg, Jens G. Borch Christiansen
1998 J jnl
Australas. J. Inf. Syst.
Thanasis Hadzilacos, Nectaria Tryfona
1998 C conf
IDEAS
Nectaria Tryfona, Thanasis Hadzilacos
1998 C conf
DEXA
Nectaria Tryfona
1998 conf
ACM-GIS
Dieter Pfoser, Nectaria Tryfona
1997 J jnl
SIGMOD Rec.
Thanasis Hadzilacos, Nectaria Tryfona
1997 A conf
CAiSE
Nectaria Tryfona, Dieter Pfoser, Thanasis Hadzilacos
1997 conf
COSIT
Martin Raubal, Max J. Egenhofer, Dieter Pfoser, Nectaria Tryfona
1996 J jnl
Trans. GIS
Nectaria Tryfona, Max J. Egenhofer
1996 J jnl
Int. J. Geogr. Inf. Sci.
Thanasis Hadzilacos, Nectaria Tryfona
1996 conf
FMLDO
Nectaria Tryfona, Max J. Egenhofer
1996 A conf
CAiSE
Nectaria Tryfona, Jayant Sharma
1995 conf
ACM-GIS
Nectaria Tryfona, Thanasis Hadzilacos
1992 conf
Spatio-Temporal Reasoning
Thanasis Hadzilacos, Nectaria Tryfona
tests/unit/test_decompile_medium_level.py
← Index tests/unit/test_decompile_medium_level.py python
# tests/unit/test_decompile_medium_level.py
"""Unit tests (mocked BN) for bninja/analysis/medium_level.py
   and bninja/analysis/medium_level_normalization.py."""
# tests/unit/test_decompile_medium_level.py
import sys
from unittest.mock import MagicMock, patch

# Installa gli stubs BN
from tests.unit.conftest_binja_stubs import install_binja_stubs
install_binja_stubs()

# ── Definisci MockMLILInstruction PRIMA di importare il modulo ──
class MockMLILInstruction:
    def __init__(self, operation, address=0, operands=None):
        self.operation = operation
        self.address = address
        self.operands = operands or []

# ── Patcha il modulo BN in modo che isinstance() funzioni ──
sys.modules["binaryninja"].MediumLevelILInstruction = MockMLILInstruction
sys.modules["binaryninja"].SSAVariable = type("SSAVariable", (), {})
sys.modules["binaryninja"].Variable = type("Variable", (), {})
sys.modules["binaryninja"].ILIntrinsic = type("ILIntrinsic", (), {})

# Ora importa il modulo — vede già i tipi corretti
from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
    MediumLevelNormalization,
)	

class MockMLILFunction:
    def __init__(self, instructions):
        self._instructions = instructions

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

    @property
    def basic_blocks(self):
        # one block containing all instructions, good enough for MinHasher
        block = MagicMock()
        block.__iter__ = lambda self_: iter([])  # not used by MediumLevelAnalysis
        return [block]


class MockFunction:
    def __init__(self, name="func", start=0x1000, mlil=None):
        self.name = name
        self.start = start
        self.mlil = mlil



class TestMediumLevelNormalization:
    def setup_method(self):
        from redb.extractors.decompiler.bninja.analysis.medium_level_normalization import (
            MediumLevelNormalization,
        )
        self.norm = MediumLevelNormalization()

    def test_normalize_skeleton_single_instruction(self):
        il = MockMLILInstruction(operation=42, operands=[])
        result = self.norm.normalize_instruction_all_levels(il)
        assert result == [42]

    def test_normalize_skeleton_nested(self):
        inner = MockMLILInstruction(operation=7, operands=[])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [1, 7]

    def test_normalize_skeleton_with_list_operand(self):
        inner_a = MockMLILInstruction(operation=10, operands=[])
        inner_b = MockMLILInstruction(operation=11, operands=[])
        outer = MockMLILInstruction(operation=2, operands=[[inner_a, inner_b]])
        result = self.norm.normalize_instruction_all_levels(outer)
        assert result == [2, 10, 11]

    def test_normalize_skeleton_none(self):
        result = self.norm.normalize_instruction_all_levels(None)
        # collect on None should leave ops empty
        assert result == []

    def test_normalize_typed_appends_leaf_types(self):
        # operand is a plain int -> "CONST"
        il = MockMLILInstruction(operation=3, operands=[42])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [3, "CONST"]

    def test_normalize_typed_bool_before_int(self):
        # bool must be detected before int (since bool is an int subclass)
        il = MockMLILInstruction(operation=4, operands=[True])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [4, "BOOL"]

    def test_normalize_typed_float(self):
        il = MockMLILInstruction(operation=5, operands=[1.5])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [5, "FLOAT_CONST"]

    def test_normalize_typed_str(self):
        il = MockMLILInstruction(operation=6, operands=["hello"])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [6, "STR"]

    def test_normalize_typed_unknown_falls_back_to_typename(self):
        class Weird:
            pass
        il = MockMLILInstruction(operation=8, operands=[Weird()])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [8, "WEIRD"]

    def test_normalize_typed_nested_mlil(self):
        inner = MockMLILInstruction(operation=99, operands=[7])
        outer = MockMLILInstruction(operation=1, operands=[inner])
        result = self.norm.normalize_instr_with_operands(outer)
        assert result == [1, 99, "CONST"]

    def test_normalize_typed_list_mixed(self):
        inner = MockMLILInstruction(operation=50, operands=[])
        il = MockMLILInstruction(operation=2, operands=[[inner, 99]])
        result = self.norm.normalize_instr_with_operands(il)
        assert result == [2, 50, "CONST"]


class TestMediumLevelAnalysis:
    def _make_analysis(self, instructions=None, mlil=True, start=0x1000):
        from redb.extractors.decompiler.bninja.analysis.medium_level import (
            MediumLevelAnalysis,
        )
        mlil_func = MockMLILFunction(instructions or []) if mlil else None
        func = MockFunction(name="testfunc", start=start, mlil=mlil_func)
        bv = MagicMock()
        return MediumLevelAnalysis(func, bv, MagicMock())

    def test_collect_returns_empty_when_no_mlil(self):
        a = self._make_analysis(mlil=False)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk == [] and sk_addr == [] and ty == [] and ty_addr == []

    def test_collect_skeleton_and_typed_basic(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        sk, sk_addr, ty, ty_addr = a._collect_mlil_skeleton_and_typed()

        assert sk == [[1], [2]]
        assert ty == [[1], [2, "CONST"]]
        assert sk_addr == [(0, [1]), (4, [2])]
        assert ty_addr == [(0, [1]), (4, [2, "CONST"])]

    def test_collect_negative_offset_clamped_to_zero(self):
        instrs = [
            MockMLILInstruction(operation=1, address=0x900, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        _, sk_addr, _, ty_addr = a._collect_mlil_skeleton_and_typed()
        assert sk_addr[0][0] == 0
        assert ty_addr[0][0] == 0

    def test_log_error_records_entry(self):
        a = self._make_analysis()
        a.log_error("boom", "fname", 0x1234, ValueError("x"), "loc")
        assert len(a.errors) == 1
        err = a.errors[0]
        assert err["function_name"] == "fname"
        assert err["function_address"] == "4660"  # hex 0x1234
        assert err["error_location"] == "loc"
        assert err["error_message"] == "boom"
        assert err["error_type"] == "ValueError"
        assert "timestamp" in err

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_returns_expected_keys(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = [1, 2, 3]

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[]),
            MockMLILInstruction(operation=2, address=0x1004, operands=[42]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[]),
        ]
        a = self._make_analysis(instructions=instrs, start=0x1000)
        result, errors = a.analyze()

        expected_keys = {
            "function_address",
            "body_mlil_skeleton_vector",
            "sha256_mlil_skeleton",
            "tlsh_mlil_skeleton",
            "minhash_mlil_skeleton",
            "body_mlil_typed_vector",
            "sha256_mlil_typed",
            "tlsh_mlil_typed",
            "minhash_mlil_typed",
        }
        assert set(result.keys()) == expected_keys
        assert result["function_address"] == 0x1000
        assert result["minhash_mlil_skeleton"] == [1, 2, 3]
        assert result["minhash_mlil_typed"] == [1, 2, 3]
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_empty_mlil(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []
        a = self._make_analysis(mlil=False)
        result, errors = a.analyze()
        assert result["body_mlil_skeleton_vector"] == []
        assert result["body_mlil_typed_vector"] == []
        assert errors == []

    @patch(
        "redb.extractors.decompiler.bninja.analysis.medium_level.MinHasher"
    )
    def test_analyze_sha256_differs_skeleton_vs_typed(self, mock_minhasher):
        mock_minhasher.return_value.calculateMinHash.return_value = []

        instrs = [
            MockMLILInstruction(operation=1, address=0x1000, operands=[42]),
            MockMLILInstruction(operation=2, address=0x1004, operands=["foo"]),
            MockMLILInstruction(operation=3, address=0x1008, operands=[True]),
        ]
        a = self._make_analysis(instructions=instrs)
        result, _ = a.analyze()
        # skeleton ignores operand leaves, typed includes them -> different hashes
        assert result["sha256_mlil_skeleton"] != result["sha256_mlil_typed"]


class TestMinHasherMLILKinds:
    def _make_func(self, instrs):
        # MinHasher iterates basic_blocks then over each block
        block = MagicMock()
        block.__iter__ = lambda self_: iter(instrs)
        f = MagicMock()
        f.basic_blocks = [block]
        return f

    def test_mlil_skeleton_uses_medium_normalizer(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=i, operands=[]) for i in range(5)
        ]
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        result = hasher.calculateMinHash()
        # 5 instructions -> 3 trigrams -> non-empty signature
        assert result != []

    def test_typed_mlil_differs_from_skeleton(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [
            MockMLILInstruction(operation=1, operands=[42]),
            MockMLILInstruction(operation=2, operands=["s"]),
            MockMLILInstruction(operation=3, operands=[True]),
            MockMLILInstruction(operation=4, operands=[1.5]),
        ]
        func = self._make_func(instrs)
        skel = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL).calculateMinHash()
        typed = MinHasher(seed=42, il_function=func, kind=TokenKind.TYPED_MLIL).calculateMinHash()
        # Same seed, same instructions, but typed has extra leaf tokens
        # -> hashes should generally differ
        assert skel != typed

    def test_mlil_too_few_instructions(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import (
            MinHasher, TokenKind,
        )
        instrs = [MockMLILInstruction(operation=1, operands=[])] * 2
        func = self._make_func(instrs)
        hasher = MinHasher(seed=42, il_function=func, kind=TokenKind.MLIL)
        assert hasher.calculateMinHash() == []

    def test_unsupported_kind_raises(self):
        from redb.extractors.decompiler.bninja.similarity.minhasher import MinHasher
        func = self._make_func([])
        hasher = MinHasher(seed=42, il_function=func, kind="bogus")
        with pytest.raises(ValueError):
            hasher.calculateMinHash()