soot-oss / SootUp

A new version of Soot with a completely overhauled architecture
https://soot-oss.github.io/SootUp/
GNU Lesser General Public License v2.1
546 stars 66 forks source link

[Bug]: java.lang.NullPointerException: Cannot invoke "java.nio.file.FileSystem.close()" because the return value of "com.google.common.cache.RemovalNotification.getValue()" is null #941

Closed fe1w0 closed 1 month ago

fe1w0 commented 1 month ago

What happened?

Sometimes there will be a problem

List<File> files = gavFilesMap.get(getFile());
            File[] jars = files.toArray(new File[0]);

            try{
                List<AnalysisInputLocation> inputLocations = new ArrayList<>();

                for (File jar : jars) {
                    System.out.println(jar.getPath());
                    inputLocations.add(new JavaClassPathAnalysisInputLocation(jar.getPath()));
                }

                JavaView view = new JavaView(inputLocations);

                JavaClassType classType = view.getIdentifierFactory().getClassType(className);

                // view.getClass(classType).get(); will create this problem.
                JavaSootClass sootClass = view.getClass(classType).get();

                List<JavaSootMethod> methods = sootClass.getMethods().stream().toList();

                for (JavaSootMethod method : methods) {
                    if (!compareSignature(signature, method.getSignature().toString())) {
                        continue;
                    }
                    List<Class<?>> parameterTypes = new ArrayList<>();
                    for (int i = 0; i < method.getParameterCount(); i++) {
                        parameterTypes.add(method.getParameterTypes().getClass());
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

Output:

/Users/fe1w0/.m2/repository/org/springframework/spring-web/5.3.0/spring-web-5.3.0.jar
/Users/fe1w0/.m2/repository/org/springframework/spring-web/5.3.0/spring-web-5.3.0.jar
/Users/fe1w0/.m2/repository/org/springframework/spring-web/5.3.0/spring-web-5.3.0.jar
/Users/fe1w0/.m2/repository/org/springframework/spring-web/5.3.0/spring-web-5.3.0.jar
/Users/fe1w0/.m2/repository/org/springframework/spring-web/5.3.0/spring-web-5.3.0.jar
/Users/fe1w0/.m2/repository/org/springframework/spring-web/5.3.0/spring-web-5.3.0.jar
/Users/fe1w0/.m2/repository/com/alibaba/fastjson/1.2.80/fastjson-1.2.80.jar
5月 31, 2024 11:30:01 上午 com.google.common.cache.LocalCache processPendingNotifications
警告: Exception thrown by removal listener
java.lang.NullPointerException: Cannot invoke "java.nio.file.FileSystem.close()" because the return value of "com.google.common.cache.RemovalNotification.getValue()" is null
    at sootup.java.bytecode.inputlocation.ArchiveBasedAnalysisInputLocation.lambda$static$0(ArchiveBasedAnalysisInputLocation.java:55)
    at com.google.common.cache.LocalCache.processPendingNotifications(LocalCache.java:1814)
    at com.google.common.cache.LocalCache$Segment.runUnlockedCleanup(LocalCache.java:3467)
    at com.google.common.cache.LocalCache$Segment.postWriteCleanup(LocalCache.java:3443)
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2150)
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2049)
    at com.google.common.cache.LocalCache.get(LocalCache.java:3966)
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3989)
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4950)
    at sootup.java.bytecode.inputlocation.ArchiveBasedAnalysisInputLocation.getClassSource(ArchiveBasedAnalysisInputLocation.java:96)
    at sootup.java.bytecode.inputlocation.JavaClassPathAnalysisInputLocation.getClassSource(JavaClassPathAnalysisInputLocation.java:194)
    at sootup.java.core.views.JavaView.lambda$getClassSource$2(JavaView.java:150)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
    at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
    at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
    at java.base/java.util.stream.SliceOps$SliceTask.doLeaf(SliceOps.java:620)
    at java.base/java.util.stream.SliceOps$SliceTask.doLeaf(SliceOps.java:572)
    at java.base/java.util.stream.AbstractShortCircuitTask.compute(AbstractShortCircuitTask.java:115)
    at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:754)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
    at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:667)
    at java.base/java.util.stream.SliceOps$1.opEvaluateParallelLazy(SliceOps.java:151)
    at java.base/java.util.stream.AbstractPipeline.sourceSpliterator(AbstractPipeline.java:434)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
    at java.base/java.util.stream.ReferencePipeline.findAny(ReferencePipeline.java:652)
    at sootup.java.core.views.JavaView.getClassSource(JavaView.java:157)
    at sootup.java.core.views.JavaView.getClass(JavaView.java:111)
    at utils.VulnInfoSootUp$SinkMethodInfo.getParameterTypes(VulnInfoSootUp.java:122)
    at utils.CodeGenerator.getImportPackageCode(CodeGenerator.java:127)
    at utils.CodeGenerator.generateCode(CodeGenerator.java:66)
    at Generator.main(Generator.java:60)

Version

Latest develop branch

Relevant log output

No response

JonasKlauke commented 1 month ago

Can you check if you still get the same exception if you add /Users/fe1w0/.m2/repository/org/springframework/spring-web/5.3.0/spring-web-5.3.0.jar only once

fe1w0 commented 1 month ago

Sorry, my reply is a little slow. Yes, if view only loads a jar once, there will be no problem. The next personal solution is to manage jar and view through a map.