[Soot-list] Incomplete CallGraph

qpj 412832527 at qq.com
Fri Jul 18 10:30:10 EDT 2014


Hi Steven,
Thanks for your reply, and I think I understand your meaning, I'll try again. Thanks again for your patience.


Best regards,
Xiangxing




------------------ 原始邮件 ------------------
发件人: "Steven Arzt";<Steven.Arzt at cased.de>;
发送时间: 2014年7月18日(星期五) 晚上7:18
收件人: "qpj"<412832527 at qq.com>; "'soot-list'"<soot-list at sable.mcgill.ca>; 

主题: AW: 回复:AW: [Soot-list] 回复:AW: 回复:AW:  Incomplete CallGraph



 
Hi Xiangxing,

 

Note that the entry point calculation resets the Soot settings, so with your code, Soot will afterwards no longer be initialized. Try this:

 

             SetupApplication app = new SetupApplication

                           ("D:/Tools/adt-bundle-windows-x86_64-20140321/sdk/platforms",

                           "D:/Temp/com.tweakersoft.aroundme-1.apk");

             app.calculateSourcesSinksEntrypoints("D:/Arbeit/Android Analyse/soot-infoflow-android/SourcesAndSinks.txt");

             

             soot.G.reset();

             

             Options.v().set_src_prec(Options.src_prec_apk);

             Options.v().set_process_dir(Collections.singletonList("D:/Temp/com.tweakersoft.aroundme-1.apk"));

             Options.v().set_android_jars("D:/Tools/adt-bundle-windows-x86_64-20140321/sdk/platforms");

             Options.v().set_whole_program(true);

             Options.v().set_allow_phantom_refs(true);

             Options.v().set_output_format(Options.output_format_class);

             Options.v().setPhaseOption("cg.spark", "on");

             

             Scene.v().loadNecessaryClasses();

             

             SootMethod entryPoint = app.getEntryPointCreator().createDummyMain();

             Options.v().set_main_class(entryPoint.getSignature());

             Scene.v().setEntryPoints(Collections.singletonList(entryPoint));

             System.out.println(entryPoint.getActiveBody());

             

             PackManager.v().runPacks();

             

             System.out.println(Scene.v().getCallGraph().size());

 

Best regards,

  Steven

 

 

Von: qpj [mailto:412832527 at qq.com] 
Gesendet: Dienstag, 15. Juli 2014 04:15
An: Steven Arzt; soot-list
Betreff: 回复:AW: [Soot-list] 回复:AW: 回复:AW: Incomplete CallGraph

 

Hi Steven,


 


