# Global Metrics

path: .metrics.cyclomatic.average
old: 1.0
new: 2.0
path: .metrics.cyclomatic.sum
old: 4.0
new: 38.0
path: .metrics.cognitive.average
old: null
new: 1.2105263157894737
path: .metrics.cognitive.sum
old: 0.0
new: 23.0
path: .metrics.halstead.volume
old: 644.1496881499434
new: 5547.431400813863
path: .metrics.halstead.n2
old: 39.0
new: 112.0
path: .metrics.halstead.time
old: 322.0748440749717
new: 12448.700226826348
path: .metrics.halstead.estimated_program_length
old: 254.23640287146188
new: 903.3052001291512
path: .metrics.halstead.level
old: 0.1111111111111111
new: 0.024756852343059237
path: .metrics.halstead.N1
old: 59.0
new: 465.0
path: .metrics.halstead.vocabulary
old: 52.0
new: 141.0
path: .metrics.halstead.length
old: 113.0
new: 777.0
path: .metrics.halstead.purity_ratio
old: 2.2498796714288662
new: 1.162554955121173
path: .metrics.halstead.bugs
old: 0.10757176278405182
new: 1.2297299621018802
path: .metrics.halstead.difficulty
old: 9.0
new: 40.392857142857146
path: .metrics.halstead.effort
old: 5797.34719334949
new: 224076.60408287423
path: .metrics.halstead.N2
old: 54.0
new: 312.0
path: .metrics.halstead.n1
old: 13.0
new: 29.0
path: .metrics.nexits.sum
old: 0.0
new: 9.0
path: .metrics.nexits.average
old: null
new: 0.47368421052631576
path: .metrics.loc.lloc
old: 0.0
new: 56.0
path: .metrics.loc.sloc
old: 52.0
new: 160.0
path: .metrics.loc.ploc
old: 32.0
new: 127.0
path: .metrics.loc.blank
old: 12.0
new: 19.0
path: .metrics.loc.cloc
old: 8.0
new: 14.0
path: .metrics.nom.total
old: 0.0
new: 19.0
path: .metrics.nom.closures
old: 0.0
new: 3.0
path: .metrics.nom.functions
old: 0.0
new: 16.0
path: .metrics.mi.mi_visual_studio
old: 42.360590562341464
new: 20.592113854205113
path: .metrics.mi.mi_original
old: 72.4366098616039
new: 35.21251469069074
path: .metrics.mi.mi_sei
old: 57.75708874508783
new: 1.0885292179978627
path: .metrics.nargs.average
old: null
new: 1.5789473684210529
path: .metrics.nargs.sum
old: 0.0
new: 30.0

# Spaces Data

## Minimal test - lines (23, 160)

