C. Mani Krishna

87 papers A* 5A 15B 5C 2Misc 7Journal 37Unranked 15
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Internet Things J.
Nirupama Ravi, C. Mani Krishna, Israel Koren
2024 J jnl
ACM Comput. Surv.
Nirupama Ravi, C. Mani Krishna, Israel Koren
2021 J jnl
Sustain. Comput. Informatics Syst.
Shikang Xu, Israel Koren, C. Mani Krishna
2021 J jnl
IEEE Embed. Syst. Lett.
C. Mani Krishna
2020 J jnl
Sustain. Comput. Informatics Syst.
Shikang Xu, Israel Koren, C. Mani Krishna
2019 J jnl
IEEE Trans. Veh. Technol.
Nirupama Ravi, C. Mani Krishna, Israel Koren
2017 J jnl
ACM Trans. Embed. Comput. Syst.
Ye Xu, Israel Koren, C. Mani Krishna
2015 J jnl
IEEE Trans. Reliab.
C. Mani Krishna
2014 J jnl
Int. J. Embed. Syst.
R. C. Ravindran, C. Mani Krishna, Israel Koren, Zahava Koren
2013 Misc conf
ICNC
C. Mani Krishna, Israel Koren
2013 J jnl
J. Low Power Electron.
Nitin Prakash, Israel Koren, C. Mani Krishna
2012 conf
IGCC
Huaping Wang, Israel Koren, C. Mani Krishna
2011 conf
DFT
Md. Muwyid U. Khan, Pritish Narayanan, Priyamvada Vijayakumar, Israel Koren, C. Mani Krishna, Csaba Andras Moritz
2011 conf
NANOARCH
Priyamvada Vijayakumar, Pritish Narayanan, Israel Koren, C. Mani Krishna, Csaba Andras Moritz
2011 J jnl
IEEE Trans. Parallel Distributed Syst.
Huaping Wang, Israel Koren, C. Mani Krishna
2010 conf
DFT
Priyamvada Vijayakumar, Pritish Narayanan, Israel Koren, C. Mani Krishna, Csaba Andras Moritz
2009 J jnl
Int. J. Sens. Networks
Srikanth Sundaresan, Israel Koren, Zahava Koren, C. Mani Krishna
2008 B conf
PACT
Huaping Wang, Israel Koren, C. Mani Krishna
2007 J jnl
J. Low Power Electron.
Yongkui Han, Israel Koren, C. Mani Krishna
2006 B conf
ISPASS
Huaping Wang, Yao Guo, Israel Koren, C. Mani Krishna
2006 conf
ICPADS (1)
Yizheng Zhou, Vijay Lakamraju, Israel Koren, C. Mani Krishna
2005 J jnl
J. Embed. Comput.
Yoonmee Doh, Daeyoung Kim, Yann-Hang Lee, C. Mani Krishna
2005 Misc conf
CASES
A. Goel, C. Mani Krishna, Israel Koren
2004 J jnl
IEEE Trans. Computers
C. Mani Krishna, Yann-Hang Lee
2004 C conf
PRDC
E. Ciocca, Israel Koren, Zahava Koren, C. Mani Krishna, Daniel S. Katz
2004 conf
Conf. Computing Frontiers
Saurabh Chheda, Osman S. Unsal, Israel Koren, C. Mani Krishna, Csaba Andras Moritz
2004 conf
Interaction between Compilers and Computer Architectures
Osman S. Unsal, Israel Koren, C. Mani Krishna, Csaba Andras Moritz
2004 C conf
ICCD
Yao Guo, Saurabh Chheda, Israel Koren, C. Mani Krishna, Csaba Andras Moritz
2004 conf
PACS
Yao Guo, Saurabh Chheda, Israel Koren, C. Mani Krishna, Csaba Andras Moritz
2003 A conf
DSN
Diganta Roychowdhury, Israel Koren, C. Mani Krishna, Yann-Hang Lee
2003 B conf
RTCSA
Yoonmee Doh, Daeyoung Kim, Yann-Hang Lee, C. Mani Krishna
2003 J jnl
ACM Trans. Embed. Comput. Syst.
Osman S. Unsal, Raksit Ashok, Israel Koren, C. Mani Krishna, Csaba Andras Moritz
2003 A conf
DSN
Vijay Lakamraju, Israel Koren, C. Mani Krishna
2003 A conf
DSN
Jayakrishnan Nair, Zahava Koren, Israel Koren, C. Mani Krishna
2003 J jnl
Proc. IEEE
C. Mani Krishna, Yann-Hang Lee
2003 B conf
ECRTS
Yann-Hang Lee, Krishna P. Reddy, C. Mani Krishna
2003 J jnl
Real Time Syst.
Yann-Hang Lee, C. Mani Krishna
2003 J jnl
IEEE Trans. Computers
C. Mani Krishna, Yann-Hang Lee
2002 J jnl
IEEE Comput. Archit. Lett.
Osman S. Unsal, Israel Koren, C. Mani Krishna, Csaba Andras Moritz
2002 J jnl
IEEE Trans. Parallel Distributed Syst.
Vijay Lakamraju, Israel Koren, C. Mani Krishna
2002 A conf
IPDPS
Steven Morin, Israel Koren, C. Mani Krishna
2002 A* conf
HPCA
Osman S. Unsal, Israel Koren, C. Mani Krishna, Csaba Andras Moritz
2002 A conf
ISLPED
Osman S. Unsal, Israel Koren, C. Mani Krishna
2002 A conf
IPDPS
Zahava Koren, J. Rajagopal, C. Mani Krishna, Israel Koren, W. Wang, J. Loman
2001 A* conf
MICRO
Osman S. Unsal, Raksit Ashok, Israel Koren, C. Mani Krishna, Csaba Andras Moritz
2001 Misc conf
CASES
Yann-Hang Lee, Yoonmee Doh, C. Mani Krishna
2001 J jnl
Simul.
G. Durairaj, Israel Koren, C. Mani Krishna
2000 J jnl
J. Supercomput.
Joshua Haines, Vijay Lakamraju, Israel Koren, C. Mani Krishna
2000 conf
IPDPS Workshops
Osman S. Unsal, Israel Koren, C. Mani Krishna
2000 A conf
DSN
Vijay Lakamraju, Zahava Koren, C. Mani Krishna
2000 conf
IEEE Real Time Technology and Applications Symposium
C. Mani Krishna, Yann-Hang Lee
1999 B conf
RTCSA
Yann-Hang Lee, C. Mani Krishna
1998 Misc conf
CATA
Rajeev Koodli, C. Mani Krishna
1998 conf
IPPS/SPDP Workshops
Vijay Lakamraju, Zahava Koren, Israel Koren, C. Mani Krishna
1998 conf
IPPS/SPDP Workshops
Zahava Koren, Israel Koren, C. Mani Krishna
1997 A conf
ITC
Adit D. Singh, Phil Nigh, C. Mani Krishna
1996 A* conf
INFOCOM
Anlu Yan, Aura Ganz, C. Mani Krishna
1996 J jnl
IEEE Trans. Computers
Adit D. Singh, C. Mani Krishna
1994 J jnl
Concurr. Pract. Exp.
Prabuddha Biswas, Donald F. Towsley, K. K. Ramakrishnan, C. Mani Krishna
1993 J jnl
IEEE Trans. Comput. Aided Des. Integr. Circuits Syst.
Adit D. Singh, C. Mani Krishna
1993 Misc conf
VTS
Adit D. Singh, C. Mani Krishna
1992 Misc conf
VTS
C. Mani Krishna, Adit D. Singh
1992 conf
FTCS
Adit D. Singh, C. Mani Krishna
1992 J jnl
Real Time Syst.
C. Mani Krishna, Yann-Hang Lee
1991 J jnl
J. Parallel Distributed Comput.
Dipak Sitaram, Israel Koren, C. Mani Krishna
1991 A conf
ITC
Adit D. Singh, C. Mani Krishna
1991 J jnl
IEEE Trans. Computers
Yann-Hang Lee, C. Mani Krishna
1991 J jnl
Computer
C. Mani Krishna, Yann-Hang Lee
1989 conf
FTCS
C. Mani Krishna, Adit D. Singh
1989 J jnl
IEEE Trans. Software Eng.
Kang G. Shin, C. Mani Krishna, Yann-Hang Lee
1988 A conf
ICDCS
Inderpal S. Bhandari, C. Mani Krishna, Daniel P. Siewiorek
1988 A conf
RTSS
C. Mani Krishna, Inderpal S. Bhandari
1988 J jnl
IEEE Trans. Computers
Philip S. Yu, C. Mani Krishna, Yann-Hang Lee
1988 A conf
RTSS
Kang G. Shin, C. Mani Krishna, Yann-Hang Lee
1988 A conf
ITC
C. Mani Krishna, Yann-Hang Lee
1987 conf
Computer Performance and Reliability
Philip S. Yu, C. Mani Krishna, Yann-Hang Lee
1987 J jnl
IEEE Trans. Computers
C. Mani Krishna, Kang G. Shin, Inderpal S. Bhandari
1987 A* conf
DAC
Philip S. Yu, C. Mani Krishna, Yann-Hang Lee
1986 J jnl
Comput. Syst. Sci. Eng.
Kang G. Shin, C. Mani Krishna
1986 J jnl
IEEE Trans. Computers
C. Mani Krishna, Kang G. Shin
1985 J jnl
IEEE Trans. Computers
C. Mani Krishna, Kang G. Shin, Ricky W. Butler
1985 A conf
ICDCS
Kang G. Shin, C. Mani Krishna
1984
C. Mani Krishna
1984 J jnl
Commun. ACM
C. Mani Krishna, Kang G. Shin, Yann-Hang Lee
1983 Misc conf
Performance
C. Mani Krishna, Kang G. Shin
1983 A* conf
SIGMETRICS
C. Mani Krishna, Kang G. Shin
1980 A conf
RTSS
Kang G. Shin, C. Mani Krishna
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()