As I analyze OpenSudoku.apk, the result of dummyMain is:


 


    public static void dummyMainMethod()


    {


        int $i0;


        cz.romario.opensudoku.gui.ImportSudokuActivity $r0;


        android.os.Bundle $r1, $r3, $r4, $r8, $r10, $r12, $r15, $r16, $r18, $r20, $r22, $r24, $r25, $r29, $r31, $r32, $r36, $r38;


        cz.romario.opensudoku.gui.SudokuListActivity $r2;


        boolean $z0, $z1, $z2, $z3, $z4, $z5, $z6, $z7, $z8, $z9;


        android.app.Dialog $r5, $r13, $r21, $r26, $r33;


        android.widget.ListView $r6, $r27, $r34;


        android.view.View $r7, $r28, $r35;


        cz.romario.opensudoku.gui.FileImportActivity $r9;


        cz.romario.opensudoku.gui.SudokuExportActivity $r11;


        cz.romario.opensudoku.gui.SudokuEditActivity $r14;


        cz.romario.opensudoku.gui.SudokuImportActivity $r17;


        cz.romario.opensudoku.gui.SudokuPlayActivity $r19;


        cz.romario.opensudoku.gui.FolderListActivity $r23;


        cz.romario.opensudoku.gui.FileListActivity $r30;


        cz.romario.opensudoku.gui.GameSettingsActivity $r37;


 


        $i0 = 0;


 


     label0:


        $r0 = new cz.romario.opensudoku.gui.ImportSudokuActivity;


        specialinvoke $r0.<cz.romario.opensudoku.gui.ImportSudokuActivity: void <init>()>();


        if $i0 == 0 goto label6;


 


     label1:


        $r1 = new android.os.Bundle;


        specialinvoke $r1.<android.os.Bundle: void <init>()>();


        virtualinvoke $r0.<cz.romario.opensudoku.gui.ImportSudokuActivity: void onCreate(android.os.Bundle)>($r1);


        $r1 = null;


 


     label2:


        if $i0 == 1 goto label3;


 


        if $i0 == 2 goto label2;


 


        if $i0 == 3 goto label1;


 


     label3:


        if $i0 == 4 goto label5;


 


        if $i0 == 5 goto label4;


 


        if $i0 == 6 goto label1;


 


     label4:


        if $i0 == 7 goto label2;


 


     label5:


        if $i0 == 8 goto label6;


 


     label6:


        $r2 = new cz.romario.opensudoku.gui.SudokuListActivity;


        specialinvoke $r2.<cz.romario.opensudoku.gui.SudokuListActivity: void <init>()>();


        if $i0 == 9 goto label13;


 


     label7:


        $r3 = new android.os.Bundle;


        specialinvoke $r3.<android.os.Bundle: void <init>()>();


        virtualinvoke $r2.<cz.romario.opensudoku.gui.SudokuListActivity: void onCreate(android.os.Bundle)>($r3);


        $r3 = null;


 


     label8:


        $r4 = new android.os.Bundle;


        specialinvoke $r4.<android.os.Bundle: void <init>()>();


        virtualinvoke $r2.<cz.romario.opensudoku.gui.SudokuListActivity: void onRestoreInstanceState(android.os.Bundle)>($r4);


        $r4 = null;


        $z0 = virtualinvoke $r2.<cz.romario.opensudoku.gui.SudokuListActivity: boolean onCreateOptionsMenu(android.view.Menu)>(null);


        $r5 = virtualinvoke $r2.<cz.romario.opensudoku.gui.SudokuListActivity: android.app.Dialog onCreateDialog(int)>(0);


        $r6 = new android.widget.ListView;


        specialinvoke $r6.<android.widget.ListView: void <init>(android.content.Context)>(null);


        $r7 = new android.view.View;


        specialinvoke $r7.<android.view.View: void <init>(android.content.Context)>(null);


        virtualinvoke $r2.<cz.romario.opensudoku.gui.SudokuListActivity: void onListItemClick(android.widget.ListView,android.view.View,int,long)>($r6, $r7, 0, 0L);


        $r6 = null;


        $r7 = null;


        $z1 = virtualinvoke $r2.<cz.romario.opensudoku.gui.SudokuListActivity: boolean onContextItemSelected(android.view.MenuItem)>(null);


        $z2 = virtualinvoke $r2.<cz.romario.opensudoku.gui.SudokuListActivity: boolean onOptionsItemSelected(android.view.MenuItem)>(null);


 


     label9:


        virtualinvoke $r2.<cz.romario.opensudoku.gui.SudokuListActivity: void onResume()>();


        $r8 = new android.os.Bundle;


        specialinvoke $r8.<android.os.Bundle: void <init>()>();


        virtualinvoke $r2.<cz.romario.opensudoku.gui.SudokuListActivity: void onSaveInstanceState(android.os.Bundle)>($r8);


        $r8 = null;


        if $i0 == 10 goto label10;


 


        if $i0 == 11 goto label9;


 


        if $i0 == 12 goto label7;


 


     label10:


        if $i0 == 13 goto label12;


 


        if $i0 == 14 goto label11;


 


        if $i0 == 15 goto label7;


 


     label11:


        if $i0 == 16 goto label8;


 


     label12:


        virtualinvoke $r2.<cz.romario.opensudoku.gui.SudokuListActivity: void onDestroy()>();


        if $i0 == 17 goto label13;


 


     label13:


        $r9 = new cz.romario.opensudoku.gui.FileImportActivity;


        specialinvoke $r9.<cz.romario.opensudoku.gui.FileImportActivity: void <init>()>();


        if $i0 == 18 goto label19;


 


     label14:


        $r10 = new android.os.Bundle;


        specialinvoke $r10.<android.os.Bundle: void <init>()>();


        virtualinvoke $r9.<cz.romario.opensudoku.gui.FileImportActivity: void onCreate(android.os.Bundle)>($r10);


        $r10 = null;


 


     label15:


        if $i0 == 19 goto label16;


 


        if $i0 == 20 goto label15;


 


        if $i0 == 21 goto label14;


 


     label16:


        if $i0 == 22 goto label18;


 


        if $i0 == 23 goto label17;


 


        if $i0 == 24 goto label14;


 


     label17:


        if $i0 == 25 goto label15;


 


     label18:


        if $i0 == 26 goto label19;


 


     label19:


        $r11 = new cz.romario.opensudoku.gui.SudokuExportActivity;


        specialinvoke $r11.<cz.romario.opensudoku.gui.SudokuExportActivity: void <init>()>();


        if $i0 == 27 goto label26;


 


     label20:


        $r12 = new android.os.Bundle;


        specialinvoke $r12.<android.os.Bundle: void <init>()>();


        virtualinvoke $r11.<cz.romario.opensudoku.gui.SudokuExportActivity: void onCreate(android.os.Bundle)>($r12);


        $r12 = null;


 


     label21:


        $r13 = virtualinvoke $r11.<cz.romario.opensudoku.gui.SudokuExportActivity: android.app.Dialog onCreateDialog(int)>(0);


 


     label22:


        if $i0 == 28 goto label23;


 


        if $i0 == 29 goto label22;


 


        if $i0 == 30 goto label20;


 


     label23:


        if $i0 == 31 goto label25;


 


        if $i0 == 32 goto label24;


 


        if $i0 == 33 goto label20;


 


     label24:


        if $i0 == 34 goto label21;


 


     label25:


        if $i0 == 35 goto label26;


 


     label26:


        $r14 = new cz.romario.opensudoku.gui.SudokuEditActivity;


        specialinvoke $r14.<cz.romario.opensudoku.gui.SudokuEditActivity: void <init>()>();


        if $i0 == 36 goto label33;


 


     label27:


        $r15 = new android.os.Bundle;


        specialinvoke $r15.<android.os.Bundle: void <init>()>();


        virtualinvoke $r14.<cz.romario.opensudoku.gui.SudokuEditActivity: void onCreate(android.os.Bundle)>($r15);


        $r15 = null;


 


     label28:


        $z3 = virtualinvoke $r14.<cz.romario.opensudoku.gui.SudokuEditActivity: boolean onCreateOptionsMenu(android.view.Menu)>(null);


        $z4 = virtualinvoke $r14.<cz.romario.opensudoku.gui.SudokuEditActivity: boolean onOptionsItemSelected(android.view.MenuItem)>(null);


 


     label29:


        virtualinvoke $r14.<cz.romario.opensudoku.gui.SudokuEditActivity: void onPause()>();


        $r16 = new android.os.Bundle;


        specialinvoke $r16.<android.os.Bundle: void <init>()>();


        virtualinvoke $r14.<cz.romario.opensudoku.gui.SudokuEditActivity: void onSaveInstanceState(android.os.Bundle)>($r16);


        $r16 = null;


        if $i0 == 37 goto label30;


 


        if $i0 == 38 goto label29;


 


        if $i0 == 39 goto label27;


 


     label30:


        if $i0 == 40 goto label32;


 


        if $i0 == 41 goto label31;


 


        if $i0 == 42 goto label27;


 


     label31:


        if $i0 == 43 goto label28;


 


     label32:


        virtualinvoke $r14.<cz.romario.opensudoku.gui.SudokuEditActivity: void onDestroy()>();


        if $i0 == 44 goto label33;


 


     label33:


        $r17 = new cz.romario.opensudoku.gui.SudokuImportActivity;


        specialinvoke $r17.<cz.romario.opensudoku.gui.SudokuImportActivity: void <init>()>();


        if $i0 == 45 goto label39;


 


     label34:


        $r18 = new android.os.Bundle;


        specialinvoke $r18.<android.os.Bundle: void <init>()>();


        virtualinvoke $r17.<cz.romario.opensudoku.gui.SudokuImportActivity: void onCreate(android.os.Bundle)>($r18);


        $r18 = null;


 


     label35:


        if $i0 == 46 goto label36;


 


        if $i0 == 47 goto label35;


 


        if $i0 == 48 goto label34;


 


     label36:


        if $i0 == 49 goto label38;


 


        if $i0 == 50 goto label37;


 


        if $i0 == 51 goto label34;


 


     label37:


        if $i0 == 52 goto label35;


 


     label38:


        if $i0 == 53 goto label39;


 


     label39:


        $r19 = new cz.romario.opensudoku.gui.SudokuPlayActivity;


        specialinvoke $r19.<cz.romario.opensudoku.gui.SudokuPlayActivity: void <init>()>();


        if $i0 == 54 goto label46;


 


     label40:


        $r20 = new android.os.Bundle;


        specialinvoke $r20.<android.os.Bundle: void <init>()>();


        virtualinvoke $r19.<cz.romario.opensudoku.gui.SudokuPlayActivity: void onCreate(android.os.Bundle)>($r20);


        $r20 = null;


 


     label41:


        $z5 = virtualinvoke $r19.<cz.romario.opensudoku.gui.SudokuPlayActivity: boolean onCreateOptionsMenu(android.view.Menu)>(null);


        $r21 = virtualinvoke $r19.<cz.romario.opensudoku.gui.SudokuPlayActivity: android.app.Dialog onCreateDialog(int)>(0);


        $z6 = virtualinvoke $r19.<cz.romario.opensudoku.gui.SudokuPlayActivity: boolean onOptionsItemSelected(android.view.MenuItem)>(null);


 


     label42:


        virtualinvoke $r19.<cz.romario.opensudoku.gui.SudokuPlayActivity: void onResume()>();


        virtualinvoke $r19.<cz.romario.opensudoku.gui.SudokuPlayActivity: void onPause()>();


        $r22 = new android.os.Bundle;


        specialinvoke $r22.<android.os.Bundle: void <init>()>();


        virtualinvoke $r19.<cz.romario.opensudoku.gui.SudokuPlayActivity: void onSaveInstanceState(android.os.Bundle)>($r22);


        $r22 = null;


        if $i0 == 55 goto label43;


 


        if $i0 == 56 goto label42;


 


        if $i0 == 57 goto label40;


 


     label43:


        if $i0 == 58 goto label45;


 


        if $i0 == 59 goto label44;


 


        if $i0 == 60 goto label40;


 


     label44:


        if $i0 == 61 goto label41;


 


     label45:


        virtualinvoke $r19.<cz.romario.opensudoku.gui.SudokuPlayActivity: void onDestroy()>();


        if $i0 == 62 goto label46;


 


     label46:


        $r23 = new cz.romario.opensudoku.gui.FolderListActivity;


        specialinvoke $r23.<cz.romario.opensudoku.gui.FolderListActivity: void <init>()>();


        if $i0 == 63 goto label53;


 


     label47:


        $r24 = new android.os.Bundle;


        specialinvoke $r24.<android.os.Bundle: void <init>()>();


        virtualinvoke $r23.<cz.romario.opensudoku.gui.FolderListActivity: void onCreate(android.os.Bundle)>($r24);


        $r24 = null;


 


     label48:


        virtualinvoke $r23.<cz.romario.opensudoku.gui.FolderListActivity: void onStart()>();


        $r25 = new android.os.Bundle;


        specialinvoke $r25.<android.os.Bundle: void <init>()>();


        virtualinvoke $r23.<cz.romario.opensudoku.gui.FolderListActivity: void onRestoreInstanceState(android.os.Bundle)>($r25);


        $r25 = null;


        $z7 = virtualinvoke $r23.<cz.romario.opensudoku.gui.FolderListActivity: boolean onCreateOptionsMenu(android.view.Menu)>(null);


        $r26 = virtualinvoke $r23.<cz.romario.opensudoku.gui.FolderListActivity: android.app.Dialog onCreateDialog(int)>(0);


        $r27 = new android.widget.ListView;


        specialinvoke $r27.<android.widget.ListView: void <init>(android.content.Context)>(null);


        $r28 = new android.view.View;


        specialinvoke $r28.<android.view.View: void <init>(android.content.Context)>(null);


        virtualinvoke $r23.<cz.romario.opensudoku.gui.FolderListActivity: void onListItemClick(android.widget.ListView,android.view.View,int,long)>($r27, $r28, 0, 0L);


        $r27 = null;


        $r28 = null;


        $z8 = virtualinvoke $r23.<cz.romario.opensudoku.gui.FolderListActivity: boolean onContextItemSelected(android.view.MenuItem)>(null);


        $z9 = virtualinvoke $r23.<cz.romario.opensudoku.gui.FolderListActivity: boolean onOptionsItemSelected(android.view.MenuItem)>(null);


 


     label49:


        $r29 = new android.os.Bundle;


        specialinvoke $r29.<android.os.Bundle: void <init>()>();


        virtualinvoke $r23.<cz.romario.opensudoku.gui.FolderListActivity: void onSaveInstanceState(android.os.Bundle)>($r29);


        $r29 = null;


        if $i0 == 64 goto label50;


 


        if $i0 == 65 goto label49;


 


        if $i0 == 66 goto label47;


 


     label50:


        if $i0 == 67 goto label52;


 


        if $i0 == 68 goto label51;


 


        if $i0 == 69 goto label47;


 


     label51:


        if $i0 == 70 goto label48;


 


     label52:


        virtualinvoke $r23.<cz.romario.opensudoku.gui.FolderListActivity: void onDestroy()>();


        if $i0 == 71 goto label53;


 


     label53:


        $r30 = new cz.romario.opensudoku.gui.FileListActivity;


        specialinvoke $r30.<cz.romario.opensudoku.gui.FileListActivity: void <init>()>();


        if $i0 == 72 goto label60;


 


     label54:


        $r31 = new android.os.Bundle;


        specialinvoke $r31.<android.os.Bundle: void <init>()>();


        virtualinvoke $r30.<cz.romario.opensudoku.gui.FileListActivity: void onCreate(android.os.Bundle)>($r31);


        $r31 = null;


 


     label55:


        virtualinvoke $r30.<cz.romario.opensudoku.gui.FileListActivity: void onStart()>();


        $r32 = new android.os.Bundle;


        specialinvoke $r32.<android.os.Bundle: void <init>()>();


        virtualinvoke $r30.<cz.romario.opensudoku.gui.FileListActivity: void onRestoreInstanceState(android.os.Bundle)>($r32);


        $r32 = null;


        $r33 = virtualinvoke $r30.<cz.romario.opensudoku.gui.FileListActivity: android.app.Dialog onCreateDialog(int)>(0);


        $r34 = new android.widget.ListView;


        specialinvoke $r34.<android.widget.ListView: void <init>(android.content.Context)>(null);


        $r35 = new android.view.View;


        specialinvoke $r35.<android.view.View: void <init>(android.content.Context)>(null);


        virtualinvoke $r30.<cz.romario.opensudoku.gui.FileListActivity: void onListItemClick(android.widget.ListView,android.view.View,int,long)>($r34, $r35, 0, 0L);


        $r34 = null;


        $r35 = null;


 


     label56:


        $r36 = new android.os.Bundle;


        specialinvoke $r36.<android.os.Bundle: void <init>()>();


        virtualinvoke $r30.<cz.romario.opensudoku.gui.FileListActivity: void onSaveInstanceState(android.os.Bundle)>($r36);


        $r36 = null;


        if $i0 == 73 goto label57;


 


        if $i0 == 74 goto label56;


 


        if $i0 == 75 goto label54;


 


     label57:


        if $i0 == 76 goto label59;


 


        if $i0 == 77 goto label58;


 


        if $i0 == 78 goto label54;


 


     label58:


        if $i0 == 79 goto label55;


 


     label59:


        virtualinvoke $r30.<cz.romario.opensudoku.gui.FileListActivity: void onDestroy()>();


        if $i0 == 80 goto label60;


 


     label60:


        $r37 = new cz.romario.opensudoku.gui.GameSettingsActivity;


        specialinvoke $r37.<cz.romario.opensudoku.gui.GameSettingsActivity: void <init>()>();


        if $i0 == 81 goto label66;


 


     label61:


        $r38 = new android.os.Bundle;


        specialinvoke $r38.<android.os.Bundle: void <init>()>();


        virtualinvoke $r37.<cz.romario.opensudoku.gui.GameSettingsActivity: void onCreate(android.os.Bundle)>($r38);


        $r38 = null;


 


     label62:


        if $i0 == 82 goto label63;


 


        if $i0 == 83 goto label62;


 


        if $i0 == 84 goto label61;


 


     label63:


        if $i0 == 85 goto label65;


 


        if $i0 == 86 goto label64;


 


        if $i0 == 87 goto label61;


 


     label64:


        if $i0 == 88 goto label62;


 


     label65:


        if $i0 == 89 goto label66;


 


     label66:


        if $i0 == 90 goto label0;


 


        return;


    }‍



 


 


 


 


