Olivier Commowick

61 papers B 3Journal 18Unranked 39
YearRankTypeTitle / Venue / Authors
2022 conf
ISBI
Thomas Durantel, Julie Coloigner, Olivier Commowick
2022 J jnl
IEEE Trans. Medical Imaging
Antoine Legouhy, François Rousseau, Christian Barillot, Olivier Commowick
2022 J jnl
CoRR
Matthias Eisenmann, Annika Reinke, Vivienn Weru, Minu Dietlinde Tizabi, Fabian Isensee, Tim J. Adler, Patrick Godau, Veronika Cheplygina, Michal Kozubek, Sharib Ali, Anubha Gupta, Jan Kybic, J. Alison Noble, Carlos Ortiz-de-Solórzano, Samiksha Pachade, Caroline Petitjean, Daniel Sage, Donglai Wei, Elizabeth Wilden, Deepak Alapatt, Vincent Andrearczyk, Ujjwal Baid, Spyridon Bakas, Niranjan Balu, Sophia Bano, Vivek Singh Bawa, Jorge Bernal, Sebastian Bodenstedt, Alessandro Casella, Jinwook Choi, Olivier Commowick, Marie Daum, Adrien Depeursinge, Reuben Dorent, Jan Egger, Hannah Eichhorn, Sandy Engelhardt, Melanie Ganz, Gabriel Girard, Lasse Hansen, Mattias P. Heinrich, Nicholas Heller, Alessa Hering, Arnaud Huaulmé, Hyunjeong Kim, Bennett A. Landman, Hongwei Bran Li, Jianning Li, Jun Ma, Anne L. Martel, et al.
2022 conf
ISBI
Haykel Snoussi, Benoît Combès, Olivier Commowick, Elise Bannier, Anne Kerbrat, Julien Cohen-Adad, Christian Barillot, Emmanuel Caruyer
2021 J jnl
IEEE Trans. Medical Imaging
Renaud Hédouin, Christian Barillot, Olivier Commowick
2021 J jnl
NeuroImage
Olivier Commowick, Michaël Kain, Romain Casey, Roxana Ameli, Jean-Christophe Ferré, Anne Kerbrat, Thomas Tourdias, Frédéric Cervenansky, Sorina Camarasu-Pop, Tristan Glatard, Sandra Vukusic, Gilles Edan, Christian Barillot, Michel Dojat, François Cotton
2020 J jnl
Frontiers Comput. Neurosci.
Antoine Ackaouy, Nicolas Courty, Emmanuel Vallée, Olivier Commowick, Christian Barillot, Francesca Galassi
2019 conf
ISBI
Haykel Snoussi, Emmanuel Caruyer, Julien Cohen-Adad, Olivier Commowick, Benoît Combès, Elise Bannier, Anne Kerbrat, Christian Barillot
2019 conf
MICCAI (3)
Antoine Legouhy, Olivier Commowick, François Rousseau, Christian Barillot
2019 conf
ISBI
Antoine Legouhy, Olivier Commowick, François Rousseau, Christian Barillot
2018 conf
MICCAI (3)
Aymeric Stamm, Olivier Commowick, Alessandra Menafoglio, Simon K. Warfield
2018 conf
MICCAI (3)
Sudhanya Chatterjee, Olivier Commowick, Onur Afacan, Simon K. Warfield, Christian Barillot
2018 conf
ISBI
Sudhanya Chatterjee, Olivier Commowick, Onur Afacan, Simon K. Warfield, Christian Barillot
2018 conf
BrainLes@MICCAI (1)
Francesca Galassi, Olivier Commowick, Emmanuel Vallée, Christian Barillot
2017 J jnl
IEEE Trans. Medical Imaging
Renaud Hédouin, Olivier Commowick, Elise Bannier, Benoit Scherrer, Maxime Taquet, Simon K. Warfield, Christian Barillot
2017 J jnl
NeuroImage
Aaron Carass, Snehashis Roy, Amod Jog, Jennifer L. Cuzzocreo, Elizabeth M. Sweeney, Adrian Gherman, Julia Button, James Nguyen, Ferran Prados, Carole H. Sudre, Manuel Jorge Cardoso, Niamh Cawley, Olga Ciccarelli, Claudia A. M. Wheeler-Kingshott, Sébastien Ourselin, Laurence Catanese, Hrishikesh Deshpande, Pierre Maurel, Olivier Commowick, Christian Barillot, Xavier Tomas-Fernandez
2017 conf
MICCAI (1)
Olivier Commowick, Renaud Hédouin, Emmanuel Caruyer, Christian Barillot
2016 conf
MICCAI (3)
Benoît Combès, Anne Kerbrat, Olivier Commowick, Christian Barillot
2016 conf
MICCAI (3)
Aymeric Stamm, Olivier Commowick, Simon K. Warfield, Simone Vantini
2016 J jnl
Medical Image Anal.
Christian Barillot, Gilles Edan, Olivier Commowick
2016 J jnl
Frontiers ICT
Christian Barillot, Elise Bannier, Olivier Commowick, Isabelle Corouge, Anthony Baire, Ines Fakhfakh, Justine Guillaumont, Yao Yao, Michaël Kain
2015 J jnl
Medical Image Anal.
Olivier Commowick, Adil Maarouf, Jean-Christophe Ferré, Jean-Philippe Ranjeva, Gilles Edan, Christian Barillot
2015 conf
MICCAI (2)
Renaud Hédouin, Olivier Commowick, Aymeric Stamm, Christian Barillot
2015 conf
ISBI
Yogesh Karpate, Olivier Commowick, Christian Barillot
2015 B conf
Image Processing
Yogesh Karpate, Olivier Commowick, Christian Barillot
2015 conf
ISBI
Renaud Hédouin, Olivier Commowick, Maxime Taquet, Elise Bannier, Benoit Scherrer, Simon K. Warfield, Christian Barillot
2014 J jnl
IEEE Trans. Medical Imaging
Maxime Taquet, Benoit Scherrer, Olivier Commowick, Jurriaan M. Peters, Mustafa Sahin, Benoît Macq, Simon K. Warfield
2014 conf
ISBI
Aymeric Stamm, Olivier Commowick, Patrick Pérez, Christian Barillot
2014 conf
CLIP@MICCAI
Yogesh Karpate, Olivier Commowick, Christian Barillot, Gilles Edan
2014 conf
ISBI
Fang Cao, Olivier Commowick, Camille Maumet, Christian Barillot
2013 conf
IPMI
Aymeric Stamm, Olivier Commowick, Christian Barillot, Patrick Pérez
2013 B conf
Image Processing
Sylvain Prima, Olivier Commowick
2013 B conf
Image Processing
Alessandro Crimi, Olivier Commowick, Jean-Christophe Ferré, Adil Maarouf, Gilles Edan, Christian Barillot
2013 conf
ISBI
Alessandro Crimi, Olivier Commowick, Jean-Christophe Ferré, Adil Maarouf, Gilles Edan, Christian Barillot
2013 conf
CDMRI/MMBC@MICCAI
Emmanuel Vallée, Olivier Commowick, Camille Maumet, Aymeric Stamm, Elisabeth Le Rumeur, Catherine Allaire, Jean-Christophe Ferré, Clément de Guibert, Christian Barillot
2013 conf
ISBI
Sylvain Prima, Olivier Commowick
2012 conf
MICCAI (2)
Olivier Commowick, Nicolas Wiest-Daesslé, Sylvain Prima
2012 J jnl
NeuroImage
Ralph O. Suarez, Olivier Commowick, Sanjay P. Prabhu, Simon K. Warfield
2012 conf
ISBI
Olivier Commowick, Nicolas Wiest-Daesslé, Sylvain Prima
2012 J jnl
IEEE Trans. Medical Imaging
Olivier Commowick, Alireza Akhondi Asl, Simon K. Warfield
2012 conf
MBIA
Fang Cao, Olivier Commowick, Elise Bannier, Jean-Christophe Ferré, Gilles Edan, Christian Barillot
2012 conf
MICCAI (3)
Olivier Commowick, Aymeric Stamm
2012 conf
MICCAI (3)
Maxime Taquet, Benoit Scherrer, Olivier Commowick, Jurriaan M. Peters, Mustafa Sahin, Benoît Macq, Simon K. Warfield
2011 conf
ISBI
Ralph O. Suarez, Olivier Commowick, Xavier Tomas-Fernandez, Sanjay P. Prabhu, Simon K. Warfield
2011 J jnl
IEEE Trans. Medical Imaging
Keelin Murphy, Bram van Ginneken, Joseph M. Reinhardt, Sven Kabus, Kai Ding, Xiang Deng, Kunlin Cao, Kaifang Du, Gary E. Christensen, Vincent Garcia, Tom Vercauteren, Nicholas Ayache, Olivier Commowick, Grégoire Malandain, Ben Glocker, Nikos Paragios, Nassir Navab, Vladlena Gorbunova, Jon Sporring, Marleen de Bruijne, Xiao Han, Mattias P. Heinrich, Julia A. Schnabel, Mark Jenkinson, Cristian Lorenz, Marc Modat, Jamie McClelland, Sébastien Ourselin, Sascha E. A. Muenzing, Max A. Viergever, Dante De Nigris, D. Louis Collins, Tal Arbel, Marta Peroni, Rui Li, Gregory C. Sharp, Alexander Schmidt-Richberg, Jan Ehrhardt, René Werner, Dirk Smeets, Dirk Loeckx, Gang Song, Nicholas J. Tustison, Brian B. Avants, James C. Gee, Marius Staring, Stefan Klein, Berend C. Stoel, Martin Urschler, Manuel Werlberger, Jef Vandemeulebroucke, Simon Rit, David Sarrut, Josien P. W. Pluim
2010 conf
MICCAI (3)
Liliane Ramus, Olivier Commowick, Grégoire Malandain
2010 J jnl
IEEE Trans. Medical Imaging
Olivier Commowick, Simon K. Warfield
2010 conf
MICCAI (3)
Olivier Commowick, Simon K. Warfield
2009 J jnl
IEEE Trans. Medical Imaging
Olivier Commowick, Simon K. Warfield
2009 J jnl
J. Math. Imaging Vis.
Vincent Arsigny, Olivier Commowick, Nicholas Ayache, Xavier Pennec
2009 conf
IPMI
Olivier Commowick, Simon K. Warfield
2009 conf
MICCAI (1)
Olivier Commowick, Simon K. Warfield, Grégoire Malandain
2008 J jnl
Medical Image Anal.
Olivier Commowick, Vincent Arsigny, A. Isambert, J. Costa, F. Dhermain, F. Bidault, Pierre-Yves Bondiau, Nicholas Ayache, Grégoire Malandain
2008 conf
MICCAI (1)
Olivier Commowick, Pierre Fillard, Olivier Clatz, Simon K. Warfield
2007
Olivier Commowick
2007 conf
MICCAI (2)
Olivier Commowick, Grégoire Malandain
2006 conf
MICCAI (1)
Vincent Arsigny, Olivier Commowick, Xavier Pennec, Nicholas Ayache
2006 conf
WBIR
Vincent Arsigny, Olivier Commowick, Xavier Pennec, Nicholas Ayache
2006 conf
ISBI
Olivier Commowick, Vincent Arsigny, María Jimena Costa, Nicholas Ayache, Grégoire Malandain
2005 conf
MICCAI (2)
Olivier Commowick, Radu Stefanescu, Pierre Fillard, Vincent Arsigny, Nicholas Ayache, Xavier Pennec, Grégoire Malandain
2004 conf
MICCAI (1)
Radu Stefanescu, Olivier Commowick, Grégoire Malandain, Pierre-Yves Bondiau, Nicholas Ayache, Xavier Pennec
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()