xref: /aosp_15_r20/art/tools/dexfuzz/src/dexfuzz/DexFuzz.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker package dexfuzz;
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker import dexfuzz.fuzzers.Fuzzer;
20*795d594fSAndroid Build Coastguard Worker import dexfuzz.fuzzers.FuzzerMultipleExecute;
21*795d594fSAndroid Build Coastguard Worker import dexfuzz.fuzzers.FuzzerMultipleNoExecute;
22*795d594fSAndroid Build Coastguard Worker import dexfuzz.fuzzers.FuzzerSingleExecute;
23*795d594fSAndroid Build Coastguard Worker import dexfuzz.fuzzers.FuzzerSingleNoExecute;
24*795d594fSAndroid Build Coastguard Worker import dexfuzz.listeners.BisectionSearchListener;
25*795d594fSAndroid Build Coastguard Worker import dexfuzz.listeners.ConsoleLoggerListener;
26*795d594fSAndroid Build Coastguard Worker import dexfuzz.listeners.FinalStatusListener;
27*795d594fSAndroid Build Coastguard Worker import dexfuzz.listeners.LogFileListener;
28*795d594fSAndroid Build Coastguard Worker import dexfuzz.listeners.MultiplexerListener;
29*795d594fSAndroid Build Coastguard Worker import dexfuzz.listeners.UniqueProgramTrackerListener;
30*795d594fSAndroid Build Coastguard Worker import dexfuzz.listeners.UpdatingConsoleListener;
31*795d594fSAndroid Build Coastguard Worker 
32*795d594fSAndroid Build Coastguard Worker /**
33*795d594fSAndroid Build Coastguard Worker  * Entrypoint class for dexfuzz.
34*795d594fSAndroid Build Coastguard Worker  */
35*795d594fSAndroid Build Coastguard Worker public class DexFuzz {
36*795d594fSAndroid Build Coastguard Worker   // Last version update 1.9: fixed a bug in InvokeChanger.
37*795d594fSAndroid Build Coastguard Worker   private static int majorVersion = 1;
38*795d594fSAndroid Build Coastguard Worker   private static int minorVersion = 9;
39*795d594fSAndroid Build Coastguard Worker   private static int seedChangeVersion = 0;
40*795d594fSAndroid Build Coastguard Worker 
41*795d594fSAndroid Build Coastguard Worker   /**
42*795d594fSAndroid Build Coastguard Worker    * Entrypoint to dexfuzz.
43*795d594fSAndroid Build Coastguard Worker    */
main(String[] args)44*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
45*795d594fSAndroid Build Coastguard Worker     // Report the version number, which should be incremented every time something will cause
46*795d594fSAndroid Build Coastguard Worker     // the same input seed to produce a different result than before.
47*795d594fSAndroid Build Coastguard Worker     Log.always(String.format("DexFuzz v%d.%d.%d",
48*795d594fSAndroid Build Coastguard Worker         majorVersion, minorVersion, seedChangeVersion));
49*795d594fSAndroid Build Coastguard Worker     Log.always("");
50*795d594fSAndroid Build Coastguard Worker 
51*795d594fSAndroid Build Coastguard Worker     if (!Options.readOptions(args)) {
52*795d594fSAndroid Build Coastguard Worker       Log.error("Failed to validate options.");
53*795d594fSAndroid Build Coastguard Worker       Options.usage();
54*795d594fSAndroid Build Coastguard Worker     }
55*795d594fSAndroid Build Coastguard Worker 
56*795d594fSAndroid Build Coastguard Worker 
57*795d594fSAndroid Build Coastguard Worker     // Create a Listener that is responsible for multiple Listeners.
58*795d594fSAndroid Build Coastguard Worker     MultiplexerListener multipleListener = new MultiplexerListener();
59*795d594fSAndroid Build Coastguard Worker     multipleListener.setup();
60*795d594fSAndroid Build Coastguard Worker 
61*795d594fSAndroid Build Coastguard Worker     FinalStatusListener statusListener = new FinalStatusListener();
62*795d594fSAndroid Build Coastguard Worker     multipleListener.addListener(statusListener);
63*795d594fSAndroid Build Coastguard Worker 
64*795d594fSAndroid Build Coastguard Worker     if (Options.repeat > 1 && Options.execute) {
65*795d594fSAndroid Build Coastguard Worker       // If executing repeatedly, take care of reporting progress to the user.
66*795d594fSAndroid Build Coastguard Worker       if (Options.quiet) {
67*795d594fSAndroid Build Coastguard Worker         // Nothing if quiet is requested.
68*795d594fSAndroid Build Coastguard Worker       } else if (!Log.likelyToLog()) {
69*795d594fSAndroid Build Coastguard Worker         // Add the live updating listener if we're not printing out lots of logs.
70*795d594fSAndroid Build Coastguard Worker         multipleListener.addListener(new UpdatingConsoleListener());
71*795d594fSAndroid Build Coastguard Worker       } else {
72*795d594fSAndroid Build Coastguard Worker         // If we are dumping out lots of logs, then use the console logger instead.
73*795d594fSAndroid Build Coastguard Worker         multipleListener.addListener(new ConsoleLoggerListener());
74*795d594fSAndroid Build Coastguard Worker       }
75*795d594fSAndroid Build Coastguard Worker       // Add the file logging listener.
76*795d594fSAndroid Build Coastguard Worker       multipleListener.addListener(new LogFileListener(Options.reportLogFile));
77*795d594fSAndroid Build Coastguard Worker       if (Options.runBisectionSearch) {
78*795d594fSAndroid Build Coastguard Worker         // Add the bisection search listener.
79*795d594fSAndroid Build Coastguard Worker         multipleListener.addListener(new BisectionSearchListener());
80*795d594fSAndroid Build Coastguard Worker       }
81*795d594fSAndroid Build Coastguard Worker       // Add the unique program tracker.
82*795d594fSAndroid Build Coastguard Worker       multipleListener.addListener(new UniqueProgramTrackerListener(Options.uniqueDatabaseFile));
83*795d594fSAndroid Build Coastguard Worker     } else {
84*795d594fSAndroid Build Coastguard Worker       // Just use the basic listener.
85*795d594fSAndroid Build Coastguard Worker       multipleListener.addListener(new ConsoleLoggerListener());
86*795d594fSAndroid Build Coastguard Worker     }
87*795d594fSAndroid Build Coastguard Worker 
88*795d594fSAndroid Build Coastguard Worker     // Create the Fuzzer that uses a particular strategy for fuzzing.
89*795d594fSAndroid Build Coastguard Worker     Fuzzer fuzzer = null;
90*795d594fSAndroid Build Coastguard Worker     if ((Options.repeat > 1) && Options.execute) {
91*795d594fSAndroid Build Coastguard Worker       fuzzer = new FuzzerMultipleExecute(multipleListener);
92*795d594fSAndroid Build Coastguard Worker     } else if ((Options.repeat > 1) && !Options.execute) {
93*795d594fSAndroid Build Coastguard Worker       fuzzer = new FuzzerMultipleNoExecute(multipleListener);
94*795d594fSAndroid Build Coastguard Worker     } else if ((Options.repeat == 1) && Options.execute) {
95*795d594fSAndroid Build Coastguard Worker       fuzzer = new FuzzerSingleExecute(multipleListener);
96*795d594fSAndroid Build Coastguard Worker     } else if ((Options.repeat == 1) && !Options.execute) {
97*795d594fSAndroid Build Coastguard Worker       fuzzer = new FuzzerSingleNoExecute(multipleListener);
98*795d594fSAndroid Build Coastguard Worker     } else {
99*795d594fSAndroid Build Coastguard Worker       Log.errorAndQuit("Invalid options provided, desired fuzzer unknown.");
100*795d594fSAndroid Build Coastguard Worker     }
101*795d594fSAndroid Build Coastguard Worker     // TODO: Implement FuzzerFindMinimalMutations.
102*795d594fSAndroid Build Coastguard Worker     // TODO: Implement FuzzerGenerational.
103*795d594fSAndroid Build Coastguard Worker 
104*795d594fSAndroid Build Coastguard Worker     // Actually run the Fuzzer.
105*795d594fSAndroid Build Coastguard Worker     fuzzer.run();
106*795d594fSAndroid Build Coastguard Worker     fuzzer.printTimingInfo();
107*795d594fSAndroid Build Coastguard Worker     fuzzer.shutdown();
108*795d594fSAndroid Build Coastguard Worker 
109*795d594fSAndroid Build Coastguard Worker     // Cleanup the Listener.
110*795d594fSAndroid Build Coastguard Worker     multipleListener.shutdown();
111*795d594fSAndroid Build Coastguard Worker 
112*795d594fSAndroid Build Coastguard Worker     if (!statusListener.isSuccessful()) {
113*795d594fSAndroid Build Coastguard Worker       System.exit(1);
114*795d594fSAndroid Build Coastguard Worker     }
115*795d594fSAndroid Build Coastguard Worker   }
116*795d594fSAndroid Build Coastguard Worker }
117