And my initilizeSoot is:


 


public void initializeSoot(){


                        Options.v().set_src_prec(Options.src_prec_apk);


                        Options.v().set_android_jars(androidJar);


                        Options.v().set_no_bodies_for_excluded(true);


                        Options.v().set_output_format(Options.v().output_format_none);


                        Options.v().set_allow_phantom_refs(true);


                        Options.v().set_whole_program(true);


                        Options.v().set_soot_classpath(apkFileLocation+":"+


                                               "/home/qian/workspace/GPRSAutoSwitch/libs/android-support-v4.jar:" +


                                               "/usr/local/java/jdk1.6.0/jre/lib/jce.jar:" +


                                               "/usr/local/java/jdk1.6.0/lib/tools.jar:" +


                                               "/usr/local/java/jdk1.6.0/lib/soot.jar:" +


                                               "/media/娱乐/Android/sdk/platforms/android-17/android.jar:" +


                                               "/media/软件/WorkSpace/Administrator/workspace/Qian/bin/classes/");                                        


                        Options.v().setPhaseOption("cg.spark", "on");


                        Options.v().setPhaseOption("cg.spark", "rta:true");                                          


                        SootMethod entryPoint = createEntryPointCreator().createDummyMainInternal(new ArrayList<String>(entrypoints));    


                        Options.v().set_main_class(entryPoint.getSignature());


                        Scene.v().setEntryPoints(Collections.singletonList(entryPoint));


                        Scene.v().addBasicClass(entryPoint.getDeclaringClass().getName(), SootClass.BODIES);                        


                        for (String className : this.entrypoints){                                   


                                   Scene.v().addBasicClass(className, SootClass.BODIES); }


                        Scene.v().loadNecessaryClasses();        


                        


                        //System.out.println(entryPoint.getActiveBody());


        PackManager.v().runPacks();


        System.out.println(Scene.v().getCallGraph().size());


            }‍



 