path: .spaces[0].metrics.cognitive.sum
old: 0.0
new: 23.0
path: .spaces[0].metrics.cognitive.average
old: null
new: 1.2105263157894737
path: .spaces[0].metrics.cyclomatic.average
old: 1.0
new: 2.0555555555555554
path: .spaces[0].metrics.cyclomatic.sum
old: 3.0
new: 37.0
path: .spaces[0].metrics.nom.functions
old: 0.0
new: 16.0
path: .spaces[0].metrics.nom.total
old: 0.0
new: 19.0
path: .spaces[0].metrics.nom.closures
old: 0.0
new: 3.0
path: .spaces[0].metrics.loc.cloc
old: 1.0
new: 4.0
path: .spaces[0].metrics.loc.lloc
old: 0.0
new: 56.0
path: .spaces[0].metrics.loc.ploc
old: 26.0
new: 116.0
path: .spaces[0].metrics.loc.sloc
old: 37.0
new: 138.0
path: .spaces[0].metrics.loc.blank
old: 10.0
new: 18.0
path: .spaces[0].metrics.mi.mi_sei
old: 50.484461569300336
new: -4.2050323843554445
path: .spaces[0].metrics.mi.mi_original
old: 78.5216432994041
new: 37.91046802417267
path: .spaces[0].metrics.mi.mi_visual_studio
old: 45.91908964877433
new: 22.169864341621448
path: .spaces[0].metrics.nargs.average
old: null
new: 1.5789473684210529
path: .spaces[0].metrics.nargs.sum
old: 0.0
new: 30.0
path: .spaces[0].metrics.halstead.n2
old: 35.0
new: 107.0
path: .spaces[0].metrics.halstead.time
old: 304.9389525393751
new: 12646.145964071437
path: .spaces[0].metrics.halstead.effort
old: 5488.901145708752
new: 227630.62735328585
path: .spaces[0].metrics.halstead.N2
old: 49.0
new: 307.0
path: .spaces[0].metrics.halstead.N1
old: 59.0
new: 465.0
path: .spaces[0].metrics.halstead.volume
old: 603.1759500778849
new: 5471.5213134452615
path: .spaces[0].metrics.halstead.bugs
old: 0.1037215547643092
new: 1.242698790057779
path: .spaces[0].metrics.halstead.difficulty
old: 9.1
new: 41.60280373831776
path: .spaces[0].metrics.halstead.n1
old: 13.0
new: 29.0
path: .spaces[0].metrics.halstead.level
old: 0.10989010989010987
new: 0.02403684151409637
path: .spaces[0].metrics.halstead.purity_ratio
old: 2.107690943786185
new: 1.1168632336834483
path: .spaces[0].metrics.halstead.estimated_program_length
old: 227.630621928908
new: 862.2184164036223
path: .spaces[0].metrics.halstead.length
old: 108.0
new: 772.0
path: .spaces[0].metrics.halstead.vocabulary
old: 48.0
new: 136.0
path: .spaces[0].metrics.nexits.average
old: null
new: 0.47368421052631576
path: .spaces[0].metrics.nexits.sum
old: 0.0
new: 9.0

