[Soot-list] Generating a CallGraph
Marc-André Laverdière
marc-andre.laverdiere-papineau at polymtl.ca
Fri Mar 21 17:42:53 EDT 2014
Hello,
Using the Soot main requires that you have a main class in your program.
Custom entry points won't work in that case.
Before we go there, would you please confirm that your entry points are
static?
The next thing: I suggest that you add a transformer that will list all
non-phantom classes loaded in your Scene. This is probably going to help
diagnose problems.
My suggestion is that you start small: have it working on a simpler test
case (all classes local, only one version), then add a feature
(downloading class definitions), and then add the other.
Marc-André Laverdière-Papineau
Doctorant - PhD Candidate
On 03/21/2014 04:25 PM, Graziella Galea wrote:
> Thanks for your response Marc-Andre.
>
> I am using a class loader in order to be able to retrieve classes and
> set them as application classes. I previously used
> Scene.v().loadNecessaryClasses() but it is not good for my case since I
> need to generate a call graph for different versions of the same
> project. I have been recommended to use the soot.Main but I am not sure
> what parameters I need to pass. How do you recommend to use the
> soot.Main method?
>
> Thanks for your help.
>
> Regards,
>
> Graziella.
>
>
> On 21 March 2014 20:05, Marc-Andre Laverdiere-Papineau
> <marc-andre.laverdiere-papineau at polymtl.ca
> <mailto:marc-andre.laverdiere-papineau at polymtl.ca>> wrote:
>
> Hi Graziella,
>
> Soot doesn't care about the class loader that you use - it uses its
> own class loading logic. You would need to either change that
> mechanism, or dump the classes you get from other sources to the
> disk and let Soot retrieve that.
>
> Also, it is generally recommended to use the Soot main if you're new
> at Soot.
>
> Also, note that entry points need to be static. IIRC, when you are
> working in app mode, you need to have an explicit main method, but
> I'm not 100% sure about that.
>
> BTW, you can join us on IRC at #soot on Freenode if that's your thing.
>
> Le 2014-03-21 10:48, Graziella Galea a écrit :
>>
>> I am currently working on a project whereby I need to generate a
>> call graph for Java code analysis using SOOT. Unfortunately, for
>> each class in the project I am analyzing, soot is returning a
>> warning that the class in a phantom reference. Now, if I am not
>> mistaken, a phantom reference is a class which I cannot provide
>> but I am actually providing it. I first started thinking that the
>> problem was with the Soot's classpath but I think it is correct.
>> The path String variable used to set the classpath (as shown in
>> the code snippet below) specifies the bin folder of the project
>> I'm analysing.
>>
>> Could anyone help me? It's been over a week and cannot seem to get
>> it right.
>>
>> Code used for setup:
>>
>>
>> |
>> privateCallGraphsetUp(ArrayList<String>paths,StringtestSuite)throwsException{Options.v().set_whole_program(true);Options.v().set_allow_phantom_refs(true);
>>
>>
>> Options.v().set_app(!
>> true);
>> Options.v().set_no_bodies_for_excluded(true);//set each method in
>> the source folder as an entry pointParserp
>> =newParser();List<SootMethod>entryPoints
>> =newArrayList<SootMethod>();//the arraylist paths contains the
>> path to the test suite and the path to the source
>> folderfor(Stringpath:paths){if(path !=null
>> ){__//if it is null then the user chose to identify the methods only
>> //create a classLoader for this pathFilefile
>> =newFile(path);ClassLoaderclassLoader
>> =newURLClassLoader(newURL[]{file.toURI().toURL()},parent);MultiClassLoadermcl
>> =newMultiClassLoader();mcl.addClassLoader(classLoader);ArrayList<File>allFiles
>> =p.getSourceFiles(path,false__);Options.v().set_process_dir(Arrays.asList(path+"\\"));__
>> Options.v().set_soot_classpath("C:\\Program
>> Files\\Java\\jre7\\lib\\rt.jar;"+path+"\\;C:\\Program
>> Files\\Java\\jre7\\lib\\jce.jar");for(Filef:allFiles){//remove the
>> path and leave package path onlyStringname =f.getAbsolutePath()
>> .replace(path+"\\","");name =name.replace("\\",____ ".");name
>> =name.replace(".class", "");//saves test files so as to be able to
>> distinguish between normal methods and test cases
>>
>> if(path.equals(testSui!
>> te<
>> span class="" style="margin:0px;padding:0px;border:0px;font-size:14px;vertical-align:baseline;background-color:transparent">)){
>> testFiles.add(name);}//load the classClass<?>cls =mcl.getCl
>> assLoader(0).loadClass(name);SootClasssootClass
>> =Scene.v().loadClassAndSupport(cls.getName
>>
>> ());
>> __sootClass.setApplicationClass();//set all of the methods in this
>> class as entrypoints since there is no main method
>> availablefor(SootMethodm:sootClass.getMethods()){if(!m.isAbstract()){System.out.println("entrypoint
>> "+m);entryPoints.add(m);}}}mcl.removeClassLoader(classLoader);}}Scene.v().addBasicClass("java.
>> lang.ThreadGroup",SootClass.SIGNATURES);Scene.v().setEntryPoints(
>>
>> entryPoints__);
>> PackManager.v().runPacks();
>> return Scene.v().get!
>> CallGraph<
>> /span>();
>> }|
>> --
>> Graziella Galea
>>
>>
>> _______________________________________________
>> Soot-list mailing list
>> Soot-list at sable.mcgill.ca <mailto:Soot-list at sable.mcgill.ca>
>> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
>
> --
> Marc-André Laverdière-Papineau
> Doctorant - PhD Candidate
>
>
> _______________________________________________
> Soot-list mailing list
> Soot-list at sable.mcgill.ca <mailto:Soot-list at sable.mcgill.ca>
> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
>
>
>
>
> --
> Graziella Galea
>
>
> _______________________________________________
> Soot-list mailing list
> Soot-list at sable.mcgill.ca
> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
>
More information about the Soot-list
mailing list