private AndroidEntryPointCreator createEntryPointCreator() {


                        setEntryPoint();


                        AndroidEntryPointCreator entryPointCreator = new AndroidEntryPointCreator


                                   (new ArrayList<String>(this.entrypoints));


                        return entryPointCreator;


            }


            


public void setEntryPoint(){


                        ProcessManifest processMan = new ProcessManifest();


                        processMan.loadManifestFile(apkFileLocation);


                        this.appPackageName = processMan.getPackageName();


                        this.entrypoints = processMan.getEntryPointClasses();


            }‍



 


Best regards,


Xiangxing


 


------------------ 原始邮件 ------------------


发件人: "Steven Arzt";<Steven.Arzt at cased.de>;


发送时间: 2014年7月14日(星期一) 晚上9:55


收件人: "qpj"<412832527 at qq.com>; "'soot-list'"<soot-list at sable.mcgill.ca>; 


主题: AW: [Soot-list] 回复:AW: 回复:AW: Incomplete CallGraph



 


Hi Xiangxing,

 

How do you use the constants as entry points? The anticipated use of the entry point creator is as follows:

 

             SetupApplication app = new SetupApplication

                           ("D:/Tools/adt-bundle-windows-x86_64-20140321/sdk/platforms",

                           "D:/Temp/com.tweakersoft.aroundme-1.apk");

             app.calculateSourcesSinksEntrypoints("D:/Arbeit/Android Analyse/soot-infoflow-android/SourcesAndSinks.txt");

             

             soot.G.reset();

             

             Options.v().set_src_prec(Options.src_prec_apk);

             Options.v().set_process_dir(Collections.singletonList("D:/Temp/com.tweakersoft.aroundme-1.apk"));

             Options.v().set_android_jars("D:/Tools/adt-bundle-windows-x86_64-20140321/sdk/platforms");

             Options.v().set_whole_program(true);

             Options.v().set_allow_phantom_refs(true);

             Options.v().set_output_format(Options.output_format_class);

             Options.v().setPhaseOption("cg.spark", "on");

             

             Scene.v().loadNecessaryClasses();

             

             SootMethod entryPoint = app.getEntryPointCreator().createDummyMain();

             Options.v().set_main_class(entryPoint.getSignature());

             Scene.v().setEntryPoints(Collections.singletonList(entryPoint));

             System.out.println(entryPoint.getActiveBody());

             

             PackManager.v().runPacks();

             

             System.out.println(Scene.v().getCallGraph().size());

 

