Raghvendra V. Cowlagi

51 papers A* 1A 1C 15Misc 1Journal 15Unranked 16
YearRankTypeTitle / Venue / Authors
2025 C conf
ACC
Prakash Poudel, Jeffrey A. DesRoches, Raghvendra V. Cowlagi
2025 J jnl
CoRR
Prakash Poudel, Jeffrey A. DesRoches, Raghvendra V. Cowlagi
2025 J jnl
CoRR
Nachiket Bapat, Randy C. Paffenroth, Raghvendra V. Cowlagi
2025 J jnl
CoRR
Alexandra E. Ballentine, Raghvendra V. Cowlagi
2025 C conf
ACC
Jeffrey A. DesRoches, Raghvendra V. Cowlagi
2025 J jnl
CoRR
Jeffrey A. DesRoches, Raghvendra V. Cowlagi
2025 J jnl
CoRR
Prakash Poudel, Raghvendra V. Cowlagi
2025 conf
ECC
Nachiket Bapat, Randy C. Paffenroth, Raghvendra V. Cowlagi
2025 J jnl
CoRR
Nachiket Bapat, Randy C. Paffenroth, Raghvendra V. Cowlagi
2025 J jnl
CoRR
Alexandra E. Ballentine, Raghvendra V. Cowlagi
2024 C conf
ACC
Nachiket Bapat, Randy C. Paffenroth, Raghvendra V. Cowlagi
2024 C conf
ACC
Prakash Poudel, Raghvendra V. Cowlagi
2023 J jnl
Autom.
Chase St. Laurent, Raghvendra V. Cowlagi
2022 C conf
ACC
Chase St. Laurent, Raghvendra V. Cowlagi
2022 conf
DDDAS
Chase St. Laurent, Raghvendra V. Cowlagi
2022 J jnl
Autom.
Jie Fang, Zetian Zhang, Raghvendra V. Cowlagi
2021 conf
CDC
Chase St. Laurent, Raghvendra V. Cowlagi
2021 C conf
ACC
Chase St. Laurent, Raghvendra V. Cowlagi
2021 conf
ECC
Chase St. Laurent, Raghvendra V. Cowlagi
2021 conf
VTC Spring
Raghvendra V. Cowlagi, Rebecca C. Debski, Alexander M. Wyglinski
2020 conf
VTC Spring
Nivetha Kanthasamy, Alexander M. Wyglinski, Raghvendra V. Cowlagi
2019 conf
ECC
Benjamin S. Cooper, Raghvendra V. Cowlagi
2019 J jnl
Autom.
Benjamin S. Cooper, Raghvendra V. Cowlagi
2018 conf
VTC Fall
Nivetha Kanthasamy, Ruixiang Du, Kuldeep S. Gill, Alexander M. Wyglinski, Raghvendra V. Cowlagi
2018 ch.
Handbook of Dynamic Data Driven Applications Systems
Benjamin S. Cooper, Raghvendra V. Cowlagi
2018 C conf
ACC
Benjamin S. Cooper, Raghvendra V. Cowlagi
2018 conf
VTC Fall
Nivetha Kanthasamy, Raghvendra V. Cowlagi, Alexander M. Wyglinski
2017 J jnl
Autom.
Raghvendra V. Cowlagi
2017 conf
CDC
Ruixiang Du, Raghvendra V. Cowlagi
2016 C conf
ACC
Zetian Zhang, Raghvendra V. Cowlagi
2016 C conf
ACC
Raghvendra V. Cowlagi, Zetian Zhang
2015 conf
ADHS
Raghvendra V. Cowlagi
2015 conf
ECC
Zetian Zhang, Raghvendra V. Cowlagi
2014 J jnl
IEEE Trans. Robotics
Raghvendra V. Cowlagi, Panagiotis Tsiotras
2014 C conf
ACC
Raghvendra V. Cowlagi, David N. Kordonowy
2014 conf
CDC
Raghvendra V. Cowlagi
2013 Misc conf
ICCS
Douglas L. Allaire, J. Chambers, Raghvendra V. Cowlagi, David N. Kordonowy, M. Lecerf, Laura Mainini, F. Ulker, Karen Willcox
2013 C conf
ACC
Jeong hwan Jeon, Raghvendra V. Cowlagi, Steven C. Peters, Sertac Karaman, Emilio Frazzoli, Panagiotis Tsiotras, Karl Iagnemma
2012 J jnl
IEEE Trans. Robotics
Raghvendra V. Cowlagi, Panagiotis Tsiotras
2012 A* conf
ICRA
Raghvendra V. Cowlagi, Panagiotis Tsiotras
2012 J jnl
IEEE Trans. Syst. Man Cybern. Part B
Raghvendra V. Cowlagi, Panagiotis Tsiotras
2011
Raghvendra V. Cowlagi
2011 A conf
IROS
Raghvendra V. Cowlagi, Panagiotis Tsiotras
2010 J jnl
Reliab. Eng. Syst. Saf.
Joseph Homer Saleh, Karen B. Marais, Efstathios Bakolas, Raghvendra V. Cowlagi
2010 C conf
ACC
Raghvendra V. Cowlagi, Panagiotis Tsiotras
2010 conf
CDC
Raghvendra V. Cowlagi, Panagiotis Tsiotras
2010 C conf
ACC
Raghvendra V. Cowlagi, Panagiotis Tsiotras
2009 C conf
ACC
Raghvendra V. Cowlagi, Panagiotis Tsiotras
2008 C conf
ACC
Raghvendra V. Cowlagi, Panagiotis Tsiotras
2007 conf
CDC
Raghvendra V. Cowlagi, Panagiotis Tsiotras
2006 conf
CDC
Sanjay P. Bhat, Raghvendra V. Cowlagi
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