### Code

    namespace fuzzer {

    static FILE *OutputFile = stderr;

    long GetEpoch(const std::string &Path) {
      struct stat St;
      if (stat(Path.c_str(), &St))
        return 0;  // Can't stat, be conservative.
      return St.st_mtime;
    }

    Unit FileToVector(const std::string &Path, size_t MaxSize, bool ExitOnError) {
      std::ifstream T(Path, std::ios::binary);
      if (ExitOnError && !T) {
        Printf("No such directory: %s; exiting\n", Path.c_str());
        exit(1);
      }

      T.seekg(0, T.end);
      auto EndPos = T.tellg();
      if (EndPos < 0) return {};
      size_t FileLen = EndPos;
      if (MaxSize)
        FileLen = std::min(FileLen, MaxSize);

      T.seekg(0, T.beg);
      Unit Res(FileLen);
      T.read(reinterpret_cast(Res.data()), FileLen);
      return Res;
    }

    std::string FileToString(const std::string &Path) {
      std::ifstream T(Path, std::ios::binary);
      return std::string((std::istreambuf_iterator(T)),
                         std::istreambuf_iterator());
    }

    void CopyFileToErr(const std::string &Path) {
      Printf("%s", FileToString(Path).c_str());
    }

    void WriteToFile(const Unit &U, const std::string &Path) {
      WriteToFile(U.data(), U.size(), Path);
    }

    void WriteToFile(const std::string &Data, const std::string &Path) {
      WriteToFile(reinterpret_cast(Data.c_str()), Data.size(),
                  Path);
    }

    void WriteToFile(const uint8_t *Data, size_t Size, const std::string &Path) {
      // Use raw C interface because this function may be called from a sig handler.
      FILE *Out = fopen(Path.c_str(), "wb");
      if (!Out) return;
      mozilla::Unused << fwrite(Data, sizeof(Data[0]), Size, Out);
      fclose(Out);
    }

    void ReadDirToVectorOfUnits(const char *Path, Vector *V,
                                long *Epoch, size_t MaxSize, bool ExitOnError) {
      long E = Epoch ? *Epoch : 0;
      Vector Files;
      ListFilesInDirRecursive(Path, Epoch, &Files, /*TopDir*/true);
      size_t NumLoaded = 0;
      for (size_t i = 0; i < Files.size(); i++) {
        auto &X = Files[i];
        if (Epoch && GetEpoch(X) < E) continue;
        NumLoaded++;
        if ((NumLoaded & (NumLoaded - 1)) == 0 && NumLoaded >= 1024)
          Printf("Loaded %zd/%zd files from %s\n", NumLoaded, Files.size(), Path);
        auto S = FileToVector(X, MaxSize, ExitOnError);
        if (!S.empty())
          V->push_back(S);
      }
    }

    void GetSizedFilesFromDir(const std::string &Dir, Vector *V) {
      Vector Files;
      ListFilesInDirRecursive(Dir, 0, &Files, /*TopDir*/true);
      for (auto &File : Files)
        if (size_t Size = FileSize(File))
          V->push_back({File, Size});
    }

    std::string DirPlusFile(const std::string &DirPath,
                            const std::string &FileName) {
      return DirPath + GetSeparator() + FileName;
    }

    void DupAndCloseStderr() {
      int OutputFd = DuplicateFile(2);
      if (OutputFd >= 0) {
        FILE *NewOutputFile = OpenFile(OutputFd, "w");
        if (NewOutputFile) {
          OutputFile = NewOutputFile;
          if (EF->__sanitizer_set_report_fd)
            EF->__sanitizer_set_report_fd(
                reinterpret_cast(GetHandleFromFd(OutputFd)));
          DiscardOutput(2);
        }
      }
    }

    void CloseStdout() {
      DiscardOutput(1);
    }

    void Printf(const char *Fmt, ...) {
      va_list ap;
      va_start(ap, Fmt);
      vfprintf(OutputFile, Fmt, ap);
      va_end(ap);
      fflush(OutputFile);
    }

    void VPrintf(bool Verbose, const char *Fmt, ...) {
      if (!Verbose) return;
      va_list ap;
      va_start(ap, Fmt);
      vfprintf(OutputFile, Fmt, ap);
      va_end(ap);
      fflush(OutputFile);
    }

    void RmDirRecursive(const std::string &Dir) {
      IterateDirRecursive(
          Dir, [](const std::string &Path) {},
          [](const std::string &Path) { RmDir(Path); },
          [](const std::string &Path) { RemoveFile(Path); });
    }

    std::string TempPath(const char *Prefix, const char *Extension) {
      return DirPlusFile(TmpDir(), std::string("libFuzzerTemp.") + Prefix +
                                       std::to_string(GetPid()) + Extension);
    }

    }  // namespace fuzzer

## Minimal test - lines (28, 28)

path: .spaces[0].spaces[0].spaces[0].metrics.loc.blank
old: 9.0
new: 0.0
path: .spaces[0].spaces[0].spaces[0].metrics.loc.ploc
old: 22.0
new: 1.0
path: .spaces[0].spaces[0].spaces[0].metrics.loc.sloc
old: 31.0
new: 1.0
path: .spaces[0].spaces[0].spaces[0].metrics.mi.mi_visual_studio
old: 48.042045199612915
new: null
path: .spaces[0].spaces[0].spaces[0].metrics.mi.mi_sei
old: 42.921102689224625
new: null
path: .spaces[0].spaces[0].spaces[0].metrics.mi.mi_original
old: 82.15189729133809
new: null
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.n1
old: 13.0
new: 0.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.N1
old: 56.0
new: 0.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.N2
old: 47.0
new: 1.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.effort
old: 5266.8837057656965
new: 0.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.level
old: 0.10801963993453356
new: null
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.volume
old: 568.9268814738723
new: 0.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.estimated_program_length
old: 214.57072227466315
new: null
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.purity_ratio
old: 2.083210895870516
new: null
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.n2
old: 33.0
new: 1.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.time
old: 292.60465032031647
new: 0.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.difficulty
old: 9.257575757575758
new: 0.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.length
old: 103.0
new: 1.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.vocabulary
old: 46.0
new: 1.0
path: .spaces[0].spaces[0].spaces[0].metrics.halstead.bugs
old: 0.1009054363298151
new: 0.0

