Olivier Muller

33 papers A 3B 4C 8Misc 1Journal 14Unranked 3
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Anand Choudhary, Xiaowu Sun, Thabo Mahendiran, Ortal Yona Senouf, Denise Auberson, Bernard De Bruyne, Stéphane Fournier, Olivier Muller, Emmanuel Abbe, Pascal Frossard, Dorina Thanou
2026 J jnl
CoRR
Jean Bruant, Pierre-Henri Horrein, Olivier Muller, Frédéric Pétrot
2025 J jnl
CoRR
Camille Challier, Xiaowu Sun, Thabo Mahendiran, Ortal Yona Senouf, Bernard De Bruyne, Denise Auberson, Olivier Muller, Stéphane Fournier, Pascal Frossard, Emmanuel Abbe, Dorina Thanou
2025 J jnl
CoRR
Xiaowu Sun, Thabo Mahendiran, Ortal Yona Senouf, Denise Auberson, Bernard De Bruyne, Stéphane Fournier, Olivier Muller, Pascal Frossard, Emmanuel Abbe, Dorina Thanou
2024 conf
ISBI
Xiaowu Sun, Theofilos Belmpas, Ortal Yona Senouf, Emmanuel Abbe, Pascal Frossard, Bernard De Bruyne, Olivier Muller, Stéphane Fournier, Thabo Mahendiran, Dorina Thanou
2023 J jnl
CoRR
Bruno Ferres, Olivier Muller, Frédéric Rousseau
2023 J jnl
ACM Trans. Design Autom. Electr. Syst.
Bruno Ferres, Olivier Muller, Frédéric Rousseau
2023 B conf
AIME
Riccardo Tenderini, Federico Betti, Ortal Yona Senouf, Olivier Muller, Simone Deparis, Annalisa Buffa, Emmanuel Abbe
2022 J jnl
IEEE Des. Test
Jean Bruant, Pierre-Henri Horrein, Olivier Muller, Tristan Groléat, Frédéric Pétrot
2021 J jnl
ACM Trans. Reconfigurable Technol. Syst.
Arif Sasongko, I. M. Narendra Kumara, Arief Wicaksana, Frédéric Rousseau, Olivier Muller
2021 C conf
RSP
Bruno Ferres, Olivier Muller, Frédéric Rousseau
2020 C conf
RSP
Jean Bruant, Pierre-Henri Horrein, Olivier Muller, Tristan Groléat, Frédéric Pétrot
2020 conf
ARC
Bruno Ferres, Olivier Muller, Frédéric Rousseau
2019 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Olivier Muller, Adrien Prost-Boucle, Alban Bourge, Frédéric Pétrot
2018 conf
ReCoSoC
Georgios Christodoulis, François Broquedis, Olivier Muller, Manuel Selva, Frederic Desprez
2018 C conf
RSP
Thomas Baumela, Olivier Gruber, Olivier Muller, Frédéric Pétrot
2017 C conf
RSP
Arief Wicaksana, Alban Bourge, Olivier Muller, Arif Sasongko, Frédéric Rousseau
2016 B conf
FPL
Arief Wicaksana, Alban Bourge, Olivier Muller, Frédéric Rousseau
2016 J jnl
CoRR
Arief Wicaksana, Alban Bourge, Olivier Muller, Frédéric Rousseau
2016 J jnl
ACM Trans. Reconfigurable Technol. Syst.
Alban Bourge, Olivier Muller, Frédéric Rousseau
2016 C conf
DSD
Simon Pontie, Alban Bourge, Adrien Prost-Boucle, Paolo Maistri, Olivier Muller, Régis Leveugle, Frédéric Rousseau
2016 C conf
RSP
Arief Wicaksana, Adrien Prost-Boucle, Olivier Muller, Frédéric Rousseau, Arif Sasongko
2015 A conf
FPGA
Alban Bourge, Olivier Muller, Frédéric Rousseau
2015 Misc conf
FCCM
Alban Bourge, Olivier Muller, Frédéric Rousseau
2014 J jnl
J. Syst. Archit.
Adrien Prost-Boucle, Olivier Muller, Frédéric Rousseau
2013 C conf
DSD
Adrien Prost-Boucle, Olivier Muller, Frédéric Rousseau
2012 B conf
FPL
Yan Xu, Olivier Muller, Pierre-Henri Horrein, Frédéric Pétrot
2010 J jnl
EURASIP J. Adv. Signal Process.
Olivier Muller, Amer Baghdadi, Michel Jézéquel
2009 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Olivier Muller, Amer Baghdadi, Michel Jézéquel
2008 C conf
IEEE International Workshop on Rapid System Prototyping
Olivier Muller, Amer Baghdadi, Michel Jézéquel
2007 A conf
DATE
Hazem Moussa, Olivier Muller, Amer Baghdadi, Michel Jézéquel
2006 A conf
DATE
Olivier Muller, Amer Baghdadi, Michel Jézéquel
2006 B conf
GLOBECOM
Olivier Muller, Amer Baghdadi, Michel Jézéquel
tests/unit/test_decompile_scores.py
← Index tests/unit/test_decompile_scores.py python
"""Unit tests for bninja/analysis/scores.py — ObfuscationScores."""
import sys
import pytest
from unittest.mock import MagicMock

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

