@SuppressWarnings("java:S2189") // the endless loop is on purpose
  public void start()
      throws InvocationTargetException, IllegalAccessException, NoSuchAlgorithmException {
    System.out.printf("#0 READ units: %d%n", this.corpus.getLength());
    this.totalCoverage = 0;
    this.totalExecutions = 0;
    this.executionsInSample = 0;
    this.lastSampleTime = System.currentTimeMillis();

    Map<String, Integer> hitMap = new HashMap<>();
    // preload some values so we don't get false hits in coverage we don't care about.
    hitMap.put("org/hyperledger/besu/testfuzz/EofContainerSubCommand", 100);
    hitMap.put("org/hyperledger/besu/testfuzz/Fuzzer", 100);
    hitMap.put("org/hyperledger/besu/testfuzz/Fuzzer$HitCounter", 100);
    hitMap.put("org/hyperledger/besu/testfuzz/InternalClient", 100);

    while (true) {
      byte[] buf = this.corpus.generateInput();
      // The next version will run this in a different thread.
      try {
        this.target.fuzz(buf);
      } catch (Exception e) {
        e.printStackTrace(System.out);
        this.writeCrash(buf);
        System.exit(1);
        break;
      }

      this.totalExecutions++;
      this.executionsInSample++;

      long newCoverage = getHitCount(hitMap);
      if (newCoverage > this.totalCoverage) {
        this.totalCoverage = newCoverage;
        this.corpus.putBuffer(buf);
        if (totalExecutions > corpus.getLength()) {
          this.logStats("NEW");
          if (newCorpusDir != null) {

            String filename = fileNameForBuffer(buf);
            try (var pw =
                new PrintWriter(
                    new BufferedWriter(
                        new OutputStreamWriter(
                            new FileOutputStream(new File(newCorpusDir, filename)), UTF_8)))) {
              pw.println(Bytes.wrap(buf).toHexString());
            } catch (IOException e) {
              e.printStackTrace(System.out);
            }
          }
        }
      } else if ((System.currentTimeMillis() - this.lastSampleTime) > 30000) {
        this.logStats("PULSE");
      }
    }
  }
Runs the fuzzer until the VM is shut down

@throws InvocationTargetException if the wrong version of jacoco is loaded
@throws IllegalAccessException if the wrong version of jacoco is loaded
@throws NoSuchAlgorithmException if our favorite hash algo is not loaded
testfuzz/src/main/java/org/hyperledger/besu/testfuzz/javafuzz/Fuzzer.java