### Code

      struct stat St;

## Minimal test - lines (27, 32)

path: .spaces[0].spaces[0].metrics.nexits.average
old: null
new: 2.0
path: .spaces[0].spaces[0].metrics.nexits.sum
old: 0.0
new: 2.0
path: .spaces[0].spaces[0].metrics.nom.functions
old: 0.0
new: 1.0
path: .spaces[0].spaces[0].metrics.nom.total
old: 0.0
new: 1.0
path: .spaces[0].spaces[0].metrics.cognitive.average
old: null
new: 1.0
path: .spaces[0].spaces[0].metrics.cognitive.sum
old: 0.0
new: 1.0
path: .spaces[0].spaces[0].metrics.nargs.sum
old: 0.0
new: 1.0
path: .spaces[0].spaces[0].metrics.nargs.average
old: null
new: 1.0
path: .spaces[0].spaces[0].metrics.mi.mi_original
old: 79.77743120197324
new: 116.45235116672234
path: .spaces[0].spaces[0].metrics.mi.mi_sei
old: 39.59729209674346
new: 122.16619297505572
path: .spaces[0].spaces[0].metrics.mi.mi_visual_studio
old: 46.65346853916564
new: 68.10079015597798
path: .spaces[0].spaces[0].metrics.loc.sloc
old: 35.0
new: 6.0
path: .spaces[0].spaces[0].metrics.loc.blank
old: 11.0
new: 0.0
path: .spaces[0].spaces[0].metrics.loc.cloc
old: 0.0
new: 1.0
path: .spaces[0].spaces[0].metrics.loc.ploc
old: 24.0
new: 6.0
path: .spaces[0].spaces[0].metrics.loc.lloc
old: 0.0
new: 3.0
path: .spaces[0].spaces[0].metrics.halstead.bugs
old: 0.1026363152966502
new: 0.02872868874940668
path: .spaces[0].spaces[0].metrics.halstead.estimated_program_length
old: 221.07945293834572
new: 52.529325012980806
path: .spaces[0].spaces[0].metrics.halstead.time
old: 300.1656250043837
new: 44.451158398597435
path: .spaces[0].spaces[0].metrics.halstead.vocabulary
old: 47.0
new: 17.0
path: .spaces[0].spaces[0].metrics.halstead.level
old: 0.10897435897435898
new: 0.14814814814814814
path: .spaces[0].spaces[0].metrics.halstead.purity_ratio
old: 2.085655216399488
new: 1.8113560349303728
path: .spaces[0].spaces[0].metrics.halstead.n2
old: 34.0
new: 8.0
path: .spaces[0].spaces[0].metrics.halstead.effort
old: 5402.981250078907
new: 800.1208511747539
path: .spaces[0].spaces[0].metrics.halstead.volume
old: 588.7864182778296
new: 118.53642239625984
path: .spaces[0].spaces[0].metrics.halstead.N2
old: 48.0
new: 12.0
path: .spaces[0].spaces[0].metrics.halstead.N1
old: 58.0
new: 17.0
path: .spaces[0].spaces[0].metrics.halstead.n1
old: 13.0
new: 9.0
path: .spaces[0].spaces[0].metrics.halstead.difficulty
old: 9.176470588235292
new: 6.75
path: .spaces[0].spaces[0].metrics.halstead.length
old: 106.0
new: 29.0
path: .spaces[0].spaces[0].metrics.cyclomatic.average
old: 1.0
new: 1.5
path: .spaces[0].spaces[0].metrics.cyclomatic.sum
old: 2.0
new: 3.0

### Code

    long GetEpoch(const std::string &Path) {
      struct stat St;
      if (stat(Path.c_str(), &St))
        return 0;  // Can't stat, be conservative.
      return St.st_mtime;
    }