from redb.extractors.decompiler.bninja.analysis.scores import (
    ObfuscationScores,
    get_dominated_by,
    uses_mba,
)
import binaryninja.highlevelil as hlil_mod


# ============================================================================
# Helper: Mock HLIL instruction
# ============================================================================

class MockHLILInstruction(hlil_mod.HighLevelILInstruction):
    """Mock HLIL instruction with operation and operands."""
    def __init__(self, operation, operands=None):
        self.operation = operation
        self.operands = operands or []


class MockHLILBasicBlock:
    """Mock HLIL basic block for flattened score testing."""
    def __init__(self, incoming_edges=None, dominator_tree_children=None):
        self.incoming_edges = incoming_edges or []
        self.dominator_tree_children = dominator_tree_children or []


# ============================================================================
# 5a. ObfuscationScores
# ============================================================================


class TestFlattenedScore:
    def test_flattened_score_no_back_edges(self):
        """Linear CFG with no back edges -> score 0.0."""
        block = MockHLILBasicBlock(incoming_edges=[], dominator_tree_children=[])
        func = MagicMock()
        func.basic_blocks = [block]
        scores = ObfuscationScores(func)
        assert scores.flattened_score() == 0.0

    def test_flattened_score_with_loop(self):
        """CFG with a back edge -> score > 0.0."""
        block = MockHLILBasicBlock(dominator_tree_children=[])
        # Create a back edge: an incoming edge whose source is in the dominated set
        edge = MagicMock()
        edge.source = block  # source IS the dominator -> back edge
        block.incoming_edges = [edge]
        func = MagicMock()
        func.basic_blocks = [block]
        scores = ObfuscationScores(func)
        assert scores.flattened_score() > 0.0

    def test_flattened_score_fully_flat(self):
        """Flattened CFG: one block dominates all -> ratio close to 1.0."""
        children = [MockHLILBasicBlock() for _ in range(4)]
        root = MockHLILBasicBlock(dominator_tree_children=children)
        # Back edge from root incoming
        edge = MagicMock()
        edge.source = root
        root.incoming_edges = [edge]
        all_blocks = [root] + children
        func = MagicMock()
        func.basic_blocks = all_blocks
        scores = ObfuscationScores(func)
        assert scores.flattened_score() == pytest.approx(1.0)


class TestMBAScore:
    def test_mba_score_no_mixed_ops(self):
        """Instructions with only arithmetic -> score 0.0."""
        instr = MockHLILInstruction(HighLevelILOperation.HLIL_ADD, operands=[])
        func = MagicMock()
        func.instructions = [instr]
        scores = ObfuscationScores(func)
        assert scores.MBA_score() == 0.0

    def test_mba_score_mixed_ops(self):
        """Instructions with arithmetic + logic -> score > 0.0."""
        inner_logic = MockHLILInstruction(HighLevelILOperation.HLIL_XOR, operands=[])
        outer_arith = MockHLILInstruction(
            HighLevelILOperation.HLIL_ADD, operands=[inner_logic]
        )
        func = MagicMock()
        func.instructions = [outer_arith]
        scores = ObfuscationScores(func)
        assert scores.MBA_score() > 0.0

    def test_mba_score_all_mixed(self):
        """Every instruction has both -> score 1.0."""
        inner_logic = MockHLILInstruction(HighLevelILOperation.HLIL_NOT, operands=[])
        outer_arith = MockHLILInstruction(
            HighLevelILOperation.HLIL_SUB, operands=[inner_logic]
        )
        func = MagicMock()
        func.instructions = [outer_arith]
        scores = ObfuscationScores(func)
        assert scores.MBA_score() == 1.0


class TestGetDominatedBy:
    def test_get_dominated_by(self):
        child1 = MockHLILBasicBlock(dominator_tree_children=[])
        child2 = MockHLILBasicBlock(dominator_tree_children=[])
        root = MockHLILBasicBlock(dominator_tree_children=[child1, child2])
        result = get_dominated_by(root)
        assert root in result
        assert child1 in result
        assert child2 in result
        assert len(result) == 3


class TestUsesMBA:
    def test_uses_mba_arithmetic_only(self):
        instr = MockHLILInstruction(HighLevelILOperation.HLIL_ADD, operands=[])
        assert uses_mba(instr) is False

    def test_uses_mba_logic_only(self):
        instr = MockHLILInstruction(HighLevelILOperation.HLIL_XOR, operands=[])
        assert uses_mba(instr) is False

    def test_uses_mba_mixed(self):
        inner = MockHLILInstruction(HighLevelILOperation.HLIL_AND, operands=[])
        outer = MockHLILInstruction(HighLevelILOperation.HLIL_ADD, operands=[inner])
        assert uses_mba(outer) is True