Radha Jagadeesan

102 papers A* 12A 11B 20C 2Misc 1Journal 34Unranked 21
YearRankTypeTitle / Venue / Authors
2024 J jnl
CoRR
Radha Jagadeesan
2024 J jnl
CoRR
Samson Abramsky, Radha Jagadeesan
2020 J jnl
Proc. ACM Program. Lang.
Radha Jagadeesan, Alan Jeffrey, James Riely
2019 B conf
PPoPP
Brijesh Dongol, Radha Jagadeesan, James Riely
2019 A* conf
IEEE Symposium on Security and Privacy
Craig Disselkoen, Radha Jagadeesan, Alan Jeffrey, James Riely
2018 A conf
ESOP
Radha Jagadeesan, James Riely
2018 J jnl
Inf. Comput.
Matthijs Vákár, Radha Jagadeesan, Samson Abramsky
2018 B conf
VMCAI
Brijesh Dongol, Radha Jagadeesan, James Riely, Alasdair Armstrong
2018 J jnl
Proc. ACM Program. Lang.
Brijesh Dongol, Radha Jagadeesan, James Riely
2016 B ed.
CONCUR
Josée Desharnais, Radha Jagadeesan
2016 J jnl
Math. Struct. Comput. Sci.
Matthew A. Goto, Radha Jagadeesan, Alan Jeffrey, Corin Pitcher, James Riely
2015 conf
ICALP (2)
Radha Jagadeesan, James Riely
2015 conf
ICALP (2)
Samson Abramsky, Radha Jagadeesan, Matthijs Vákár
2015 J jnl
CoRR
Samson Abramsky, Radha Jagadeesan, Matthijs Vákár
2014 conf
ICALP (2)
Radha Jagadeesan, James Riely
2014 J jnl
CoRR
Radha Jagadeesan, James Riely
2014 A conf
CSF
Radha Jagadeesan, C. M. Lubinski, Corin Pitcher, James Riely, Charles Winebrinner
2014 J jnl
CoRR
Samson Abramsky, Radha Jagadeesan
2014 conf
Horizons of the Mind
Vijay A. Saraswat, Vineet Gupta, Radha Jagadeesan
2013 J jnl
CoRR
Samson Abramsky, Radha Jagadeesan
2013 J jnl
CoRR
Samson Abramsky, Radha Jagadeesan, Pasquale Malacaria
2013 J jnl
CoRR
Samson Abramsky, Radha Jagadeesan
2013 conf
ICLA
Radha Jagadeesan, Corin Pitcher, James Riely
2013 A conf
ESOP
Radha Jagadeesan, Gustavo Petri, Corin Pitcher, James Riely
2013 J jnl
CoRR
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
2012 B conf
FoSSaCS
Radha Jagadeesan, Gustavo Petri, James Riely
2012 B conf
APLAS
Radha Jagadeesan, Corin Pitcher, James Riely
2012 conf
TLDI
Matthew Goto, Radha Jagadeesan, Corin Pitcher, James Riely
2011 A conf
CSF
Radha Jagadeesan, Corin Pitcher, Julian Rathke, James Riely
2010 A conf
ESOP
Radha Jagadeesan, Corin Pitcher, James Riely
2010 J jnl
Inf. Comput.
Josée Desharnais, Vineet Gupta, Radha Jagadeesan, Prakash Panangaden
2009 B conf
MFPS
Samson Abramsky, Radha Jagadeesan
2009 J jnl
LNCS Trans. Aspect Oriented Softw. Dev.
Radha Jagadeesan, Corin Pitcher, James Riely
2009 A conf
ESORICS
Radha Jagadeesan, Alan Jeffrey, Corin Pitcher, James Riely
2008 B conf
APLAS
Radha Jagadeesan
2008 J jnl
Log. Methods Comput. Sci.
Radha Jagadeesan, Alan Jeffrey, Corin Pitcher, James Riely
2008 A conf
ESOP
Andrew Cirillo, Radha Jagadeesan, Corin Pitcher, James Riely
2007 B conf
PPoPP
Vijay A. Saraswat, Radha Jagadeesan, Maged M. Michael, Christoph von Praun
2007 A conf
CSF
Andrew Cirillo, Radha Jagadeesan, Corin Pitcher, James Riely
2007 B conf
FoSSaCS
Radha Jagadeesan
2007 J jnl
CoRR
Radha Jagadeesan, Alan Jeffrey, Corin Pitcher, James Riely
2007 conf
AOSD
Radha Jagadeesan, Corin Pitcher, James Riely
2007 C conf
SACMAT
Bin Zhang, Ehab Al-Shaer, Radha Jagadeesan, James Riely, Corin Pitcher
2006 J jnl
Log. Methods Comput. Sci.
Vineet Gupta, Radha Jagadeesan, Prakash Panangaden
2006 conf
CSFW
Krishnendu Chatterjee, Radha Jagadeesan, Corin Pitcher
2006 J jnl
Sci. Comput. Program.
Radha Jagadeesan, Alan Jeffrey, James Riely
2005 J jnl
Ann. Pure Appl. Log.
Samson Abramsky, Radha Jagadeesan
2005 J jnl
CoRR
Vineet Gupta, Radha Jagadeesan, Prakash Panangaden
2005 B conf
CONCUR
Vijay A. Saraswat, Radha Jagadeesan
2005 conf
FSTTCS
Radha Jagadeesan, Gopalan Nadathur, Vijay A. Saraswat
2005 C conf
PPDP
Radha Jagadeesan, Will Marrero, Corin Pitcher, Vijay A. Saraswat
2004 J jnl
Math. Struct. Comput. Sci.
Michael Huth, Radha Jagadeesan, David A. Schmidt
2004 conf
QEST
Vineet Gupta, Radha Jagadeesan, Prakash Panangaden
2004 J jnl
Theor. Comput. Sci.
Josée Desharnais, Vineet Gupta, Radha Jagadeesan, Prakash Panangaden
2004 A* conf
LICS
Luca de Alfaro, Patrice Godefroid, Radha Jagadeesan
2004 B conf
CONCUR
Glenn Bruns, Radha Jagadeesan, Alan Jeffrey, James Riely
2003 A conf
ECOOP
Radha Jagadeesan, Alan Jeffrey, James Riely
2003 B conf
FoSSaCS
Samson Abramsky, Radha Jagadeesan
2003 J jnl
Inf. Comput.
Josée Desharnais, Vineet Gupta, Radha Jagadeesan, Prakash Panangaden
2003 J jnl
ACM Trans. Comput. Log.
Erich Grädel, Joseph Y. Halpern, Radha Jagadeesan, Adolfo Piperno
2003 B conf
VMCAI
Patrice Godefroid, Radha Jagadeesan
2003 Misc conf
EPIA
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
2002 A* conf
CAV
Patrice Godefroid, Radha Jagadeesan
2002 A* conf
LICS
Josée Desharnais, Radha Jagadeesan, Vineet Gupta, Prakash Panangaden
2002 J jnl
Theor. Comput. Sci.
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
2002 B conf
CONCUR
Josée Desharnais, Vineet Gupta, Radha Jagadeesan, Prakash Panangaden
2001 B conf
CONCUR
Patrice Godefroid, Michael Huth, Radha Jagadeesan
2001 A conf
ESOP
Michael Huth, Radha Jagadeesan, David A. Schmidt
2000 A conf
CP
Vineet Gupta, Lalita Jategaonkar Jagadeesan, Radha Jagadeesan, Xiaowei Jiang, Konstantin Läufer
2000 A* conf
LICS
Josée Desharnais, Vineet Gupta, Radha Jagadeesan, Prakash Panangaden
2000 conf
SIGSOFT FSE
Patrice Godefroid, Lalita Jategaonkar Jagadeesan, Radha Jagadeesan, Konstantin Läufer
2000 J jnl
Inf. Comput.
Samson Abramsky, Radha Jagadeesan, Pasquale Malacaria
2000 J jnl
Int. J. Speech Technol.
Thomas Ball, Christopher Colby, Peter J. Danielsen, Lalita Jategaonkar Jagadeesan, Radha Jagadeesan, Konstantin Läufer, Peter Mataga, Kenneth Rehor
2000 J jnl
ACM SIGSOFT Softw. Eng. Notes
Radha Jagadeesan, Konstantin Läufer, Vineet Gupta
1999 B conf
CONCUR
Josée Desharnais, Vineet Gupta, Radha Jagadeesan, Prakash Panangaden
1999 A* conf
POPL
Vineet Gupta, Radha Jagadeesan, Prakash Panangaden
1998 J jnl
Sci. Comput. Program.
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
1998 conf
ICCL
Christopher Colby, Lalita Jategaonkar Jagadeesan, Radha Jagadeesan, Konstantin Läufer, Carlos Puchol
1998 conf
COOTS
Christopher Colby, Lalita Jategaonkar Jagadeesan, Radha Jagadeesan, Konstantin Läufer, Carlos Puchol
1997 B conf
CONCUR
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
1997 conf
HART
Vineet Gupta, Thomas A. Henzinger, Radha Jagadeesan
1997 conf
US-Brazil Joint Workshops on the Formal Foundations of Software Systems
Christopher Colby, Lalita Jategaonkar, Radha Jagadeesan, Konstantin Läufer, Carlos Puchol
1996 B conf
CONCUR
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
1996 J jnl
J. Symb. Comput.
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
1996 B conf
CONCUR
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
1995 conf
AMAST
Lalita Jategaonkar Jagadeesan, Radha Jagadeesan
1995 A* conf
POPL
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
1995 conf
Hybrid Systems
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat
1994 A* conf
LICS
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
1994 conf
TACS
Samson Abramsky, Pasquale Malacaria, Radha Jagadeesan
1994 J jnl
J. Symb. Log.
Samson Abramsky, Radha Jagadeesan
1994 J jnl
Inf. Comput.
Samson Abramsky, Radha Jagadeesan
1994 conf
Hybrid Systems
Vineet Gupta, Radha Jagadeesan, Vijay A. Saraswat, Daniel G. Bobrow
1993 conf
NATO ASI CP
Vijay A. Saraswat, Radha Jagadeesan, Vineet Gupta
1992 A* conf
POPL
Radha Jagadeesan, Keshav Pingali
1992 conf
FSTTCS
Samson Abramsky, Radha Jagadeesan
1992 A* conf
LICS
Samson Abramsky, Radha Jagadeesan
1991 J jnl
ACM Trans. Program. Lang. Syst.
Radha Jagadeesan, Keshav Pingali, Prakash Panangaden
1991
Investigations Into Abstraction And Concurrency.
Radha Jagadeesan
1990 A* conf
ICALP
Radha Jagadeesan, Prakash Panangaden
1989 A* conf
LICS
Radha Jagadeesan, Prakash Panangaden, Keshav Pingali
1989 B conf
Mathematical Foundations of Programming Semantics
Radha Jagadeesan
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()