Rafael Kelly

84 papers A* 21A 3Journal 45Unranked 15
YearRankTypeTitle / Venue / Authors
2025 J jnl
Int. J. Control
Rafael Kelly, Adriana Salinas, Diana V. Cajero, Gabriela Zepeda
2024 A conf
ICCAD
Rafael Kelly, Gabriela Zepeda, Carmen Monroy
2022 J jnl
Int. J. Syst. Sci.
Jesús Sandoval, Rafael Kelly, Víctor Santibáñez
2022 J jnl
J. Frankl. Inst.
Jesús Sandoval, Rafael Kelly, Víctor Santibáñez, Jorge Villalobos-Chin
2021 J jnl
IEEE Trans. Control. Syst. Technol.
Rafael Kelly, Jesús Sandoval, Víctor Santibáñez
2021 A conf
ICCAD
Rafael Kelly, Gabriela Zepeda, Carmen Monroy
2019 A conf
ICCAD
Rafael Kelly, Carmen Monroy
2015 conf
ECC
Jesus Sandoval, Rafael Kelly, Víctor Santibáñez
2010 conf
CDC
Jesus Sandoval, Rafael Kelly, Víctor Santibáñez
2009 conf
IWANN (1)
Rafael Kelly, Carmen Monroy
2009 J jnl
Int. J. Control
Ricardo R. Pérez, Marco A. Arteaga, Rafael Kelly, Arturo Espinosa
2009 conf
International Conference on Internet Computing
Carmen Monroy, Rafael Kelly, Dann De La Torre
2008 J jnl
Int. J. Imaging Syst. Technol.
Eusebio Bugarin, Rafael Kelly
2007 conf
IFSA (1)
Rafael Kelly, Eusebio Bugarin, Carmen Monroy
2007 J jnl
J. Intell. Robotic Syst.
Carmen Monroy, Rafael Kelly, Marco A. Arteaga, Eusebio Bugarin
2007 J jnl
Eur. J. Control
Antoine Chaillet, Antonio Loría, Rafael Kelly
2006 J jnl
Int. J. Comput. Commun. Control
Carlos Miguel Soria, Ricardo O. Carelli, Rafael Kelly, Juan Manuel Ibarra Zannatha
2006 conf
CDC
Rafael Kelly, Eusebio Bugarin, Victor Sanchez
2006 conf
CDC
Rafael Kelly, Eusebio Bugarin, Ilse Cervantes, Jose Alvarez-Ramirez
2006 conf
CDC
Antoine Chaillet, Antonio Loría, Rafael Kelly
2005 A* conf
ICRA
Rafael Kelly, Victor Sanchez, Eusebio Bugarin, Humberto Rodríguez
2005 J jnl
IEEE Trans. Fuzzy Syst.
Victor Santibañez, Rafael Kelly, Miguel A. Llama
2005 conf
CDC/ECC
Víctor Santibáñez, Rafael Kelly, Jesus Sandoval
2005 J jnl
Robotica
Rafael Kelly, Sebastián Dormido, Carmen Monroy, Elizabeth Díaz
2005 J jnl
Autom.
Rafael Kelly, Javier Moreno-Valenzuela
2005 conf
CDC/ECC
Javier Moreno-Valenzuela, Rafael Kelly
2005 J jnl
Eur. J. Control
Antonio Loría, Rafael Kelly, Andrew R. Teel
2004 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Victor Santibañez, Rafael Kelly, Miguel A. Llama
2004 J jnl
IEEE Trans. Robotics Autom.
Marco A. Arteaga, Rafael Kelly
2004 conf
CDC
Rafael Kelly, Javier Moreno-Valenzuela, Ricardo Campa
2003 A* conf
ICRA
Javier Moreno-Valenzuela, Rafael Kelly
2003 conf
CDC
Javier Moreno-Valenzuela, Rafael Kelly
2003 J jnl
Autom.
Jose Alvarez-Ramirez, Rafael Kelly, Ilse Cervantes
2003 A* conf
ICRA
Antonio Loría, Rafael Kelly, Andrew R. Teel
2002 J jnl
IEEE Trans. Control. Syst. Technol.
Ilse Cervantes, Rafael Kelly, Jose Alvarez-Ramirez, Javier Moreno-Valenzuela
2002 A* conf
ICRA
Eloísa García, Rafael Kelly
2002 A* conf
ICRA
Javier Moreno-Valenzuela, Rafael Kelly, Ricardo Campa
2002 conf
CDC
Javier Moreno-Valenzuela, Rafael Kelly, Ricardo Campa
2002 J jnl
J. Intell. Robotic Syst.
Javier Moreno-Valenzuela, Rafael Kelly
2001 J jnl
Fuzzy Sets Syst.
Miguel A. Llama, Rafael Kelly, Victor Santibañez
2001 J jnl
Robotica
Carmen Monroy, Ricardo Campa, Rafael Kelly
2001 conf
CDC
Víctor Santibáñez, Rafael Kelly
2001 J jnl
IEEE Trans. Educ.
Rafael Kelly, Javier Moreno-Valenzuela
2001 conf
CDC
Rafael Kelly, Javier Moreno, Fermín Pérez
2001 A* conf
ICRA
Ricardo Campa, Rafael Kelly, Eloísa García
2001 J jnl
Robotica
Víctor Santibáñez, Rafael Kelly
2000 J jnl
IEEE Trans. Instrum. Meas.
Rafael Kelly, Jesús Llamas, Ricardo Campa
2000 J jnl
J. Field Robotics
Rafael Kelly, Jesús Favela, Juan M. Ibarra, Danilo Bassi
2000 A* conf
ICRA
Victor Santibañez, Rafael Kelly, Miguel A. Llama
2000 J jnl
Int. J. Imaging Syst. Technol.
Rafael Kelly, Fernando Reyes-Cortés
2000 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Miguel A. Llama, Rafael Kelly, Victor Santibañez
1999 A* conf
ICRA
Rafael Kelly, Fernando Reyes-Cortés, Javier Moreno-Valenzuela, Seth Hutchinson
1999 J jnl
Robotica
Rafael Kelly, Angel Coello
1999 A* conf
ICRA
Rafael Kelly, Jesús Llamas
1999 A* conf
ICRA
Victor Santibañez, Rafael Kelly
1999 J jnl
Intell. Autom. Soft Comput.
Rafael Kelly, Rodolfo Haber, Rodolfo Haber-Guerra, Fernando Reyes-Cortés
1999 J jnl
IEEE Trans. Robotics Autom.
Rafael Kelly
1998 A* conf
ICRA
Victor Santibañez, Rafael Kelly
1998 J jnl
IEEE Trans. Ind. Electron.
Víctor Santibáñez, Rafael Kelly, Fernando Reyes
1998 A* conf
ICRA
Fernando Reyes-Cortés, Rafael Kelly
1998 J jnl
IEEE Trans. Autom. Control.
Rafael Kelly
1998 J jnl
IEEE Trans. Autom. Control.
Rafael Kelly, Víctor Santibáñez
1998 A* conf
ICRA
Miguel A. Llama, Victor Santibañez, Rafael Kelly, Jesus Flores
1997 A* conf
ICRA
Víctor Santibáñez, Rafael Kelly
1997 J jnl
Robotica
Fernando Reyes-Cortés, Rafael Kelly
1997 J jnl
Eur. J. Control
Víctor Santibáñez, Rafael Kelly
1997 J jnl
IEEE Trans. Autom. Control.
Antonio Loría, Rafael Kelly, Romeo Ortega, Víctor Santibáñez
1997 A* conf
ICRA
Fernando Reyes-Cortés, Rafael Kelly
1997 J jnl
Int. J. Robotics Res.
Rafael Kelly
1997 J jnl
Autom.
Víctor Santibáñez, Rafael Kelly
1996 J jnl
J. Field Robotics
Rafael Kelly, Ricardo O. Carelli
1996 A* conf
ICRA
Rafael Kelly, Paul Shirkey, Mark W. Spong
1996 A* conf
ICRA
Víctor Santibáñez, Rafael Kelly
1996 J jnl
IEEE Trans. Robotics Autom.
Rafael Kelly
1995 J jnl
IEEE Trans. Robotics Autom.
Romeo Ortega, Rafael Kelly, Antonio Loría
1995 J jnl
IEEE Trans. Autom. Control.
Romeo Ortega, Antonio Loría, Rafael Kelly
1995 J jnl
Robotica
Rafael Kelly
1995 A* conf
ICRA
Victor Santibañez, Rafael Kelly
1994 J jnl
IEEE Trans. Autom. Control.
Rafael Kelly, Romeo Ortega, Amit Ailon, Antonio Loría
1994 J jnl
IEEE Trans. Robotics Autom.
Rafael Kelly, Ricardo Salgado
1993 J jnl
IEEE Trans. Robotics Autom.
Rafael Kelly
1989 A* conf
ICRA
Rafael Kelly, Ricardo O. Carelli, Mauricio Amestegui, Romeo Ortega
1988 A* conf
ICRA
Rafael Kelly, Romeo Ortega
1987 A* conf
ICRA
Romeo Ortega, Rafael Kelly, Juan Ibarra
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()