Best regards,

  Steven

 

Von: soot-list-bounces at CS.McGill.CA [mailto:soot-list-bounces at CS.McGill.CA] Im Auftrag von qpj
Gesendet: Montag, 14. Juli 2014 13:45
An: Steven Arzt; soot-list
Betreff: [Soot-list] 回复:AW: 回复:AW: Incomplete CallGraph

 

Hi Steven,


 


I use your AndroidEntryPointConstants as entry point which you can see in the attachment. It seems CallGraph can reach methods in subclass of android.app.Activity, but can not reach subClass of other android class, such as android.widget.AdapterView$OnItemClickListener, for I find you take android.app.Activity as entry point. So if I'd like to reach method in onClickListener, does it means I need build a generateListenerLifecycle(Set<String> entryPoints,SootClass currentClass,JNopStmt endClassStmt,Local classLocal) method?


 


Best regads,


Xiangxing


 


 


------------------ 原始邮件 ------------------


发件人: "Steven Arzt";<Steven.Arzt at cased.de>;


发送时间: 2014年7月14日(星期一) 下午5:12


收件人: "qpj"<412832527 at qq.com>; "'soot-list'"<soot-list at sable.mcgill.ca>; 


主题: AW: 回复:AW: [Soot-list] Incomplete CallGraph



 


