Katerina Goseva-Popstojanova

84 papers A* 1A 21B 11C 5Journal 27Unranked 19
YearRankTypeTitle / Venue / Authors
2026 J jnl
Softw. Qual. J.
Yasser Alshehri, Katerina Goseva-Popstojanova
2025 J jnl
IEEE Trans. Dependable Secur. Comput.
Jessica Castro, Nuno Laranjeiro, Katerina Goseva-Popstojanova, Marco Vieira
2025 A conf
ISSRE
Mohammad Jamil Ahmad, Katerina Goseva-Popstojanova
2025 J jnl
Inf. Softw. Technol.
Horacio L. França, Katerina Goseva-Popstojanova, César Teixeira, Nuno Laranjeiro
2025 A conf
DSN
Jason Yih, Katerina Goseva-Popstojanova, Michel Cukier
2025 J jnl
CoRR
Katerina Goseva-Popstojanova, Denny Hood, Johann Schumann, Noble Nkwocha
2024 J jnl
Empir. Softw. Eng.
Mohammad Jamil Ahmad, Katerina Goseva-Popstojanova, Robyn R. Lutz
2023 B conf
COMPSAC
Katerina Goseva-Popstojanova, Denny Hood, Johann Schumann, Noble Nkwocha
2022 A conf
ISSRE
Katerina Goseva-Popstojanova, Bojan Cukic
2022 conf
ISSRE Workshops
Katerina Goseva-Popstojanova, Bojan Cukic
2022 J jnl
CoRR
Mohammad Jamil Ahmad, Katerina Goseva-Popstojanova, Robyn R. Lutz
2021 B conf
DSAA
Di Pang, Katerina Goseva-Popstojanova, Maura Mclaughlin
2020 B conf
AINA
Jarilyn M. Hernández Jiménez, Katerina Goseva-Popstojanova
2019 A conf
ISSRE
Katerina Goseva-Popstojanova, Thomas Kyanko, Noble Nkwocha
2019 conf
ICDIS
Jarilyn Hernández Jiménez, Katerina Goseva-Popstojanova
2019 conf
COMPSAC (2)
Katerina Goseva-Popstojanova, Mohammad Jamil Ahmad, Yasser Ali Alshehri
2019 conf
MoDELS (Companion)
Johann Schumann, Katerina Goseva-Popstojanova
2018 C conf
QRS
Katerina Goseva-Popstojanova, Jacob Tyo
2018 B conf
ICPP
Thomas R. Devine, Katerina Goseva-Popstojanova, Di Pang
2018 B conf
NCA
Jarilyn M. Hernández Jiménez, Katerina Goseva-Popstojanova
2018 J jnl
CoRR
Robert A. Bridges, Jarilyn M. Hernández Jiménez, Jeffrey Nichols, Katerina Goseva-Popstojanova, Stacy J. Prowell
2018 conf
TrustCom/BigDataSE
Robert A. Bridges, Jarilyn Hernández Jiménez, Jeffrey Nichols, Katerina Goseva-Popstojanova, Stacy J. Prowell
2017 J jnl
Inf. Softw. Technol.
Maggie Hamill, Katerina Goseva-Popstojanova
2017 conf
DASC/PiCom/DataCom/CyberSciTech
Masoumeh Kalantari Khandani, Wasfy Mikhael, Yaser P. Fallah, Katerina Goseva-Popstojanova
2017 A conf
ISSRE
Katerina Goseva-Popstojanova, Jacob Tyo
2017 J jnl
CoRR
Jarilyn M. Hernández Jiménez, Jeffrey A. Nichols, Katerina Goseva-Popstojanova, Stacy J. Prowell, Robert A. Bridges
2017 J jnl
IEEE Trans. Reliab.
Roberto Pietrantuono, Katerina Goseva-Popstojanova, Carol S. Smidts
2016 J jnl
Autom. Softw. Eng.
Thomas R. Devine, Katerina Goseva-Popstojanova, Sandeep Krishnan, Robyn R. Lutz
2016 conf
HASE
Raymond C. Borges-Hink, Katerina Goseva-Popstojanova
2015 J jnl
Softw. Qual. J.
Maggie Hamill, Katerina Goseva-Popstojanova
2015 J jnl
Inf. Softw. Technol.
Katerina Goseva-Popstojanova, Andrei Perhinschi
2014 J jnl
Comput. Secur.
Katerina Goseva-Popstojanova, Goce Anastasovski, Ana Dimitrijevikj, Risto Pantev, Brandon Miller
2014 conf
SERE (Companion)
Goce Anastasovski, Katerina Goseva-Popstojanova
2014 conf
AINA Workshops
Katerina Goseva-Popstojanova, Ana Dimitrijevikj
2014 J jnl
Softw. Test. Verification Reliab.
Maggie Hamill, Katerina Goseva-Popstojanova
2013 J jnl
Inf. Softw. Technol.
Sandeep Krishnan, Chris Strasburg, Robyn R. Lutz, Katerina Goseva-Popstojanova, Karin S. Dorman
2013 J jnl
IEEE Trans. Software Eng.
Nikola Janevski, Katerina Goseva-Popstojanova
2012 conf
ICC
Nikola Janevski, Katerina Goseva-Popstojanova
2012 A conf
ICST
Thomas R. Devine, Katerina Goseva-Popstojanova, Sandeep Krishnan, Robyn R. Lutz, J. Jenny Li
2012 B conf
ICCCN
Katerina Goseva-Popstojanova, Goce Anastasovski, Risto Pantev
2012 A conf
ISSRE
Katerina Goseva-Popstojanova, Goce Anastasovski, Risto Pantev
2011 conf
PROMISE
Sandeep Krishnan, Chris Strasburg, Robyn R. Lutz, Katerina Goseva-Popstojanova
2011 A conf
MSR
Sandeep Krishnan, Robyn R. Lutz, Katerina Goseva-Popstojanova
2010 B conf
AINA
Katerina Goseva-Popstojanova, Brandon Miller, Risto Pantev, Ana Dimitrijevikj
2010 A conf
ISSRE
Arin Zahalka, Katerina Goseva-Popstojanova, Jeffrey Zemerick
2010 J jnl
IEEE Trans. Software Eng.
Katerina Goseva-Popstojanova, Karama Kanoun
2010 B conf
NCA
Katerina Goseva-Popstojanova, Risto Pantev, Ana Dimitrijevikj, Brandon Miller
2009 J jnl
IEEE Trans. Software Eng.
Margaret Hamill, Katerina Goseva-Popstojanova
2009 A conf
ISSRE
Katerina Goseva-Popstojanova, Margaret Hamill
2009 B conf
AINA
Xuan Wang, Katerina Goseva-Popstojanova
2007 conf
COMPSAC (1)
Katerina Goseva-Popstojanova, Margaret Hamill
2007 B conf
NCA
Fengbin Li, Katerina Goseva-Popstojanova, Arun Ross
2007 C conf
AICCSA
Walid Abdelmoez, Katerina Goseva-Popstojanova, Hany H. Ammar
2006 A conf
DSN
Katerina Goseva-Popstojanova, Fengbin Li, Xuan Wang, Amit Sangle
2006 A conf
ISSRE
Katerina Goseva-Popstojanova, Margaret Hamill, Xuan Wang
2006 J jnl
Empir. Softw. Eng.
Katerina Goseva-Popstojanova, Ajay Deep Singh, Sunil Mazimdar, Fengbin Li
2005 A conf
ISSRE
Katerina Goseva-Popstojanova, Margaret Hamill, Ranganath Perugupalli
2005 conf
ICEBE
Venu Datla, Katerina Goseva-Popstojanova
2005 J jnl
IEEE Trans. Software Eng.
Vittorio Cortellessa, Katerina Goseva-Popstojanova, Kalaivani Appukkutty, Ajith Guedem, Ahmed E. Hassan, Rania Elnaggar, Walid Abdelmoez, Hany H. Ammar
2004 J jnl
Perform. Evaluation
Bharat B. Madan, Katerina Goseva-Popstojanova, Kalyanaraman Vaidyanathan, Kishor S. Trivedi
2004 A conf
ISSRE
Katerina Goseva-Popstojanova, Sunil Mazimdar, Ajay Deep Singh
2004 conf
HASE
Katerina Goseva-Popstojanova, Sunil Kamavaram
2003 A* conf
ICSE
Tianjian Wang, Ahmed E. Hassan, Ajith Guedem, Walid Abdelmoez, Katerina Goseva-Popstojanova, Hany H. Ammar
2003 J jnl
IEEE Trans. Software Eng.
Katerina Goseva-Popstojanova, Ahmed E. Hassan, Ajith Guedem, Walid Abdelmoez, Diaa Eldin M. Nassar, Hany H. Ammar, Ali Mili
2003 A conf
ISSRE
Katerina Goseva-Popstojanova, Sunil Kamavaram
2003 C conf
SEW
Sunil Kamavaram, Katerina Goseva-Popstojanova
2002 B conf
ICECCS
Srinivasan Ramani, Katerina Goseva-Popstojanova, Kishor S. Trivedi
2002 A conf
DSN
Bharat B. Madan, Katerina Goseva-Popstojanova, Kalyanaraman Vaidyanathan, Kishor S. Trivedi
2001 J jnl
Perform. Evaluation
Katerina Goseva-Popstojanova, Kishor S. Trivedi
2001 J jnl
Comput. J.
Tadashi Dohi, Katerina Goseva-Popstojanova, Kishor S. Trivedi
2001 A conf
ISSRE
Katerina Goseva-Popstojanova, Aditya P. Mathur, Kishor S. Trivedi
2000 conf
HASE
Tadashi Dohi, Katerina Goseva-Popstojanova, Kishor S. Trivedi
2000 C conf
PRDC
Katerina Goseva-Popstojanova, Kishor S. Trivedi
2000 J jnl
IEEE Trans. Reliab.
Katerina Goseva-Popstojanova, Kishor S. Trivedi
2000 conf
Annual Simulation Symposium
Kishor S. Trivedi, Kalyanaraman Vaidyanathan, Katerina Goseva-Popstojanova
2000 C conf
PRDC
Tadashi Dohi, Katerina Goseva-Popstojanova, Kishor S. Trivedi
2000 conf
Performance Evaluation
Katerina Goseva-Popstojanova, Kishor S. Trivedi
1999 A conf
ISSRE
Katerina Goseva-Popstojanova, Kishor S. Trivedi
1997 conf
EUROMICRO
Katerina Goseva-Popstojanova, Aksenti Grnarov
1996 conf
EUROMICRO
Katerina Goseva-Popstojanova, Aksenti Grnarov
1995 A conf
ISSRE
Katerina Goseva-Popstojanova, Aksenti Grnarov
1993 A conf
ISSRE
Katerina Goseva-Popstojanova, Aksenti Grnarov
1993 J jnl
Microprocess. Microprogramming
Katerina Goseva-Popstojanova, Aksenti Grnarov
1991 A conf
ISSRE
Katerina Goseva-Popstojanova
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