1959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle/* 2959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Copyright (C) 2014 The Android Open Source Project 3959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * 4959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Licensed under the Apache License, Version 2.0 (the "License"); 5959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * you may not use this file except in compliance with the License. 6959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * You may obtain a copy of the License at 7959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * 8959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * http://www.apache.org/licenses/LICENSE-2.0 9959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * 10959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Unless required by applicable law or agreed to in writing, software 11959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * distributed under the License is distributed on an "AS IS" BASIS, 12959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * See the License for the specific language governing permissions and 14959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * limitations under the License. 15959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */ 16959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 17959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepackage dexfuzz.listeners; 18959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 19959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.ExecutionResult; 20959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.Log; 21959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.executors.Executor; 22959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.program.Mutation; 23959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport dexfuzz.program.MutationSerializer; 24959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 25959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.io.BufferedWriter; 26959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.io.FileWriter; 27959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.io.IOException; 28959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.Date; 29959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.List; 30959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyleimport java.util.Map; 31959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 32959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle/** 33959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle * Logs events to a file. 34959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle */ 35959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kylepublic class LogFileListener extends BaseListener { 36959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private BufferedWriter writer; 37959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle boolean ready = false; 38959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 39959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long successfulVerification; 40959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long failedVerification; 41959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long failedMutation; 42959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long success; 43959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long timedOut; 44959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long divergence; 45959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long selfDivergent; 46959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long architectureSplit; 47959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long iterations; 48959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 49959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private String logFile; 50959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 51959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public LogFileListener(String logFile) { 52959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle this.logFile = logFile; 53959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 54959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 55959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 56959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void setup() { 57959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle try { 58959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle writer = new BufferedWriter(new FileWriter(logFile)); 59959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle ready = true; 60959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } catch (IOException e) { 61959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle e.printStackTrace(); 62959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 63959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 64959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 65959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 66959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void shutdown() { 67959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle try { 68959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle writer.close(); 69959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } catch (IOException e) { 70959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle e.printStackTrace(); 71959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 72959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Log.always("Full log in " + logFile); 73959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 74959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 75959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle private void write(String msg) { 76959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (!ready) { 77959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle return; 78959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 79959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle try { 80959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle writer.write(msg + "\n"); 81959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } catch (IOException e) { 82959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle e.printStackTrace(); 83959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 84959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 85959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 86959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 87959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleSuccessfulHostVerification() { 88959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Host verification: SUCCESS"); 89959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle successfulVerification++; 90959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 91959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 92959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 93959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleFailedHostVerification(ExecutionResult verificationResult) { 94959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Host verification: FAILED"); 95959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle failedVerification++; 96959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 97959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 98959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 99959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleFailedTargetVerification() { 100959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Target verification: FAILED"); 101959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle failedVerification++; 102959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 103959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 104959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 105959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleIterationStarted(int iteration) { 106959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("--> FUZZ " + (iteration + 1)); 107959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle Date now = new Date(System.currentTimeMillis()); 108959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Time started: " + now.toString()); 109959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle iterations++; 110959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 111959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 112959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 113959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleTimeouts(List<Executor> timedOut, List<Executor> didNotTimeOut) { 114959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Some executors timed out."); 115959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Timed out:"); 116959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (Executor executor : timedOut) { 117959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(" " + executor.getName()); 118959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 119959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle if (!didNotTimeOut.isEmpty()) { 120959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Did not time out:"); 121959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (Executor executor : didNotTimeOut) { 122959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(" " + executor.getName()); 123959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 124959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 125959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle this.timedOut++; 126959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 127959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 128959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 129959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleDivergences(Map<String, List<Executor>> outputMap) { 130959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("DIVERGENCE between some executors!"); 131959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle int outputCount = 1; 132959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (List<Executor> executors : outputMap.values()) { 133959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Output " + outputCount + ":"); 134959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (Executor executor : executors) { 135959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(" " + executor.getName()); 136959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 137959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle outputCount++; 138959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 139959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle divergence++; 140959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 141959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // You are probably interested in reading about these divergences while fuzzing 142959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // is taking place, so flush the writer now. 143959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle try { 144959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle writer.flush(); 145959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } catch (IOException e) { 146959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle e.printStackTrace(); 147959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 148959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 149959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 150959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 151959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleFuzzingFile(String inputFile) { 152959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Fuzzing file '" + inputFile + "'"); 153959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 154959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 155959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 156959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleSeed(long seed) { 157959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Using " + seed + " for seed."); 158959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // Flush the seed as well, so if anything goes wrong we can see what seed lead 159959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle // to the issue. 160959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle try { 161959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle writer.flush(); 162959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } catch (IOException e) { 163959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle e.printStackTrace(); 164959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 165959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 166959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 167959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 168959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleHostVerificationSigabort(ExecutionResult verificationResult) { 169959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Host verification: SIGABORTED"); 170959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 171959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 172959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 173959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleSuccess(Map<String, List<Executor>> outputMap) { 174959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("All executors agreed on result."); 175959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle success++; 176959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 177959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 178959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 179959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleDumpOutput(String outputLine, Executor executor) { 180959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(executor.getName() + " OUTPUT:"); 181959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(outputLine); 182959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 183959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 184959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 185959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleDumpVerify(String verifyLine) { 186959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("VERIFY: " + verifyLine); 187959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 188959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 189959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 190959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleMutationStats(String statsString) { 191959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Mutation Stats: " + statsString); 192959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 193959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 194959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 195959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleTiming(String name, float elapsedTime) { 196959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(String.format("'%s': %.3fs", name, elapsedTime)); 197959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 198959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 199959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 200959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleMutationFail() { 201959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Mutation process: FAILED"); 202959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle failedMutation++; 203959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 204959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 205959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 206959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleSummary() { 207959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(""); 208959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("---+++--- SUMMARY ---+++---"); 209959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Fuzzing attempts: " + iterations); 210959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(" Failed verification: " + failedVerification); 211959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(" Failed mutation: " + failedMutation); 212959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(" Timed out: " + timedOut); 213959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Successful: " + success); 214959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(" Self divergent: " + selfDivergent); 215959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(" Architecture split: " + architectureSplit); 216959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Produced divergence: " + divergence); 217959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 218959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long truelyDivergent = divergence - (selfDivergent + architectureSplit); 219959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle long verified = success + timedOut + truelyDivergent; 220959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 221959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(""); 222959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 223959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle float verifiedTotalRatio = 224959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle (((float) (verified)) / iterations) * 100.0f; 225959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(String.format("Percentage Verified/Total: %.3f%%", verifiedTotalRatio)); 226959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 227959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle float timedOutVerifiedRatio = 228959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle (((float) timedOut) / (verified)) * 100.0f; 229959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(String.format("Percentage Timed Out/Verified: %.3f%%", timedOutVerifiedRatio)); 230959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 231959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle float successfulVerifiedRatio = 232959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle (((float) success) / (verified)) * 100.0f; 233959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(String.format("Percentage Successful/Verified: %.3f%%", successfulVerifiedRatio)); 234959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 235959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle float divergentVerifiedRatio = 236959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle (((float) truelyDivergent) / (verified)) * 100.0f; 237959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(String.format("Percentage Divergent/Verified: %.3f%%", divergentVerifiedRatio)); 238959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 239959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("---+++--- SUMMARY ---+++---"); 240959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(""); 241959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 242959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 243959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 244959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleIterationFinished(int iteration) { 245959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(""); 246959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 247959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 248959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 249959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleSuccessfullyFuzzedFile(String programName) { 250959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Successfully fuzzed file '" + programName + "'"); 251959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 252959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 253959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 254959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleSelfDivergence() { 255959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Golden Executor was self-divergent!"); 256959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle selfDivergent++; 257959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 258959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 259959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 260959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleArchitectureSplit() { 261959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Divergent outputs align with difference in architectures."); 262959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle architectureSplit++; 263959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 264959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 265959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 266959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleMessage(String msg) { 267959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(msg); 268959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 269959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle 270959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle @Override 271959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle public void handleMutations(List<Mutation> mutations) { 272959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write("Mutations Report"); 273959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle for (Mutation mutation : mutations) { 274959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle write(MutationSerializer.getMutationString(mutation)); 275959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 276959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle } 277959ffdf65f280ee90b7944a8dd610564e7f99e69Stephen Kyle} 278