Hi Xiangxing,

 

Soot should be able to consider the onClick() handle ras reachable. What does your entry point look like? How do you construct it? SPARK starts from the entry point you supply and will only find methods that are transitively reachable from there.

 

Best regards,

  Steven

 

Von: qpj [mailto:412832527 at qq.com] 
Gesendet: Freitag, 11. Juli 2014 18:27
An: Steven Arzt; soot-list
Betreff: 回复:AW: [Soot-list] Incomplete CallGraph

 

Hi Steven,‍


Thank you for reply. I checked Scene.v().getReachableMethods().contains(myMethod) and found the result is false.‍


Actually my analysis code is about Android's Listener.


Class A{


public void onCreate(){


         listView.setOnClickListener(new onClickListener(


                 public onClick(View v){


                          showDocument()
                 }));


}


public void showDocument(){
//To Do


}


}


Does it mean Scene cannot reach to onClick()? If yes, do you have any idea of getting the source method of showDocument()? ‍


 


Best regards,


Xiangxing


 


 


------------------ 原始邮件 ------------------


发件人: "Steven Arzt";<Steven.Arzt at cased.de>;


发送时间: 2014年7月11日(星期五) 晚上11:20


收件人: "qpj"<412832527 at qq.com>; "'soot-list'"<soot-list at sable.mcgill.ca>; 


