R. K. Agrawal

96 papers C 1Misc 1Journal 59Unranked 32
YearRankTypeTitle / Venue / Authors
2025 J jnl
Int. J. Mach. Learn. Cybern.
Pinki Kumari, R. K. Agrawal, Aditi Priya
2024 conf
BDA
Avni Mishra, R. K. Agrawal, Pinki Kumari
2024 J jnl
Soft Comput.
Aditi Priya, R. K. Agrawal, Bharti Rana
2024 J jnl
ACM Trans. Comput. Heal.
Trasha Gupta, R. K. Agrawal, Rishu Sangal, S. Avinash Rao
2023 J jnl
Appl. Soft Comput.
Puneet Kumar, R. K. Agrawal, Dhirendra Kumar
2023 J jnl
Multim. Tools Appl.
Ashish Kumar, R. K. Agrawal, Leve Joseph
2022 J jnl
IEEE Trans. Fuzzy Syst.
Dhirendra Kumar, R. K. Agrawal, Puneet Kumar
2022 J jnl
Comput. Biol. Medicine
Baljeet Kaur, Swati Rathi, R. K. Agrawal
2022 J jnl
CoRR
Ashish Kumar, R. K. Agrawal, Leve Joseph
2022 conf
CVMI
Puneet Kumar, R. K. Agrawal, Dhirendra Kumar
2022 J jnl
Appl. Soft Comput.
Parul Agarwal, R. K. Agrawal, Baljeet Kaur
2022 J jnl
Multim. Tools Appl.
Swati Rathi, Baljeet Kaur, R. K. Agrawal
2021 ed.
PAKDD (1)
Kamal Karlapalem, Hong Cheng, Naren Ramakrishnan, R. K. Agrawal, P. Krishna Reddy, Jaideep Srivastava, Tanmoy Chakraborty
2021 ed.
PAKDD (2)
Kamal Karlapalem, Hong Cheng, Naren Ramakrishnan, R. K. Agrawal, P. Krishna Reddy, Jaideep Srivastava, Tanmoy Chakraborty
2021 ed.
PAKDD (3)
Kamal Karlapalem, Hong Cheng, Naren Ramakrishnan, R. K. Agrawal, P. Krishna Reddy, Jaideep Srivastava, Tanmoy Chakraborty
2021 conf
ACCC
Harsh Bhasin, R. K. Agrawal
2021 C conf
BIBE
Harsh Bhasin, R. K. Agrawal
2021 J jnl
Appl. Soft Comput.
R. K. Agrawal, Baljeet Kaur, Parul Agarwal
2020 J jnl
Appl. Soft Comput.
Jyoti Singh Kirar, R. K. Agrawal
2020 J jnl
Neurocomputing
Akshansh Gupta, R. K. Agrawal, Jyoti Singh Kirar, Baljeet Kaur, Weiping Ding, Chin-Teng Lin, Javier Andreu-Perez, Mukesh Prasad
2020 J jnl
Soft Comput.
Dhirendra Kumar, R. K. Agrawal, Hanuman Verma
2020 J jnl
Appl. Soft Comput.
R. K. Agrawal, Baljeet Kaur, Surbhi Sharma
2019 J jnl
Multim. Tools Appl.
Dhirendra Kumar, Hanuman Verma, Aparna Mehra, R. K. Agrawal
2019 J jnl
Knowl. Inf. Syst.
Rinki Arya, R. K. Agrawal, Navjot Singh
2019 conf
BDA
R. K. Agrawal, Akanksha Juneja
2019 conf
PReMI (1)
Swati Rathi, Baljeet Kaur, R. K. Agrawal
2019 J jnl
Multidimens. Syst. Signal Process.
Namita Aggarwal, Bharti Rana, R. K. Agrawal
2018 J jnl
Comput. Methods Programs Biomed.
Akanksha Juneja, Bharti Rana, R. K. Agrawal
2018 J jnl
Multim. Tools Appl.
Navjot Singh, Rinki Arya, R. K. Agrawal
2018 J jnl
J. Medical Syst.
Jyoti Singh Kirar, R. K. Agrawal
2018 conf
SSCI
Jyoti Singh Kirar, R. K. Agrawal
2018 J jnl
Multim. Tools Appl.
Akanksha Juneja, Bharti Rana, R. K. Agrawal
2017 J jnl
Appl. Intell.
Rinki Arya, Navjot Singh, R. K. Agrawal
2017 J jnl
Multim. Tools Appl.
Navjot Singh, Rinki Arya, R. K. Agrawal
2017 J jnl
Int. J. Comput. Vis. Robotics
Akanksha Juneja, Bharti Rana, R. K. Agrawal
2017 J jnl
Biomed. Signal Process. Control.
Jyoti Singh Kirar, R. K. Agrawal
2017 J jnl
Biomed. Signal Process. Control.
Bharti Rana, Akanksha Juneja, Mohit Saxena, Sunita Gudwani, S. Senthil Kumaran, Madhuri Behari, R. K. Agrawal
2017 conf
PReMI
Jyoti Singh Kirar, Ayesha Choudhary, R. K. Agrawal
2016 J jnl
Biomed. Signal Process. Control.
Akanksha Juneja, Bharti Rana, R. K. Agrawal
2016 J jnl
Digit. Signal Process.
Navjot Singh, Rinki Arya, R. K. Agrawal
2016 J jnl
Int. J. Knowl. Based Intell. Eng. Syst.
Manju Sardana, R. K. Agrawal, Baljeet Kaur
2016 J jnl
Multim. Tools Appl.
Rinki Arya, Navjot Singh, R. K. Agrawal
2016 J jnl
Appl. Soft Comput.
Hanuman Verma, R. K. Agrawal, Aditi Sharan
2016 J jnl
Int. J. Artif. Intell. Soft Comput.
Nitin Kumar, R. K. Agrawal
2016 conf
ICVGIP
Bharti Rana, Akanksha Juneja, Mohit Saxena, Sunita Gudwani, S. Senthil Kumaran, R. K. Agrawal, Madhuri Behari
2015 J jnl
Int. J. Imaging Syst. Technol.
Namita Aggarwal, Bharti Rana, R. K. Agrawal
2015 J jnl
Int. J. Bioinform. Res. Appl.
Namita Aggarwal, Bharti Rana, R. K. Agrawal, S. Senthil Kumaran
2015 J jnl
Int. J. Comput. Math.
Manju Sardana, R. K. Agrawal, Baljeet Kaur
2015 J jnl
Int. J. Appl. Pattern Recognit.
Ajay Jaiswal, Nitin Kumar, R. K. Agrawal
2015 J jnl
Int. J. Knowl. Based Intell. Eng. Syst.
Nitin Kumar, R. K. Agrawal
2015 J jnl
Signal Image Video Process.
Navjot Singh, R. K. Agrawal
2015 J jnl
Int. J. Imaging Syst. Technol.
Bharti Rana, Akanksha Juneja, Mohit Saxena, Sunita Gudwani, S. Senthil Kumaran, Madhuri Behari, R. K. Agrawal
2015 conf
IHCI
Jyoti Singh Kirar, R. K. Agrawal
2015 J jnl
Soft Comput.
Akshansh Gupta, R. K. Agrawal, Baljeet Kaur
2015 J jnl
Int. J. Artif. Intell. Tools
Hanuman Verma, R. K. Agrawal
2015 J jnl
Expert Syst. Appl.
Bharti Rana, Akanksha Juneja, Mohit Saxena, Sunita Gudwani, S. Senthil Kumaran, R. K. Agrawal, Madhuri Behari
2014 conf
SIRS
Nitin Kumar, R. K. Agrawal, Ajay Jaiswal
2014 conf
MICAI (Special Sessions)
Akanksha Juneja, Bharti Rana, R. K. Agrawal
2014 conf
ICVGIP
Akanksha Juneja, Bharti Rana, R. K. Agrawal
2014 J jnl
Neural Comput. Appl.
Ratnadip Adhikari, R. K. Agrawal
2014 J jnl
Neural Comput. Appl.
Ratnadip Adhikari, R. K. Agrawal
2014 J jnl
Pattern Recognit.
Navjot Singh, Rinki Arya, R. K. Agrawal
2014 J jnl
Int. J. Comput. Vis. Image Process.
Nitin Kumar, R. K. Agrawal, Ajay Jaiswal
2014 J jnl
Artif. Intell. Rev.
Ratnadip Adhikari, R. K. Agrawal
2013 J jnl
CoRR
Ratnadip Adhikari, R. K. Agrawal
2013 J jnl
CoRR
Ratnadip Adhikari, R. K. Agrawal
2013 conf
PAKDD Workshops
Manju Sardana, R. K. Agrawal, Baljeet Kaur
2013 J jnl
CoRR
Ratnadip Adhikari, R. K. Agrawal
2013 Misc conf
FLAIRS
Namita Aggarwal, Bharti Rana, R. K. Agrawal
2013 J jnl
Int. J. Appl. Evol. Comput.
Ratnadip Adhikari, R. K. Agrawal
2013 J jnl
CoRR
Ratnadip Adhikari, R. K. Agrawal, Laxmi Kant
2012 conf
PAKDD (1)
Ratnadip Adhikari, R. K. Agrawal
2012 conf
ICACCI
Akshansh Gupta, R. K. Agrawal, Baljeet Kaur
2012 J jnl
Int. J. Comput. Vis. Image Process.
Namita Aggarwal, Bharti Rana, R. K. Agrawal
2012 conf
RAIT
Ratnadip Adhikari, R. K. Agrawal
2012 conf
ICIAR (2)
Namita Aggarwal, Bharti, R. K. Agrawal
2012 J jnl
Int. J. Comput. Vis. Image Process.
Ajay Jaiswal, Nitin Kumar, R. K. Agrawal
2012 conf
MICAI (1)
Manju Sardana, Baljeet Kaur, R. K. Agrawal
2012 conf
PAKDD (2)
Akshansh Gupta, R. K. Agrawal
2012 conf
MICAI (1)
Bharti Rana, R. K. Agrawal
2012 conf
MICAI (1)
Ajay Jaiswal, Nitin Kumar, R. K. Agrawal
2011 conf
IICAI
Hanuman Verma, R. K. Agrawal
2011 conf
IICAI
Ratnadip Adhikari, R. K. Agrawal
2011 conf
SocProS (2)
Hanuman Verma, R. K. Agrawal
2011 J jnl
Informatica (Slovenia)
Rajni Bala, R. K. Agrawal
2011 J jnl
Informatica (Slovenia)
Manju Bala, R. K. Agrawal
2010 conf
IC3 (1)
Rajni Bala, R. K. Agrawal
2010 conf
DMIN
Manju Bala, Namita Aggarwal, R. K. Agrawal
2010 conf
PAKDD (2)
Rajni Bala, R. K. Agrawal, Manju Sardana
2009 conf
IICAI
Manju Bala, R. K. Agrawal
2009 conf
ARTCom
Manju Bala, R. K. Agrawal
2009 conf
PReMI
G. K. Rajput, R. K. Agrawal
2009 conf
DMIN
R. K. Agrawal, Ashish Chaudhary
2008 conf
ICVGIP
R. K. Agrawal, Rajni Bala, Manju Bala
2008 J jnl
Pattern Recognit. Lett.
R. K. Agrawal, Rajni Bala
2008 J jnl
Pattern Recognit.
R. K. Agrawal, Karmeshu
tests/unit/test_smali_normalization.py
← Index tests/unit/test_smali_normalization.py python
"""Unit tests for smali semantic normalization.

Tests the three normalization levels (category, opcode, opcode_api),
opcode categorization, ACFG feature index mapping, and integration
with MinHash computation.
"""
import pytest

