From dfcd6232a491dfd4b9acbb36b703bfe3602f9503 Mon Sep 17 00:00:00 2001 From: Jean-Marie Mineau Date: Wed, 15 Jan 2025 16:20:53 +0100 Subject: [PATCH] fix test --- androscalpel/src/tests/app1.json | 1330 ++++++++++++----------- androscalpel/src/tests/mod.rs | 2 +- androscalpel/src/tests/test_class1.json | 4 +- androscalpel_serializer/src/debug.rs | 13 + 4 files changed, 683 insertions(+), 666 deletions(-) diff --git a/androscalpel/src/tests/app1.json b/androscalpel/src/tests/app1.json index 73ca654..333cc8f 100644 --- a/androscalpel/src/tests/app1.json +++ b/androscalpel/src/tests/app1.json @@ -1,672 +1,676 @@ { - "classes": { - "Lcom/example/testclassloader/TestA;": { - "descriptor": "Lcom/example/testclassloader/TestA;", - "is_public": true, - "is_final": false, - "is_interface": false, - "is_abstract": false, - "is_synthetic": false, - "is_annotation": false, - "is_enum": false, - "superclass": "Ljava/lang/Object;", - "interfaces": [], - "source_file": { - "String": "TestA.java" - }, - "static_fields": { - "Lcom/example/testclassloader/TestA;->value:Ljava/lang/String;": { - "descriptor": "Lcom/example/testclassloader/TestA;->value:Ljava/lang/String;", - "visibility": "Public", - "is_static": true, + "dex_files": { + "classes.dex": { + "classes": { + "Lcom/example/testclassloader/TestA;": { + "descriptor": "Lcom/example/testclassloader/TestA;", + "is_public": true, "is_final": false, - "is_volatile": false, - "is_transient": false, + "is_interface": false, + "is_abstract": false, "is_synthetic": false, + "is_annotation": false, "is_enum": false, - "value": null, + "superclass": "Ljava/lang/Object;", + "interfaces": [], + "source_file": { + "String": "TestA.java" + }, + "static_fields": { + "Lcom/example/testclassloader/TestA;->value:Ljava/lang/String;": { + "descriptor": "Lcom/example/testclassloader/TestA;->value:Ljava/lang/String;", + "visibility": "Public", + "is_static": true, + "is_final": false, + "is_volatile": false, + "is_transient": false, + "is_synthetic": false, + "is_enum": false, + "value": null, + "annotations": [] + } + }, + "instance_fields": {}, + "direct_methods": { + "Lcom/example/testclassloader/TestA;->()V": { + "descriptor": "Lcom/example/testclassloader/TestA;->()V", + "visibility": "Public", + "is_static": false, + "is_final": false, + "is_synchronized": false, + "is_bridge": false, + "is_varargs": false, + "is_native": false, + "is_abstract": false, + "is_strictfp": false, + "is_synthetic": false, + "is_constructor": true, + "is_declared_syncrhonized": false, + "annotations": [], + "parameters_annotations": [], + "code": { + "registers_size": 1, + "ins_size": 1, + "outs_size": 1, + "debug_info": [ + 3, + [ + 14, + 0 + ] + ], + "parameter_names": [], + "insns": [ + { + "Label": { + "name": "label_00000000" + } + }, + { + "InvokeDirect": { + "method": "Ljava/lang/Object;->()V", + "args": [ + 0 + ] + } + }, + { + "Label": { + "name": "label_00000003" + } + }, + { + "ReturnVoid": {} + } + ] + } + }, + "Lcom/example/testclassloader/TestA;->()V": { + "descriptor": "Lcom/example/testclassloader/TestA;->()V", + "visibility": "None_", + "is_static": true, + "is_final": false, + "is_synchronized": false, + "is_bridge": false, + "is_varargs": false, + "is_native": false, + "is_abstract": false, + "is_strictfp": false, + "is_synthetic": false, + "is_constructor": true, + "is_declared_syncrhonized": false, + "annotations": [], + "parameters_annotations": [], + "code": { + "registers_size": 1, + "ins_size": 0, + "outs_size": 0, + "debug_info": [ + 5, + [ + 14, + 0 + ] + ], + "parameter_names": [], + "insns": [ + { + "Label": { + "name": "label_00000000" + } + }, + { + "ConstString": { + "reg": 0, + "lit": { + "String": "Pirat\\')" + } + } + }, + { + "Label": { + "name": "label_00000002" + } + }, + { + "SPutObject": { + "from": 0, + "field": "Lcom/example/testclassloader/TestA;->value:Ljava/lang/String;" + } + }, + { + "Label": { + "name": "label_00000004" + } + }, + { + "ReturnVoid": {} + }, + { + "Label": { + "name": "label_00000005" + } + }, + { + "Nop": {} + } + ] + } + } + }, + "virtual_methods": { + "Lcom/example/testclassloader/TestA;->get_value()Ljava/lang/String;": { + "descriptor": "Lcom/example/testclassloader/TestA;->get_value()Ljava/lang/String;", + "visibility": "Public", + "is_static": false, + "is_final": false, + "is_synchronized": false, + "is_bridge": false, + "is_varargs": false, + "is_native": false, + "is_abstract": false, + "is_strictfp": false, + "is_synthetic": false, + "is_constructor": false, + "is_declared_syncrhonized": false, + "annotations": [], + "parameters_annotations": [], + "code": { + "registers_size": 2, + "ins_size": 1, + "outs_size": 0, + "debug_info": [ + 11, + [ + 14, + 0 + ] + ], + "parameter_names": [], + "insns": [ + { + "Label": { + "name": "label_00000000" + } + }, + { + "SGetObject": { + "to": 0, + "field": "Lcom/example/testclassloader/TestA;->value:Ljava/lang/String;" + } + }, + { + "Label": { + "name": "label_00000002" + } + }, + { + "ReturnObject": { + "reg": 0 + } + }, + { + "Label": { + "name": "label_00000003" + } + }, + { + "Nop": {} + } + ] + } + }, + "Lcom/example/testclassloader/TestA;->get_cl()Ljava/lang/String;": { + "descriptor": "Lcom/example/testclassloader/TestA;->get_cl()Ljava/lang/String;", + "visibility": "Public", + "is_static": false, + "is_final": false, + "is_synchronized": false, + "is_bridge": false, + "is_varargs": false, + "is_native": false, + "is_abstract": false, + "is_strictfp": false, + "is_synthetic": false, + "is_constructor": false, + "is_declared_syncrhonized": false, + "annotations": [], + "parameters_annotations": [], + "code": { + "registers_size": 2, + "ins_size": 1, + "outs_size": 1, + "debug_info": [ + 7, + [ + 14, + 0 + ] + ], + "parameter_names": [], + "insns": [ + { + "Label": { + "name": "label_00000000" + } + }, + { + "InvokeVirtual": { + "method": "Ljava/lang/Object;->getClass()Ljava/lang/Class;", + "args": [ + 1 + ] + } + }, + { + "Label": { + "name": "label_00000003" + } + }, + { + "MoveResultObject": { + "to": 0 + } + }, + { + "Label": { + "name": "label_00000004" + } + }, + { + "InvokeVirtual": { + "method": "Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;", + "args": [ + 0 + ] + } + }, + { + "Label": { + "name": "label_00000007" + } + }, + { + "MoveResultObject": { + "to": 0 + } + }, + { + "Label": { + "name": "label_00000008" + } + }, + { + "InvokeVirtual": { + "method": "Ljava/lang/Object;->toString()Ljava/lang/String;", + "args": [ + 0 + ] + } + }, + { + "Label": { + "name": "label_0000000B" + } + }, + { + "MoveResultObject": { + "to": 0 + } + }, + { + "Label": { + "name": "label_0000000C" + } + }, + { + "ReturnObject": { + "reg": 0 + } + }, + { + "Label": { + "name": "label_0000000D" + } + }, + { + "Nop": {} + } + ] + } + } + }, + "annotations": [] + }, + "Lcom/example/testclassloader/TestB;": { + "descriptor": "Lcom/example/testclassloader/TestB;", + "is_public": true, + "is_final": false, + "is_interface": false, + "is_abstract": false, + "is_synthetic": false, + "is_annotation": false, + "is_enum": false, + "superclass": "Ljava/lang/Object;", + "interfaces": [], + "source_file": { + "String": "TestB.java" + }, + "static_fields": {}, + "instance_fields": {}, + "direct_methods": { + "Lcom/example/testclassloader/TestB;->()V": { + "descriptor": "Lcom/example/testclassloader/TestB;->()V", + "visibility": "Public", + "is_static": false, + "is_final": false, + "is_synchronized": false, + "is_bridge": false, + "is_varargs": false, + "is_native": false, + "is_abstract": false, + "is_strictfp": false, + "is_synthetic": false, + "is_constructor": true, + "is_declared_syncrhonized": false, + "annotations": [], + "parameters_annotations": [], + "code": { + "registers_size": 1, + "ins_size": 1, + "outs_size": 1, + "debug_info": [ + 3, + [ + 14, + 0 + ] + ], + "parameter_names": [], + "insns": [ + { + "Label": { + "name": "label_00000000" + } + }, + { + "InvokeDirect": { + "method": "Ljava/lang/Object;->()V", + "args": [ + 0 + ] + } + }, + { + "Label": { + "name": "label_00000003" + } + }, + { + "ReturnVoid": {} + } + ] + } + }, + "Lcom/example/testclassloader/TestB;->()V": { + "descriptor": "Lcom/example/testclassloader/TestB;->()V", + "visibility": "None_", + "is_static": true, + "is_final": false, + "is_synchronized": false, + "is_bridge": false, + "is_varargs": false, + "is_native": false, + "is_abstract": false, + "is_strictfp": false, + "is_synthetic": false, + "is_constructor": true, + "is_declared_syncrhonized": false, + "annotations": [], + "parameters_annotations": [], + "code": { + "registers_size": 1, + "ins_size": 0, + "outs_size": 0, + "debug_info": [ + 5, + [ + 14, + 0 + ] + ], + "parameter_names": [], + "insns": [ + { + "Label": { + "name": "label_00000000" + } + }, + { + "ConstString": { + "reg": 0, + "lit": { + "String": "Plopliplop" + } + } + }, + { + "Label": { + "name": "label_00000002" + } + }, + { + "SPutObject": { + "from": 0, + "field": "Lcom/example/testclassloader/TestB;->value:Ljava/lang/String;" + } + }, + { + "Label": { + "name": "label_00000004" + } + }, + { + "ReturnVoid": {} + }, + { + "Label": { + "name": "label_00000005" + } + }, + { + "Nop": {} + } + ] + } + } + }, + "virtual_methods": { + "Lcom/example/testclassloader/TestB;->get_cl()Ljava/lang/String;": { + "descriptor": "Lcom/example/testclassloader/TestB;->get_cl()Ljava/lang/String;", + "visibility": "Public", + "is_static": false, + "is_final": false, + "is_synchronized": false, + "is_bridge": false, + "is_varargs": false, + "is_native": false, + "is_abstract": false, + "is_strictfp": false, + "is_synthetic": false, + "is_constructor": false, + "is_declared_syncrhonized": false, + "annotations": [], + "parameters_annotations": [], + "code": { + "registers_size": 2, + "ins_size": 1, + "outs_size": 1, + "debug_info": [ + 7, + [ + 14, + 0 + ] + ], + "parameter_names": [], + "insns": [ + { + "Label": { + "name": "label_00000000" + } + }, + { + "InvokeVirtual": { + "method": "Ljava/lang/Object;->getClass()Ljava/lang/Class;", + "args": [ + 1 + ] + } + }, + { + "Label": { + "name": "label_00000003" + } + }, + { + "MoveResultObject": { + "to": 0 + } + }, + { + "Label": { + "name": "label_00000004" + } + }, + { + "InvokeVirtual": { + "method": "Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;", + "args": [ + 0 + ] + } + }, + { + "Label": { + "name": "label_00000007" + } + }, + { + "MoveResultObject": { + "to": 0 + } + }, + { + "Label": { + "name": "label_00000008" + } + }, + { + "InvokeVirtual": { + "method": "Ljava/lang/Object;->toString()Ljava/lang/String;", + "args": [ + 0 + ] + } + }, + { + "Label": { + "name": "label_0000000B" + } + }, + { + "MoveResultObject": { + "to": 0 + } + }, + { + "Label": { + "name": "label_0000000C" + } + }, + { + "ReturnObject": { + "reg": 0 + } + }, + { + "Label": { + "name": "label_0000000D" + } + }, + { + "Nop": {} + } + ] + } + }, + "Lcom/example/testclassloader/TestB;->get_value()Ljava/lang/String;": { + "descriptor": "Lcom/example/testclassloader/TestB;->get_value()Ljava/lang/String;", + "visibility": "Public", + "is_static": false, + "is_final": false, + "is_synchronized": false, + "is_bridge": false, + "is_varargs": false, + "is_native": false, + "is_abstract": false, + "is_strictfp": false, + "is_synthetic": false, + "is_constructor": false, + "is_declared_syncrhonized": false, + "annotations": [], + "parameters_annotations": [], + "code": { + "registers_size": 2, + "ins_size": 1, + "outs_size": 0, + "debug_info": [ + 11, + [ + 14, + 0 + ] + ], + "parameter_names": [], + "insns": [ + { + "Label": { + "name": "label_00000000" + } + }, + { + "SGetObject": { + "to": 0, + "field": "Lcom/example/testclassloader/TestA;->value:Ljava/lang/String;" + } + }, + { + "Label": { + "name": "label_00000002" + } + }, + { + "ReturnObject": { + "reg": 0 + } + }, + { + "Label": { + "name": "label_00000003" + } + }, + { + "Nop": {} + } + ] + } + } + }, "annotations": [] } }, - "instance_fields": {}, - "direct_methods": { - "Lcom/example/testclassloader/TestA;->()V": { - "descriptor": "Lcom/example/testclassloader/TestA;->()V", - "visibility": "Public", - "is_static": false, - "is_final": false, - "is_synchronized": false, - "is_bridge": false, - "is_varargs": false, - "is_native": false, - "is_abstract": false, - "is_strictfp": false, - "is_synthetic": false, - "is_constructor": true, - "is_declared_syncrhonized": false, - "annotations": [], - "parameters_annotations": [], - "code": { - "registers_size": 1, - "ins_size": 1, - "outs_size": 1, - "debug_info": [ - 3, - [ - 14, - 0 - ] - ], - "parameter_names": [], - "insns": [ - { - "Label": { - "name": "label_00000000" - } - }, - { - "InvokeDirect": { - "method": "Ljava/lang/Object;->()V", - "args": [ - 0 - ] - } - }, - { - "Label": { - "name": "label_00000003" - } - }, - { - "ReturnVoid": null - } - ] - } - }, - "Lcom/example/testclassloader/TestA;->()V": { - "descriptor": "Lcom/example/testclassloader/TestA;->()V", - "visibility": "None_", - "is_static": true, - "is_final": false, - "is_synchronized": false, - "is_bridge": false, - "is_varargs": false, - "is_native": false, - "is_abstract": false, - "is_strictfp": false, - "is_synthetic": false, - "is_constructor": true, - "is_declared_syncrhonized": false, - "annotations": [], - "parameters_annotations": [], - "code": { - "registers_size": 1, - "ins_size": 0, - "outs_size": 0, - "debug_info": [ - 5, - [ - 14, - 0 - ] - ], - "parameter_names": [], - "insns": [ - { - "Label": { - "name": "label_00000000" - } - }, - { - "ConstString": { - "reg": 0, - "lit": { - "String": "Pirat\\')" - } - } - }, - { - "Label": { - "name": "label_00000002" - } - }, - { - "SPutObject": { - "from": 0, - "field": "Lcom/example/testclassloader/TestA;->value:Ljava/lang/String;" - } - }, - { - "Label": { - "name": "label_00000004" - } - }, - { - "ReturnVoid": null - }, - { - "Label": { - "name": "label_00000005" - } - }, - { - "Nop": null - } - ] - } - } - }, - "virtual_methods": { - "Lcom/example/testclassloader/TestA;->get_value()Ljava/lang/String;": { - "descriptor": "Lcom/example/testclassloader/TestA;->get_value()Ljava/lang/String;", - "visibility": "Public", - "is_static": false, - "is_final": false, - "is_synchronized": false, - "is_bridge": false, - "is_varargs": false, - "is_native": false, - "is_abstract": false, - "is_strictfp": false, - "is_synthetic": false, - "is_constructor": false, - "is_declared_syncrhonized": false, - "annotations": [], - "parameters_annotations": [], - "code": { - "registers_size": 2, - "ins_size": 1, - "outs_size": 0, - "debug_info": [ - 11, - [ - 14, - 0 - ] - ], - "parameter_names": [], - "insns": [ - { - "Label": { - "name": "label_00000000" - } - }, - { - "SGetObject": { - "to": 0, - "field": "Lcom/example/testclassloader/TestA;->value:Ljava/lang/String;" - } - }, - { - "Label": { - "name": "label_00000002" - } - }, - { - "ReturnObject": { - "reg": 0 - } - }, - { - "Label": { - "name": "label_00000003" - } - }, - { - "Nop": null - } - ] - } - }, - "Lcom/example/testclassloader/TestA;->get_cl()Ljava/lang/String;": { - "descriptor": "Lcom/example/testclassloader/TestA;->get_cl()Ljava/lang/String;", - "visibility": "Public", - "is_static": false, - "is_final": false, - "is_synchronized": false, - "is_bridge": false, - "is_varargs": false, - "is_native": false, - "is_abstract": false, - "is_strictfp": false, - "is_synthetic": false, - "is_constructor": false, - "is_declared_syncrhonized": false, - "annotations": [], - "parameters_annotations": [], - "code": { - "registers_size": 2, - "ins_size": 1, - "outs_size": 1, - "debug_info": [ - 7, - [ - 14, - 0 - ] - ], - "parameter_names": [], - "insns": [ - { - "Label": { - "name": "label_00000000" - } - }, - { - "InvokeVirtual": { - "method": "Ljava/lang/Object;->getClass()Ljava/lang/Class;", - "args": [ - 1 - ] - } - }, - { - "Label": { - "name": "label_00000003" - } - }, - { - "MoveResultObject": { - "to": 0 - } - }, - { - "Label": { - "name": "label_00000004" - } - }, - { - "InvokeVirtual": { - "method": "Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;", - "args": [ - 0 - ] - } - }, - { - "Label": { - "name": "label_00000007" - } - }, - { - "MoveResultObject": { - "to": 0 - } - }, - { - "Label": { - "name": "label_00000008" - } - }, - { - "InvokeVirtual": { - "method": "Ljava/lang/Object;->toString()Ljava/lang/String;", - "args": [ - 0 - ] - } - }, - { - "Label": { - "name": "label_0000000B" - } - }, - { - "MoveResultObject": { - "to": 0 - } - }, - { - "Label": { - "name": "label_0000000C" - } - }, - { - "ReturnObject": { - "reg": 0 - } - }, - { - "Label": { - "name": "label_0000000D" - } - }, - { - "Nop": null - } - ] - } - } - }, - "annotations": [] - }, - "Lcom/example/testclassloader/TestB;": { - "descriptor": "Lcom/example/testclassloader/TestB;", - "is_public": true, - "is_final": false, - "is_interface": false, - "is_abstract": false, - "is_synthetic": false, - "is_annotation": false, - "is_enum": false, - "superclass": "Ljava/lang/Object;", - "interfaces": [], - "source_file": { - "String": "TestB.java" - }, - "static_fields": {}, - "instance_fields": {}, - "direct_methods": { - "Lcom/example/testclassloader/TestB;->()V": { - "descriptor": "Lcom/example/testclassloader/TestB;->()V", - "visibility": "Public", - "is_static": false, - "is_final": false, - "is_synchronized": false, - "is_bridge": false, - "is_varargs": false, - "is_native": false, - "is_abstract": false, - "is_strictfp": false, - "is_synthetic": false, - "is_constructor": true, - "is_declared_syncrhonized": false, - "annotations": [], - "parameters_annotations": [], - "code": { - "registers_size": 1, - "ins_size": 1, - "outs_size": 1, - "debug_info": [ - 3, - [ - 14, - 0 - ] - ], - "parameter_names": [], - "insns": [ - { - "Label": { - "name": "label_00000000" - } - }, - { - "InvokeDirect": { - "method": "Ljava/lang/Object;->()V", - "args": [ - 0 - ] - } - }, - { - "Label": { - "name": "label_00000003" - } - }, - { - "ReturnVoid": null - } - ] - } - }, - "Lcom/example/testclassloader/TestB;->()V": { - "descriptor": "Lcom/example/testclassloader/TestB;->()V", - "visibility": "None_", - "is_static": true, - "is_final": false, - "is_synchronized": false, - "is_bridge": false, - "is_varargs": false, - "is_native": false, - "is_abstract": false, - "is_strictfp": false, - "is_synthetic": false, - "is_constructor": true, - "is_declared_syncrhonized": false, - "annotations": [], - "parameters_annotations": [], - "code": { - "registers_size": 1, - "ins_size": 0, - "outs_size": 0, - "debug_info": [ - 5, - [ - 14, - 0 - ] - ], - "parameter_names": [], - "insns": [ - { - "Label": { - "name": "label_00000000" - } - }, - { - "ConstString": { - "reg": 0, - "lit": { - "String": "Plopliplop" - } - } - }, - { - "Label": { - "name": "label_00000002" - } - }, - { - "SPutObject": { - "from": 0, - "field": "Lcom/example/testclassloader/TestB;->value:Ljava/lang/String;" - } - }, - { - "Label": { - "name": "label_00000004" - } - }, - { - "ReturnVoid": null - }, - { - "Label": { - "name": "label_00000005" - } - }, - { - "Nop": null - } - ] - } - } - }, - "virtual_methods": { - "Lcom/example/testclassloader/TestB;->get_cl()Ljava/lang/String;": { - "descriptor": "Lcom/example/testclassloader/TestB;->get_cl()Ljava/lang/String;", - "visibility": "Public", - "is_static": false, - "is_final": false, - "is_synchronized": false, - "is_bridge": false, - "is_varargs": false, - "is_native": false, - "is_abstract": false, - "is_strictfp": false, - "is_synthetic": false, - "is_constructor": false, - "is_declared_syncrhonized": false, - "annotations": [], - "parameters_annotations": [], - "code": { - "registers_size": 2, - "ins_size": 1, - "outs_size": 1, - "debug_info": [ - 7, - [ - 14, - 0 - ] - ], - "parameter_names": [], - "insns": [ - { - "Label": { - "name": "label_00000000" - } - }, - { - "InvokeVirtual": { - "method": "Ljava/lang/Object;->getClass()Ljava/lang/Class;", - "args": [ - 1 - ] - } - }, - { - "Label": { - "name": "label_00000003" - } - }, - { - "MoveResultObject": { - "to": 0 - } - }, - { - "Label": { - "name": "label_00000004" - } - }, - { - "InvokeVirtual": { - "method": "Ljava/lang/Class;->getClassLoader()Ljava/lang/ClassLoader;", - "args": [ - 0 - ] - } - }, - { - "Label": { - "name": "label_00000007" - } - }, - { - "MoveResultObject": { - "to": 0 - } - }, - { - "Label": { - "name": "label_00000008" - } - }, - { - "InvokeVirtual": { - "method": "Ljava/lang/Object;->toString()Ljava/lang/String;", - "args": [ - 0 - ] - } - }, - { - "Label": { - "name": "label_0000000B" - } - }, - { - "MoveResultObject": { - "to": 0 - } - }, - { - "Label": { - "name": "label_0000000C" - } - }, - { - "ReturnObject": { - "reg": 0 - } - }, - { - "Label": { - "name": "label_0000000D" - } - }, - { - "Nop": null - } - ] - } - }, - "Lcom/example/testclassloader/TestB;->get_value()Ljava/lang/String;": { - "descriptor": "Lcom/example/testclassloader/TestB;->get_value()Ljava/lang/String;", - "visibility": "Public", - "is_static": false, - "is_final": false, - "is_synchronized": false, - "is_bridge": false, - "is_varargs": false, - "is_native": false, - "is_abstract": false, - "is_strictfp": false, - "is_synthetic": false, - "is_constructor": false, - "is_declared_syncrhonized": false, - "annotations": [], - "parameters_annotations": [], - "code": { - "registers_size": 2, - "ins_size": 1, - "outs_size": 0, - "debug_info": [ - 11, - [ - 14, - 0 - ] - ], - "parameter_names": [], - "insns": [ - { - "Label": { - "name": "label_00000000" - } - }, - { - "SGetObject": { - "to": 0, - "field": "Lcom/example/testclassloader/TestA;->value:Ljava/lang/String;" - } - }, - { - "Label": { - "name": "label_00000002" - } - }, - { - "ReturnObject": { - "reg": 0 - } - }, - { - "Label": { - "name": "label_00000003" - } - }, - { - "Nop": null - } - ] - } - } - }, - "annotations": [] + "not_referenced_strings": [] } - }, - "not_referenced_strings": [] + } } diff --git a/androscalpel/src/tests/mod.rs b/androscalpel/src/tests/mod.rs index 3a6737c..d43485e 100644 --- a/androscalpel/src/tests/mod.rs +++ b/androscalpel/src/tests/mod.rs @@ -551,7 +551,7 @@ fn test_2_from_json() { let mut json = String::new(); file.read_to_string(&mut json).unwrap(); let apk: Apk = serde_json::from_str(&json).unwrap(); - let dex = apk.gen_raw_dex().unwrap().remove("classe.dex").unwrap(); + let dex = apk.gen_raw_dex().unwrap().remove("classes.dex").unwrap(); let mut new_apk = Apk::new(); new_apk .add_dex_file("classes.dex", &dex, false, false) diff --git a/androscalpel/src/tests/test_class1.json b/androscalpel/src/tests/test_class1.json index 705b43f..45391ad 100644 --- a/androscalpel/src/tests/test_class1.json +++ b/androscalpel/src/tests/test_class1.json @@ -63,7 +63,7 @@ } }, { - "ReturnVoid": null + "ReturnVoid": {} } ] } @@ -184,7 +184,7 @@ } }, { - "Nop": null + "Nop": {} } ] } diff --git a/androscalpel_serializer/src/debug.rs b/androscalpel_serializer/src/debug.rs index e9e94e4..22f3982 100644 --- a/androscalpel_serializer/src/debug.rs +++ b/androscalpel_serializer/src/debug.rs @@ -297,6 +297,15 @@ impl DebugInfoReader { DbgBytecode::EndLocal { register_num: Uleb128(register_num), } => { + // Yes this can happen + while self.register_states.len() < (register_num + 1) as usize { + self.register_states.push(DebugRegState { + name_idx: None, + type_idx: None, + sig_idx: None, + in_scope: false, + }) + } self.register_states[register_num as usize].in_scope = false; Some(DebugInfo::EndLocal { addr: self.address, @@ -655,6 +664,10 @@ mod test { addr_diff: Uleb128(51), }, SpecialOpcode(14), + // End a local that do not already exist + EndLocal { + register_num: Uleb128(41), + }, ], }; assert_eq!(