{"record":{"id":"3bc7e4d0469d53e4","repo":"pxb1988/dex2jar","slug":"index-out-of-range-for-s-index-d","errorCode":null,"errorMessage":"index-out-of-range for %s index: %d","messagePattern":"index-out-of-range for (.+?) index: (.+?)","errorType":"exception","errorClass":"BadOpException","httpStatus":null,"severity":"error","filePath":"dex-reader/src/main/java/com/googlecode/d2j/reader/DexFileReader.java","lineNumber":1299,"sourceCode":"                canContinue = idx < method_ids_size;\r\n                break;\r\n            case kIndexFieldRef:\r\n                idx = ushort(insns, u1offset + 2);\r\n                canContinue = idx < field_ids_size;\r\n                break;\r\n            case kIndexCallSiteRef:\r\n                idx = ushort(insns, u1offset + 2);\r\n                canContinue = idx < call_site_ids_size;\r\n                break;\r\n            case kIndexMethodAndProtoRef:\r\n                idx = ushort(insns, u1offset + 2);\r\n                int idx2 = ushort(insns, u1offset + 6);\r\n                canContinue = idx < method_ids_size && idx2 < proto_ids_size;\r\n                break;\r\n            default:\r\n            }\r\n            if (!canContinue) {\r\n                throw new BadOpException(\"index-out-of-range for %s index: %d\", op, idx);\r\n            }\r\n        }\r\n\r\n        if (canContinue && op.canContinue()) {\r\n            if (op == Op.NOP) {\r\n                switch (insns[u1offset + 1]) {\r\n                case 0x00:\r\n                    q.add(offset + Op.NOP.format.size);\r\n                    break;\r\n                case 0x01: {\r\n                    int size = ushort(insns, u1offset + 2);\r\n                    q.add(offset + (size * 2) + 4);\r\n                    break;\r\n                }\r\n                case 0x02: {\r\n                    int size = ushort(insns, u1offset + 2);\r\n                    q.add(offset + (size * 4) + 2);\r\n                    break;\r","sourceCodeStart":1281,"sourceCodeEnd":1317,"githubUrl":"https://github.com/pxb1988/dex2jar/blob/b5bda4fb4935ae8b3869b422454ae3b3896c7bc1/dex-reader/src/main/java/com/googlecode/d2j/reader/DexFileReader.java#L1281-L1317","documentation":"DexFileReader throws BadOpException when an instruction references a method/proto/field/type/string index that is out of range of the corresponding ids table (e.g. idx >= method_ids_size or idx2 >= proto_ids_size for invoke-type ops). The library validates indexability before continuing so downstream lookups cannot read past the tables. It indicates a corrupt or deliberately malformed dex.","triggerScenarios":"Decoding a dex whose instructions contain index operands equal to or larger than method_ids_size/proto_ids_size/etc., detected in the op.indexType switch that sets canContinue = false.","commonSituations":"Analyzing obfuscated or packed APKs that corrupt index tables to break static tools; fuzzed dex inputs; dex files spliced between versions.","solutions":["Verify the dex with an official verifier before conversion.","Rebuild or re-extract the dex from a known-good APK.","Use a tool that repairs dex headers/id tables before running d2j.","Catch BadOpException per method/class and skip the invalid one."],"exampleFix":"// before\ndexReader.accept(visitor, 0);\n// after\ntry {\n    dexReader.accept(visitor, 0);\n} catch (BadOpException e) {\n    LOG.warn(\"out-of-range index: \" + e.getMessage());\n}","handlingStrategy":"try-catch","validationCode":"// parse header and ensure id tables look sane before decoding\nint methodIdsSize = ByteBuffer.wrap(data, 88, 4).order(ByteOrder.LITTLE_ENDIAN).getInt();\nif (methodIdsSize < 0 || methodIdsSize > data.length / 8) throw new IllegalArgumentException(\"implausible method_ids_size\");","typeGuard":null,"tryCatchPattern":"try {\n    dexReader.accept(visitor, 0);\n} catch (BadOpException e) {\n    LOG.warn(\"index out of range: \" + e.getMessage());\n}","preventionTips":["Validate dex header (checksum, file_size, ids sizes) before decoding","Use dex repair tooling for packed/protected APKs","Skip-and-log offending methods in batch conversion pipelines"],"tags":["dex","android","bytecode","index"],"backgroundTag":"index-out-of-range","analyzedSha":"b5bda4fb4935ae8b3869b422454ae3b3896c7bc1","analyzedAt":"2026-09-08T00:44:01.258Z","contentChangedAt":"2026-09-08T00:44:01.258Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}