pytestmark = [pytest.mark.unit, pytest.mark.apk, pytest.mark.decompile]


class TestCategorizeOpcode:
    """Tests for opcode -> semantic category mapping."""

    def test_arithmetic(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("add-int") == "ALU"
        assert categorize_opcode("mul-long/2addr") == "ALU"
        assert categorize_opcode("neg-int") == "ALU"

    def test_data_movement(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("move-result") == "MOV"
        assert categorize_opcode("const/4") == "CONST"
        assert categorize_opcode("const-string") == "CONST"

    def test_memory_access(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("iget-object") == "LOAD"
        assert categorize_opcode("sput-wide") == "STORE"
        assert categorize_opcode("aget-byte") == "LOAD"

    def test_invocation(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("invoke-virtual") == "CALL"
        assert categorize_opcode("invoke-static") == "CALL"
        assert categorize_opcode("invoke-direct") == "CALL"

    def test_control_flow(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("if-eqz") == "BRANCH"
        assert categorize_opcode("goto") == "JMP"
        assert categorize_opcode("goto/16") == "JMP"
        assert categorize_opcode("return-void") == "RET"

    def test_comparison(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("cmp-long") == "CMP"
        assert categorize_opcode("cmpl-float") == "CMP"
        assert categorize_opcode("cmpg-double") == "CMP"

    def test_conversion(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("int-to-long") == "CONV"
        assert categorize_opcode("float-to-int") == "CONV"

    def test_object_type(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("new-instance") == "ALLOC"
        assert categorize_opcode("check-cast") == "TYPE"
        assert categorize_opcode("instance-of") == "TYPE"

    def test_exception_sync(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("throw") == "EXC"
        assert categorize_opcode("monitor-enter") == "SYNC"

    def test_unknown(self):
        from redb.extractors.decompiler.apk.smali_normalization import categorize_opcode
        assert categorize_opcode("nop") == "OTHER"


class TestNormalizeInstruction:
    """Tests for single instruction normalization at various levels."""

    def test_category_level(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        assert normalize_instruction("add-int v0, v1, v2", "category") == "ALU"
        assert normalize_instruction("invoke-virtual {p0}, Lcom/Foo;->bar()V", "category") == "CALL"
        assert normalize_instruction("return-void", "category") == "RET"

    def test_opcode_level_strips_width(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        # Width variants collapse to same base
        assert normalize_instruction("add-int v0, v1, v2", "opcode") == "add"
        assert normalize_instruction("add-long v0, v2, v4", "opcode") == "add"
        assert normalize_instruction("add-float v0, v1, v2", "opcode") == "add"
        # Addressing modes collapse too
        assert normalize_instruction("add-int/2addr v0, v1", "opcode") == "add"

    def test_opcode_api_invoke(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "invoke-virtual {p0, v0}, Lcom/example/Foo;->bar(I)V"
        )
        assert result == "CALL Lcom/example/Foo;->bar(I)V"

    def test_opcode_api_invoke_no_ref(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        # If somehow no method ref is found, fallback to CALL
        assert normalize_instruction("invoke-virtual {v0}") == "CALL"

    def test_opcode_api_field_load(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "iget-object v0, p0, Lcom/Foo;->mField:Ljava/lang/String;"
        )
        assert result == "LOAD Lcom/Foo;->mField:Ljava/lang/String;"

    def test_opcode_api_field_store(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "iput-object v0, p0, Lcom/Foo;->mField:Ljava/lang/String;"
        )
        assert result == "STORE Lcom/Foo;->mField:Ljava/lang/String;"

    def test_opcode_api_androguard_field_format(self):
        """androguard uses space instead of colon in field references."""
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "iget-object v0, p0, Lcom/Foo;->mField Ljava/lang/String;"
        )
        assert result.startswith("LOAD")
        assert "Lcom/Foo;->mField" in result

    def test_opcode_api_new_instance(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            "new-instance v0, Lcom/example/MyClass;"
        )
        assert result == "ALLOC Lcom/example/MyClass;"

    def test_opcode_api_const_string(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            'const-string v0, "hello world"'
        )
        assert result == 'CONST_STR "hello world"'

    def test_opcode_api_const_string_jumbo(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        result = normalize_instruction(
            'const-string/jumbo v0, "large string"'
        )
        assert result == 'CONST_STR "large string"'

    def test_opcode_api_fallback_to_category(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        # Non-special instructions fall back to category
        assert normalize_instruction("add-int v0, v1, v2") == "ALU"
        assert normalize_instruction("return-void") == "RET"
        assert normalize_instruction("nop") == "OTHER"

    def test_empty_input(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_instruction
        assert normalize_instruction("") == ""
        assert normalize_instruction("   ") == ""


class TestNormalizeMethodBody:
    """Tests for full method body normalization."""

    def test_filters_directives_labels_comments(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_method_body
        body = """\
.locals 2
# comment
:label_0
add-int v0, v1, v2
.line 42
invoke-virtual {p0}, Lcom/Foo;->bar()V
return-void
"""
        result = normalize_method_body(body, "category")
        assert result == ["ALU", "CALL", "RET"]

    def test_opcode_api_preserves_api_refs(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_method_body
        body = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/Foo;->setX(I)V
iget-object v1, p0, Lcom/Foo;->name:Ljava/lang/String;
return-void
"""
        result = normalize_method_body(body, "opcode_api")
        assert result[0] == "CONST"
        assert result[1] == "CALL Lcom/Foo;->setX(I)V"
        assert result[2] == "LOAD Lcom/Foo;->name:Ljava/lang/String;"
        assert result[3] == "RET"

    def test_empty_body(self):
        from redb.extractors.decompiler.apk.smali_normalization import normalize_method_body
        assert normalize_method_body("") == []
        assert normalize_method_body("\n\n") == []


class TestNormalizationWithMinHash:
    """Integration tests: normalization + MinHash computation."""

    def test_minhash_returns_signature(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/Foo;->bar(I)V
iget-object v1, p0, Lcom/Foo;->name:Ljava/lang/String;
add-int v2, v0, v1
return-void
"""
        sig = compute_minhash(body)
        assert sig is not None
        assert len(sig) == 64
        assert all(0 <= v < 256 for v in sig)

    def test_minhash_register_invariance(self):
        """Same operations with different registers should produce identical signatures."""
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body_a = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/Foo;->bar(I)V
iget-object v1, p0, Lcom/Foo;->name:Ljava/lang/String;
add-int v2, v0, v1
return-void
"""
        body_b = """\
const/4 v3, 0x0
invoke-virtual {p1, v3}, Lcom/Foo;->bar(I)V
iget-object v4, p1, Lcom/Foo;->name:Ljava/lang/String;
add-int v5, v3, v4
return-void
"""
        sig_a = compute_minhash(body_a)
        sig_b = compute_minhash(body_b)
        assert sig_a == sig_b

    def test_minhash_width_invariance(self):
        """Width variants of same operations should produce identical signatures."""
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body_int = """\
add-int v0, v1, v2
sub-int v3, v0, v1
mul-int v4, v0, v3
return v4
"""
        body_long = """\
add-long v0, v2, v4
sub-long v6, v0, v2
mul-long v8, v0, v6
return-wide v8
"""
        sig_int = compute_minhash(body_int)
        sig_long = compute_minhash(body_long)
        # Both normalize to ALU, ALU, ALU, RET -> identical
        assert sig_int == sig_long

    def test_minhash_different_apis_differ(self):
        """Methods calling different APIs should produce different signatures."""
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        body_a = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/crypto/AES;->encrypt([B)[B
invoke-virtual {v0}, Ljava/io/OutputStream;->write([B)V
return-void
"""
        body_b = """\
const/4 v0, 0x0
invoke-virtual {p0, v0}, Ljava/lang/String;->length()I
invoke-virtual {v0}, Ljava/io/PrintStream;->println(I)V
return-void
"""
        sig_a = compute_minhash(body_a)
        sig_b = compute_minhash(body_b)
        assert sig_a != sig_b

    def test_minhash_too_few_instructions(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_minhash
        assert compute_minhash("return-void\nnop") is None


class TestACFGBlockFeatures:
    """Tests for per-block ACFG feature extraction via smali_cfg."""

    def test_simple_linear_method(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
add-int v0, v1, v2
invoke-virtual {p0}, Lcom/Foo;->bar()V
return-void
"""
        metrics = compute_cfg_metrics(body)
        assert metrics.block_count >= 1
        assert len(metrics.block_features) == metrics.block_count
        # Each feature vector has 8 elements
        for feat in metrics.block_features:
            assert len(feat) == 8

    def test_branching_method_has_multiple_blocks(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
const/4 v0, 0x0
if-eqz v0, :cond_0
invoke-virtual {p0}, Lcom/Foo;->a()V
goto :goto_0
:cond_0
invoke-virtual {p0}, Lcom/Foo;->b()V
:goto_0
return-void
"""
        metrics = compute_cfg_metrics(body)
        assert metrics.block_count >= 3
        assert len(metrics.block_features) == metrics.block_count

    def test_feature_vector_arithmetic_count(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
add-int v0, v1, v2
sub-int v3, v0, v1
mul-int v4, v0, v3
return v4
"""
        metrics = compute_cfg_metrics(body)
        assert len(metrics.block_features) == 1
        feat = metrics.block_features[0]
        # feat[0] = instr_count (4), feat[1] = arithmetic (3)
        assert feat[0] == 4
        assert feat[1] >= 3  # 3 ALU ops

    def test_feature_vector_call_count(self):
        from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
        body = """\
invoke-virtual {p0}, Lcom/A;->a()V
invoke-static {v0}, Lcom/B;->b()V
return-void
"""
        metrics = compute_cfg_metrics(body)
        feat = metrics.block_features[0]
        # feat[4] = call count
        assert feat[4] == 2