Konloch / Konloch/bytecode-viewer

Procyon Decompile Save error

Open
#446 0 comments 0 reactions 0 assignees View on GitHub
Bug Dependency Related
Dominant language
Java
Stars
15.6k
Forks
1.3k
PR merge metrics
No merged PRs in 30d

Description

# Description
When viewing this file in the editor it works fine, however if you try to decompile any jar/zip with this file it will fail.

Only on Procyon.
# File
Default IOUtils.class From org.apache.commons.io

[IOUtils.zip](https://github.com/Konloch/bytecode-viewer/files/9066837/IOUtils.zip)

# Fix
I believe in
`the.bytecode.club.bytecodeviewer.decompilers.impl.ProcyonDecompiler.doSaveJarDecompiled`

The issue lies in `resolvedType` not directly being checked for a null, along with `type.resolve()`.

# Error
Please send this error log to https://github.com/Konloch/bytecode-viewer/issues or Konloch at https://the.bytecode.club or konloch@gmail.com
If you hold appropriate legal rights to the relevant class/jar/apk file please include that as well.
Bytecode Viewer Version: 2.11.2 [Fat Jar], OS: Windows 10, Java: 15.0.1

java.lang.NullPointerException: Cannot invoke "com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis$DefiniteAssignmentNode.getNodeStatus()" because "node" is null
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis.changeNodeStatus(DefiniteAssignmentAnalysis.java:276)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis.access$400(DefiniteAssignmentAnalysis.java:40)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis$DefiniteAssignmentVisitor.visitLambdaExpression(DefiniteAssignmentAnalysis.java:562)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis$DefiniteAssignmentVisitor.visitLambdaExpression(DefiniteAssignmentAnalysis.java:445)
at com.strobel.decompiler.languages.java.ast.LambdaExpression.acceptVisitor(LambdaExpression.java:49)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis$DefiniteAssignmentVisitor.visitChildren(DefiniteAssignmentAnalysis.java:465)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis$DefiniteAssignmentVisitor.visitChildren(DefiniteAssignmentAnalysis.java:445)
at com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor.visitObjectCreationExpression(DepthFirstAstVisitor.java:344)
at com.strobel.decompiler.languages.java.ast.ObjectCreationExpression.acceptVisitor(ObjectCreationExpression.java:98)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis$DefiniteAssignmentVisitor.visitVariableInitializer(DefiniteAssignmentAnalysis.java:498)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis$DefiniteAssignmentVisitor.visitVariableInitializer(DefiniteAssignmentAnalysis.java:445)
at com.strobel.decompiler.languages.java.ast.VariableInitializer.acceptVisitor(VariableInitializer.java:80)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis$DefiniteAssignmentVisitor.visitChildren(DefiniteAssignmentAnalysis.java:465)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis$DefiniteAssignmentVisitor.visitChildren(DefiniteAssignmentAnalysis.java:445)
at com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor.visitVariableDeclaration(DepthFirstAstVisitor.java:199)
at com.strobel.decompiler.languages.java.ast.VariableDeclarationStatement.acceptVisitor(VariableDeclarationStatement.java:115)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis$DefiniteAssignmentVisitor.visitTryCatchStatement(DefiniteAssignmentAnalysis.java:532)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis$DefiniteAssignmentVisitor.visitTryCatchStatement(DefiniteAssignmentAnalysis.java:445)
at com.strobel.decompiler.languages.java.ast.TryCatchStatement.acceptVisitor(TryCatchStatement.java:78)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis.changeNodeStatus(DefiniteAssignmentAnalysis.java:292)
at com.strobel.decompiler.languages.java.ast.DefiniteAssignmentAnalysis.analyze(DefiniteAssignmentAnalysis.java:194)
at com.strobel.decompiler.languages.java.ast.transforms.TryWithResourcesTransform.visitTryCatchStatement(TryWithResourcesTransform.java:290)
at com.strobel.decompiler.languages.java.ast.transforms.TryWithResourcesTransform.visitTryCatchStatement(TryWithResourcesTransform.java:34)
at com.strobel.decompiler.languages.java.ast.TryCatchStatement.acceptVisitor(TryCatchStatement.java:78)
at com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor.visitChildren(DepthFirstAstVisitor.java:41)
at com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor.visitBlockStatement(DepthFirstAstVisitor.java:104)
at com.strobel.decompiler.languages.java.ast.BlockStatement.acceptVisitor(BlockStatement.java:72)
at com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor.visitChildren(DepthFirstAstVisitor.java:41)
at com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor.visitMethodDeclaration(DepthFirstAstVisitor.java:234)
at com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor.visitMethodDeclarationOverride(ContextTrackingVisitor.java:84)
at com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor.visitMethodDeclaration(ContextTrackingVisitor.java:76)
at com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor.visitMethodDeclaration(ContextTrackingVisitor.java:31)
at com.strobel.decompiler.languages.java.ast.MethodDeclaration.acceptVisitor(MethodDeclaration.java:94)
at com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor.visitChildren(DepthFirstAstVisitor.java:41)
at com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor.visitTypeDeclaration(DepthFirstAstVisitor.java:264)
at com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor.visitTypeDeclarationOverride(ContextTrackingVisitor.java:69)
at com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor.visitTypeDeclaration(ContextTrackingVisitor.java:60)
at com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor.visitTypeDeclaration(ContextTrackingVisitor.java:31)
at com.strobel.decompiler.languages.java.ast.TypeDeclaration.acceptVisitor(TypeDeclaration.java:98)
at com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor.visitChildren(DepthFirstAstVisitor.java:41)
at com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor.visitCompilationUnit(DepthFirstAstVisitor.java:274)
at com.strobel.decompiler.languages.java.ast.CompilationUnit.acceptVisitor(CompilationUnit.java:82)
at com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor.run(ContextTrackingVisitor.java:100)
at com.strobel.decompiler.languages.java.ast.transforms.TryWithResourcesTransform.run(TryWithResourcesTransform.java:169)
at com.strobel.decompiler.languages.java.ast.transforms.TransformationPipeline.runTransformationsUntil(TransformationPipeline.java:101)
at com.strobel.decompiler.languages.java.ast.AstBuilder.runTransformations(AstBuilder.java:122)
at com.strobel.decompiler.languages.java.JavaLanguage.runTransforms(JavaLanguage.java:97)
at com.strobel.decompiler.languages.java.JavaLanguage.buildAst(JavaLanguage.java:72)
at com.strobel.decompiler.languages.java.JavaLanguage.decompileType(JavaLanguage.java:59)
at the.bytecode.club.bytecodeviewer.decompilers.impl.ProcyonDecompiler.doSaveJarDecompiled(ProcyonDecompiler.java:187)
at the.bytecode.club.bytecodeviewer.decompilers.impl.ProcyonDecompiler.decompileToZip(ProcyonDecompiler.java:141)
at the.bytecode.club.bytecodeviewer.resources.ResourceDecompiling.decompileSaveAll(ResourceDecompiling.java:262)
at the.bytecode.club.bytecodeviewer.resources.ResourceDecompiling.lambda$decompileSaveAll$0(ResourceDecompiling.java:122)
at java.base/java.lang.Thread.run(Thread.java:832)

Contributor guide

Open the contributing guide

Research direction

Start in ProcyonDecompiler.java at doSaveJarDecompiled, referenced by the stack trace at line 187, and reproduce the failure with the attached IOUtils.zip archive. Inspect the handling of resolvedType and type.resolve() described in the issue. Done means saving a Procyon-decompiled jar or zip without the reported NullPointerException.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
reverse-engineering
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.