soot-oss / soot

Soot - A Java optimization framework
GNU Lesser General Public License v2.1
2.87k stars 706 forks source link

Error in Spark TypeManager when enabling full Reflective reasoning #1025

Open ddevec opened 6 years ago

ddevec commented 6 years ago

Steps to reproduce: 1.) Hello, I'm attempting to develop a static datarace detection pass using Soot, and Spark but I would like sound analysis (e.g. reasoning conservatively about reflection). I've found Soot crashes when running Spark on a simple program if "types-for-invoke" and safe-newinstance are both enabled.

I've enabled the safe-forename, safe-newinstance, and types-for-invoke options of the cg. However, it appears that this bug occurs with the combination of the safe-newinstance and types-for-invoke flags both enabled.

Files used to reproduce: Test java file contents below:

class Simple1 {
  static int a = 0;

  public static void main(String[] args) {
    Thread t1 = new Thread() {
      public void run() {
        a = 7;
        System.out.println("a is: " + a);
      }   
    };  

    Thread t2 = new Thread() {
      public void run() {
        a = 10; 
        System.out.println("a is: " + a);
      }   
    };  

    t1.start();
    try {
      t1.join();
    } catch (InterruptedException ex) {
      ex.printStackTrace();
    }   

    t2.start();
    try {
      t2.join();
    } catch (InterruptedException ex) {
      ex.printStackTrace();
    }   

    a = 0;
    t1 = new Thread() {
      public void run() {
        a = 2;
        System.out.println("a is: " + a);
      }   
    };  

    t2 = new Thread() {
      public void run() {
        a = 3;
        System.out.println("a is: " + a);
      }   
    };  

    t1.start();
    t2.start();

    try {
      t2.join();
    } catch (InterruptedException ex) {
      ex.printStackTrace();
    }   
    try {
      t1.join();
    } catch (InterruptedException ex) {
      ex.printStackTrace();
    }   
  }
}

Soot version:

trunk

Command line:

-cp /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/charsets.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/resources.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jsse.jar:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/jce.jar -process-dir simple1/ -d simple1Output -w -p cg.spark enabled:true -p cg safe-newinstance:true -p cg types-for-invoke:true

Max Memory:

14290MB

Stack trace:

java.lang.RuntimeException: Type mask not found for type sun.nio.cs.AbstractCharsetProvider
    at soot.jimple.spark.internal.TypeManager.get(TypeManager.java:137)
    at soot.jimple.spark.sets.HybridPointsToSet.nativeAddAll(HybridPointsToSet.java:67)
    at soot.jimple.spark.sets.HybridPointsToSet.addAll(HybridPointsToSet.java:98)
    at soot.jimple.spark.sets.PointsToSetInternal.addAll(PointsToSetInternal.java:56)
    at soot.jimple.spark.sets.HybridPointsToSet.superAddAll(HybridPointsToSet.java:50)
    at soot.jimple.spark.sets.HybridPointsToSet.addAll(HybridPointsToSet.java:93)
    at soot.jimple.spark.sets.DoublePointsToSet.addAll(DoublePointsToSet.java:73)
    at soot.jimple.spark.solver.PropWorklist.handleVarNode(PropWorklist.java:170)
    at soot.jimple.spark.solver.PropWorklist.propagate(PropWorklist.java:81)
    at soot.jimple.spark.SparkTransformer.propagatePAG(SparkTransformer.java:238)
    at soot.jimple.spark.SparkTransformer.internalTransform(SparkTransformer.java:155)
    at soot.SceneTransformer.transform(SceneTransformer.java:36)
    at soot.Transform.apply(Transform.java:102)
    at soot.RadioScenePack.internalApply(RadioScenePack.java:68)
    at soot.jimple.toolkits.callgraph.CallGraphPack.internalApply(CallGraphPack.java:58)
    at soot.Pack.apply(Pack.java:117)
    at soot.PackManager.runWholeProgramPacks(PackManager.java:613)
    at soot.PackManager.runPacksNormally(PackManager.java:497)
    at soot.PackManager.runPacks(PackManager.java:421)
    at soot.Main.run(Main.java:269)
    at soot.Main.main(Main.java:141)
rflores5 commented 2 years ago

@mbenz89 I would like to investigate this issue. Can I be assigned it?