Canfeng Chen

72 papers A 2B 17C 4Misc 2Journal 21Unranked 26
YearRankTypeTitle / Venue / Authors
2025 J jnl
Syst.
Qigan Shao, Zhaoqin Lu, Xinlu Lin, Canfeng Chen, James J. H. Liou
2020 J jnl
IEEE Access
Yayun Xin, Jin Yi, Kai Zhang, Canfeng Chen, Jian Xiong
2019 J jnl
IEEE Access
Ze Wang, Chao Gao, Canfeng Chen, Jian Xiong, Kai Zhang
2015 J jnl
IEEE Trans. Parallel Distributed Syst.
Huan Zhou, Jie Wu, Hongyang Zhao, Shaojie Tang, Canfeng Chen, Jiming Chen
2014 Misc conf
ICASSP
Xie Wen, Xianjun Jiao, Pekka Jääskeläinen, Heikki Kultala, Canfeng Chen, Heikki Berg, Zhisong Bie
2014 B conf
WCNC
Jianwei Niu, Wenfang Song, Chuang Liu, Lei Shu, Canfeng Chen
2013 B conf
IWCMC
Xianjun Jiao, Canfeng Chen, Pekka Jääskeläinen, Vladimír Guzma, Heikki Berg
2013 conf
ICCT
Chengjun Liu, Zhisong Bie, Canfeng Chen, Xianjun Jiao
2013 J jnl
IEICE Trans. Commun.
Chunxiao Jiang, Hongyang Chen, Peisen Zhao, Nengqiang He, Canfeng Chen, Yong Ren
2013 conf
VTC Spring
Jia Liu, Canfeng Chen, Yan Ma, Ying Xu
2013 J jnl
IEEE Trans. Parallel Distributed Syst.
Fengyuan Ren, Jiao Zhang, Yongwei Wu, Tao He, Canfeng Chen, Chuang Lin
2013 conf
VTC Fall
Jia Liu, Canfeng Chen, Yan Ma, Ying Xu
2013 conf
MSN
Wenlong Yue, Yuanyuan Zhang, Zhenquan Qin, Ming Zhu, Cheng Jin, Lei Wang, Lei Shu, Canfeng Chen
2013 B conf
MASS
Huan Zhou, Jie Wu, Hongyang Zhao, Shaojie Tang, Canfeng Chen, Jiming Chen
2013 B conf
GLOBECOM
Hongyang Zhao, Huan Zhou, Canfeng Chen, Jiming Chen
2013 J jnl
ACM Trans. Sens. Networks
Yinsheng Xu, Fengyuan Ren, Tao He, Chuang Lin, Canfeng Chen, Sajal K. Das
2013 conf
ICCT
Zhengli Xu, Zhisong Bie, Canfeng Chen, Xianjun Jiao
2013 J jnl
Telecommun. Syst.
Long Cheng, Weiwei Jiao, Min Chen, Canfeng Chen, Jian Ma
2012 conf
ICC
Wenlong Yue, Lei Wang, Cheng Jin, Xiaokang Liu, Ming Zhu, Zhenquan Qin, Canfeng Chen
2012 J jnl
Int. J. Commun. Syst.
Long Cheng, Canfeng Chen, Jian Ma, Lei Shu
2012 J jnl
IEEE Commun. Lett.
Jia Liu, Canfeng Chen, Yan Ma
2012 B conf
GLOBECOM
Jia Liu, Canfeng Chen, Yan Ma
2011 J jnl
IEEE Trans. Ind. Electron.
Yu Yang, Yongjun Xu, Xiaowei Li, Canfeng Chen
2011 B conf
MASS
Nengqiang He, Zhihua Li, Chunxiao Jiang, Chaoqun Yang, Shuai Fan, Xin Ma, Yong Ren, Jinfeng Zhang, Canfeng Chen
2011 J jnl
Pervasive Mob. Comput.
Vaskar Raychoudhury, Jiannong Cao, Weigang Wu, Yi Lai, Canfeng Chen, Jian Ma
2011 B conf
MASS
Yongping Xiong, Wenbo He, Canfeng Chen, Jian Ma, Limin Sun
2011 A conf
MobiSys
Wenlong Yue, Lei Wang, Ming Zhu, Zhenquan Qin, Lei Shu, Canfeng Chen
2011 conf
ICC
Long Cheng, Sajal K. Das, Canfeng Chen, Jian Ma, Wendong Wang
2011 conf
ICC
Long Cheng, Sajal K. Das, Mario Di Francesco, Canfeng Chen, Jian Ma
2011 C conf
PDP
Vaskar Raychoudhury, Jiannong Cao, Weigang Wu, Canfeng Chen
2011 C conf
WOWMOM
Long Cheng, Sajal K. Das, Mario Di Francesco, Canfeng Chen, Jian Ma, Dongliang Xie
2011 J jnl
IET Commun.
Long Cheng, Jiannong Cao, Canfeng Chen, Hongyang Chen, Jian Ma
2011 conf
WASA
Canfeng Chen, Xin Zhang, Jinfeng Zhang, Yuezhong Tang
2011 conf
CCNC
Jinfeng Zhang, Canfeng Chen, Jian Ma, Nengqiang He, Yong Ren
2010 conf
APWCS
Shuangquan Wang, Canfeng Chen, Jian Ma
2010 B conf
IWCMC
Long Cheng, Jiannong Cao, Canfeng Chen, Hongyang Chen, Jian Ma, Joanna Izabela Siebert
2010 B conf
IWCMC
Joanna Izabela Siebert, Jiannong Cao, Long Cheng, Edwin Wei, Canfeng Chen, Jian Ma
2010 B conf
ICPP
Long Cheng, Sajal K. Das, Jiannong Cao, Canfeng Chen, Jian Ma
2010 J jnl
IEICE Trans. Commun.
Chunxiao Jiang, Shuai Fan, Canfeng Chen, Jian Ma, Yong Ren
2010 C conf
EUC
Weiwei Jiao, Long Cheng, Yimin Chen, Canfeng Chen, Jian Ma
2010 J jnl
Comput. J.
Long Cheng, Yimin Chen, Canfeng Chen, Jian Ma, Lei Shu, Athanasios V. Vasilakos, Naixue Xiong
2010 B conf
MASS
Long Cheng, Jiannong Cao, Canfeng Chen, Jian Ma, Sajal K. Das
2010 Misc conf
ICDCN
Vaskar Raychoudhury, Jiannong Cao, Weigang Wu, Yi Lai, Canfeng Chen, Jian Ma
2010 J jnl
IEICE Trans. Commun.
Chunxiao Jiang, Xin Ma, Canfeng Chen, Jian Ma, Yong Ren
2010 J jnl
Wirel. Sens. Netw.
Yu Yang, Zhulin An, Yongjun Xu, Xiaowei Li, Canfeng Chen
2010 J jnl
J. Ambient Intell. Humaniz. Comput.
Yuhong Feng, Jiannong Cao, Yan Sun, Weigang Wu, Canfeng Chen, Jian Ma
2010 conf
PCM (2)
Ye Tian, Jinghai Rao, Wendong Wang, Canfeng Chen, Jian Ma
2010 A conf
CIKM
Ye Tian, Wendong Wang, Xueli Wang, Jinghai Rao, Canfeng Chen, Jian Ma
2010 J jnl
IEEE Trans. Consumer Electron.
Chunxiao Jiang, Nengqiang He, Yong Ren, Canfeng Chen, Jian Ma
2009 conf
CSIE (5)
Shuangquan Wang, Canfeng Chen, Jian Ma
2009 conf
CCNC
Long Cheng, Canfeng Chen, Jian Ma, Yimin Chen
2009 conf
VTC Fall
Yimin Chen, Long Cheng, Canfeng Chen, Jian Ma
2009 B conf
IWCMC
Long Cheng, Yimin Chen, Canfeng Chen, Jian Ma
2009 conf
ScalCom-EmbeddedCom
Weiwei Jiao, Wenbin Yu, Long Cheng, Canfeng Chen, Jian Ma
2009 conf
CSE (2)
Long Cheng, Canfeng Chen, Jian Ma, Lei Shu, Hongyang Chen, Laurence Tianruo Yang
2009 conf
VTC Spring
Yimin Chen, Long Cheng, Canfeng Chen, Jian Ma
2008 conf
ICDCS Workshops
Lian Li, Limin Sun, Jian Ma, Canfeng Chen
2008 conf
WICON
Dongliang Xie, Mingxing Chen, Canfeng Chen, Jian Ma
2008 conf
ICC
Bin Wang, Dongliang Xie, Canfeng Chen, Jian Ma, Shiduan Cheng
2008 C conf
ISCC
Wei Huangfu, Yan Liu, Bin Duan, Limin Sun, Jian Ma, Canfeng Chen
2008 conf
VTC Spring
Bin Wang, Dongliang Xie, Canfeng Chen, Jian Ma, Shiduan Cheng
2008 B conf
WCNC
Wei Huangfu, Bin Duan, Limin Sun, Canfeng Chen, Jian Ma
2008 J jnl
J. Signal Process. Syst.
Jian Ma, Canfeng Chen, Jyri P. Salomaa
2007 conf
MSN
Yi Li, Dongliang Xie, Jian Ma, Canfeng Chen
2007 J jnl
EURASIP J. Wirel. Commun. Netw.
Yanzhong Bi, Limin Sun, Jian Ma, Na Li, Imran Ali Khan, Canfeng Chen
2007 conf
AINA Workshops (2)
Canfeng Chen, Jian Ma
2006 conf
AINA (2)
Canfeng Chen, Jian Ma
2006 B conf
IWCMC
Biao Ren, Jian Ma, Canfeng Chen
2005 B conf
GLOBECOM
Canfeng Chen, Jian Ma, Weiling Wu, Jiongpan Zhou
2005 conf
ICC
Canfeng Chen, Weiling Wu, Zheng Li
2004 B conf
WCNC
Sungeun Kim, John A. Copeland, Canfeng Chen, Lei Wang, Liang Liu, Weiling Wu
2004 B conf
WCNC
Canfeng Chen, Lei Wang, Liang Liu, Weiling Wu
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