J. Soumya

36 papers C 2Misc 5Journal 9Unranked 20
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Access
Mekala Bindu Bhargavi, Sai Siddharth Rokkam, Vattipelli Srinath, Sri Parameswaran, J. Soumya
2024 conf
C3AI
Jitesh Choudhary, Peddada Srinivasa Varshith, J. Soumya
2024 Misc conf
VLSID
N. Vamshi Krishna, Anushka Chaudhary, J. Soumya
2023 conf
PRIME
N. Vamshi Krishna, Rahul Tripathy, Joshitha Marripudi, J. Soumya
2023 conf
SMACD
N. Vamshi Krishna, Aruna, J. Soumya
2022 Misc conf
VLSID
M. K. Aparna Nair, Police Manoj Kumar Reddy, Y. L. Abijith, Venkatesh Rajagopalan, J. Soumya
2022 conf
VDAT
M. K. Aparna Nair, Vishwas Vasuki Gautam, Abhishek Revinipati, J. Soumya
2022 conf
VDAT
Jitesh Choudhary, Vishesh Bindal, J. Soumya
2022 J jnl
IEEE Access
Jagadheesh Samala, P. Veda Bhanu, J. Soumya, Linga Reddy Cenkeramaddi
2021 Misc conf
COMSNETS
Prabhat Kumar Rai, Abhinav Kumar, Mohammed Zafar Ali Khan, J. Soumya, Linga Reddy Cenkeramaddi
2021 C conf
DSD
M. K. Aparna Nair, P. Veda Bhanu, J. Soumya, Linga Reddy Cenkeramaddi
2021 J jnl
IEEE Access
P. Veda Bhanu, Rahul Govindan, Rajat Kumar, Vishal Singh, J. Soumya, Linga Reddy Cenkeramaddi
2021 J jnl
IEEE Access
P. Veda Bhanu, Rahul Govindan, Plava Kattamuri, J. Soumya, Linga Reddy Cenkeramaddi
2021 Misc conf
COMSNETS
Jyoti Bhatia, Aveen Dayal, Ajit Jha, Santosh Kumar Vishvakarma, J. Soumya, M. B. Srinivas, Phaneendra K. Yalavarthy, Abhinav Kumar, V. Lalitha, Sagar Koorapati, Linga Reddy Cenkeramaddi
2020 conf
iSES
Hari Bhusal, Pankaj Khatiwada, Ajit Jha, J. Soumya, Sagar Koorapati, Linga Reddy Cenkeramaddi
2020 C conf
ISCAS
P. Veda Bhanu, Chetan Kumar Vudadha, J. Soumya
2019 conf
PRIME
P. Veda Bhanu, S. Jagadheesh, Vasanth Bhat, Garima Agarwal, J. Soumya
2019 conf
ICIIS
P. Veda Bhanu, J. Soumya
2019 conf
WF-IoT
Rolf Arne Kjellby, Linga Reddy Cenkeramaddi, Anders Frøytlog, Baltasar Beferull-Lozano, J. Soumya, Meghana Bhange
2019 conf
VDAT
P. Veda Bhanu, Pranav Venkatesh Kulkarni, Sai Pranavi Avadhanam, J. Soumya, Linga Reddy Cenkeramaddi
2019 Misc conf
VLSID
Mohit Upadhyay, Monil Shah, P. Veda Bhanu, J. Soumya, Linga Reddy Cenkeramaddi
2018 conf
VDAT
Monil Shah, Mohit Upadhyay, P. Veda Bhanu, J. Soumya, Linga Reddy Cenkeramaddi
2018 conf
iSES
Linga Reddy Cenkeramaddi, Ashish Goyal, Asheesh Bhuria, M. B. Srinivas, J. Soumya
2018 conf
RAIT
Divvya Sinha, Ashmita Roy, Kunchakuri Varun Kumar, Pranav Venkatesh Kulkarni, J. Soumya
2018 conf
HPCS
Mohit Upadhyay, Monil Shah, P. Veda Bhanu, J. Soumya, Linga Reddy Cenkeramaddi
2018 conf
ANTS
Rolf Arne Kjellby, Linga Reddy Cenkeramaddi, Thor Eirik Johnsrud, Svein Erik Løtveit, Geir Jevne, Baltasar Beferull-Lozano, J. Soumya
2018 conf
iSES
Henning Idsoe, Linga Reddy Cenkeramaddi, J. Soumya
2017 conf
ISED
Parth Shah, Kanniganti Abhishek, J. Soumya
2017 J jnl
J. Circuits Syst. Comput.
J. Soumya, K. Niranjan Babu, Santanu Chattopadhyay
2017 conf
iNIS
Grandhi Sai Anirudh, J. Soumya
2015 conf
VDAT
Sandeep D'Souza, J. Soumya, Santanu Chattopadhyay
2015 J jnl
J. Syst. Archit.
J. Soumya, Srijan Tiwary, Santanu Chattopadhyay
2015 J jnl
J. Syst. Archit.
J. Soumya, Kundan Kumar, Santanu Chattopadhyay
2013 J jnl
J. Syst. Archit.
J. Soumya, Santanu Chattopadhyay
2012 J jnl
Microprocess. Microsystems
Santanu Kundu, J. Soumya, Santanu Chattopadhyay
2011 conf
ISVLSI
J. Soumya, Putta Venkatesh, Santanu Chattopadhyay
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