主题: AW: [Soot-list] Incomplete CallGraph



 


Hi Xiangxing,

 

Please check whether the method containing the calls for which you do not find any callees in the callgraph is itself marked as reachable. If a method a() calls a method b(), you only get a corresponding call graph edge if a() is reachable in the first place. The check is easy: Scene.v().getReachableMethods().contains(myMethod).

 

If this is ok, then make sure that there is a constructor call for base object on which you invoke the method. Take the following example:

 

A a = new A();

a.foo();

 

In this case, there will be a call edge to A.foo(). But if you take the following example and assume that the factory method “makeA” is a phantom method for which we do not have a body, there will not be a callgraph edge:

 

A a = makeA();

a.foo();

 

Best regards,

  Steven

 

Von: soot-list-bounces at CS.McGill.CA [mailto:soot-list-bounces at CS.McGill.CA] Im Auftrag von qpj
Gesendet: Freitag, 11. Juli 2014 17:13
An: soot-list
Betreff: [Soot-list] Incomplete CallGraph

 

Hi All,


When I use 


Iterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(sm));


I found sm do not have any targets if sm is a method came from a class whose name contains $(like cz.romario.opensudoku.gui.FileListActivity$2).


                                   


My code:


for(SootClass sootClass:Scene.v().getClasses()){


            if(sootClass.getName().startsWith("cz.romario.opensudoku.gui.FileListActivity")){                                               


                        innList.add(sootClass);


            }          


}


for(SootClass sc:innList){


            for(SootMethod sm:sc.getMethods()){


                        Iterator<MethodOrMethodContext> targets = new Targets(cg.edgesOutOf(sm));


                        System.out.println(sm+":");


                        while(targets.hasNext())


                              System.out.println(targets.next());


            }


}‍



My result:


<cz.romario.opensudoku.gui.FileListActivity: void onCreate(android.os.Bundle)>:


targetMethod:<java.io.File: void <clinit>()>


targetMethod:<java.lang.StringBuilder: java.lang.String toString()>


targetMethod:<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>


targetMethod:<java.lang.StringBuilder: java.lang.StringBuilder append(java.lang.String)>


targetMethod:<java.lang.StringBuilder: void <init>(java.lang.String)>


targetMethod:<java.util.Date: void <init>(long)>


targetMethod:<java.io.File: long lastModified()>


targetMethod:<java.io.File: java.lang.String getName()>‍



 


<cz.romario.opensudoku.gui.FileListActivity$2: void <init>(cz.romario.opensudoku.gui.FileListActivity)>:


targetMethod:<java.lang.Object: void <init>()>


<cz.romario.opensudoku.gui.FileListActivity$2: boolean accept(java.io.File)>:


no targets.


 


<cz.romario.opensudoku.gui.FileListActivity$3: void <init>(cz.romario.opensudoku.gui.FileListActivity)>:


targetMethod:<java.lang.Object: void <init>()>


<cz.romario.opensudoku.gui.FileListActivity$3: void onClick(android.content.DialogInterface,int)>:


no targets.


 


As you can see:


1. In cz.romario.opensudoku.gui.FileListActivity, I can get all targets of onCreate(). ‍



2. In cz.romario.opensudoku.gui.FileListActivity$2 and ‍cz.romario.opensudoku.gui.FileListActivity$3, I cannot get any targets from accept() and onClick().‍


Do any one meet with this problem before? 


Best Regard.


 


Xiangxing
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.CS.McGill.CA/pipermail/soot-list/attachments/20140718/05a80ee0/attachment-0001.html 


More information about the Soot-list mailing list