Global Metrics

path: .metrics.cyclomatic.average
old: 1.25
new: 2.4

path: .metrics.cyclomatic.sum
old: 5.0
new: 60.0

path: .metrics.mi.mi_original
old: 59.5574687809732
new: 28.55275418342231

path: .metrics.mi.mi_sei
old: 52.32462384771204
new: -8.772481586451352

path: .metrics.mi.mi_visual_studio
old: 34.82892911168023
new: 16.697517066328835

path: .metrics.halstead.vocabulary
old: 72.0
new: 138.0

path: .metrics.halstead.difficulty
old: 10.258620689655173
new: 39.58181818181818

path: .metrics.halstead.volume
old: 1240.154925289905
new: 5509.106454003081

path: .metrics.halstead.N2
old: 85.0
new: 311.0

path: .metrics.halstead.purity_ratio
old: 1.9555515752547543
new: 1.1362006532971942

path: .metrics.halstead.level
old: 0.09747899159663866
new: 0.025264124942581536

path: .metrics.halstead.N1
old: 116.0
new: 464.0

path: .metrics.halstead.n1
old: 14.0
new: 28.0

path: .metrics.halstead.estimated_program_length
old: 393.0658666262056
new: 880.5555063053255

path: .metrics.halstead.bugs
old: 0.18165834574261755
new: 1.207619214831696

path: .metrics.halstead.effort
old: 12722.27897495678
new: 218060.45000663103

path: .metrics.halstead.length
old: 201.0
new: 775.0

path: .metrics.halstead.time
old: 706.7932763864878
new: 12114.469444812836

path: .metrics.halstead.n2
old: 58.0
new: 110.0

path: .metrics.loc.ploc
old: 44.0
new: 142.0

path: .metrics.loc.sloc
old: 92.0
new: 177.0

path: .metrics.loc.blank
old: 11.0
new: 23.0

path: .metrics.loc.lloc
old: 3.0
new: 63.0

path: .metrics.loc.cloc
old: 37.0
new: 12.0

path: .metrics.nargs.sum
old: 0.0
new: 23.0

path: .metrics.nargs.average
old: 0.0
new: 1.15

path: .metrics.cognitive.sum
old: 0.0
new: 32.0

path: .metrics.cognitive.average
old: 0.0
new: 1.6

path: .metrics.nexits.average
old: 1.0
new: 1.2

path: .metrics.nexits.sum
old: 2.0
new: 24.0

path: .metrics.nom.functions
old: 2.0
new: 20.0

path: .metrics.nom.total
old: 2.0
new: 20.0

Spaces Data

Minimal test - lines (28, 33)

path: .spaces[0].spaces[0].metrics.halstead.effort
old: 49.12871113600807
new: 981.7432475514064

path: .spaces[0].spaces[0].metrics.halstead.bugs
old: 0.004471319041702271
new: 0.032926383120867174

path: .spaces[0].spaces[0].metrics.halstead.n2
old: 2.0
new: 9.0

path: .spaces[0].spaces[0].metrics.halstead.purity_ratio
old: 1.944234353490973
new: 1.9296439363079512

path: .spaces[0].spaces[0].metrics.halstead.vocabulary
old: 7.0
new: 19.0

path: .spaces[0].spaces[0].metrics.halstead.N1
old: 5.0
new: 19.0

path: .spaces[0].spaces[0].metrics.halstead.estimated_program_length
old: 13.60964047443681
new: 61.74860596185444

path: .spaces[0].spaces[0].metrics.halstead.length
old: 7.0
new: 32.0

path: .spaces[0].spaces[0].metrics.halstead.time
old: 2.7293728408893374
new: 54.541291530633686

path: .spaces[0].spaces[0].metrics.halstead.volume
old: 19.651484454403228
new: 135.93368043019473

path: .spaces[0].spaces[0].metrics.halstead.difficulty
old: 2.5
new: 7.222222222222222

path: .spaces[0].spaces[0].metrics.halstead.N2
old: 2.0
new: 13.0

path: .spaces[0].spaces[0].metrics.halstead.level
old: 0.4
new: 0.13846153846153847

path: .spaces[0].spaces[0].metrics.halstead.n1
old: 5.0
new: 10.0

path: .spaces[0].spaces[0].metrics.nargs.average
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.cyclomatic.sum
old: 1.0
new: 3.0

path: .spaces[0].spaces[0].metrics.cyclomatic.average
old: 1.0
new: 1.5

path: .spaces[0].spaces[0].metrics.cognitive.sum
old: 0.0
new: 1.0

path: .spaces[0].spaces[0].metrics.cognitive.average
old: 0.0
new: 1.0

path: .spaces[0].spaces[0].metrics.nexits.average
old: 1.0
new: 2.0

path: .spaces[0].spaces[0].metrics.nexits.sum
old: 1.0
new: 2.0

path: .spaces[0].spaces[0].metrics.loc.lloc
old: 1.0
new: 3.0

path: .spaces[0].spaces[0].metrics.loc.ploc
old: 3.0
new: 6.0

path: .spaces[0].spaces[0].metrics.loc.sloc
old: 3.0
new: 6.0

path: .spaces[0].spaces[0].metrics.mi.mi_sei
old: 122.75146225357946
new: 91.58245991751792

path: .spaces[0].spaces[0].metrics.mi.mi_visual_studio
old: 80.40121985172942
new: 67.68434360199267

path: .spaces[0].spaces[0].metrics.mi.mi_original
old: 137.4860859464573
new: 115.74022755940746

Code

bool IsFile(const std::string &Path) {
  struct stat St;
  if (stat(Path.c_str(), &St))
    return false;
  return S_ISREG(St.st_mode);
}

Minimal test - lines (35, 40)

path: .spaces[0].spaces[1].metrics.loc.lloc
old: 2.0
new: 3.0

path: .spaces[0].spaces[1].metrics.loc.sloc
old: 4.0
new: 6.0

path: .spaces[0].spaces[1].metrics.loc.ploc
old: 4.0
new: 6.0

path: .spaces[0].spaces[1].metrics.nexits.average
old: 1.0
new: 2.0

path: .spaces[0].spaces[1].metrics.nexits.sum
old: 1.0
new: 2.0

path: .spaces[0].spaces[1].metrics.cyclomatic.sum
old: 1.0
new: 3.0

path: .spaces[0].spaces[1].metrics.cyclomatic.average
old: 1.0
new: 1.5

path: .spaces[0].spaces[1].metrics.nargs.sum
old: 0.0
new: 1.0

path: .spaces[0].spaces[1].metrics.nargs.average
old: 0.0
new: 1.0

path: .spaces[0].spaces[1].metrics.cognitive.sum
old: 0.0
new: 1.0

path: .spaces[0].spaces[1].metrics.cognitive.average
old: 0.0
new: 1.0

path: .spaces[0].spaces[1].metrics.halstead.volume
old: 62.907475208398566
new: 135.93368043019473

path: .spaces[0].spaces[1].metrics.halstead.purity_ratio
old: 2.068309379925304
new: 1.9296439363079512

path: .spaces[0].spaces[1].metrics.halstead.difficulty
old: 4.083333333333333
new: 7.222222222222222

path: .spaces[0].spaces[1].metrics.halstead.effort
old: 256.8721904342941
new: 981.7432475514064

path: .spaces[0].spaces[1].metrics.halstead.n1
old: 7.0
new: 10.0

path: .spaces[0].spaces[1].metrics.halstead.N1
old: 10.0
new: 19.0

path: .spaces[0].spaces[1].metrics.halstead.length
old: 17.0
new: 32.0

path: .spaces[0].spaces[1].metrics.halstead.level
old: 0.2448979591836735
new: 0.13846153846153847

path: .spaces[0].spaces[1].metrics.halstead.time
old: 14.270677246349672
new: 54.541291530633686

path: .spaces[0].spaces[1].metrics.halstead.bugs
old: 0.013469665311234006
new: 0.032926383120867174

path: .spaces[0].spaces[1].metrics.halstead.N2
old: 7.0
new: 13.0

path: .spaces[0].spaces[1].metrics.halstead.estimated_program_length
old: 35.161259458730164
new: 61.74860596185444

path: .spaces[0].spaces[1].metrics.halstead.vocabulary
old: 13.0
new: 19.0

path: .spaces[0].spaces[1].metrics.halstead.n2
old: 6.0
new: 9.0

path: .spaces[0].spaces[1].metrics.mi.mi_original
old: 126.77537335305064
new: 115.74022755940746

path: .spaces[0].spaces[1].metrics.mi.mi_sei
old: 107.29917031068469
new: 91.58245991751792

path: .spaces[0].spaces[1].metrics.mi.mi_visual_studio
old: 74.13764523570212
new: 67.68434360199267

Code

static bool IsDirectory(const std::string &Path) {
  struct stat St;
  if (stat(Path.c_str(), &St))
    return false;
  return S_ISDIR(St.st_mode);
}

Minimal test - lines (26, 175)

path: .spaces[0].metrics.nargs.average
old: 0.0
new: 1.15

path: .spaces[0].metrics.nargs.sum
old: 0.0
new: 23.0

path: .spaces[0].metrics.mi.mi_sei
old: 57.25868642231751
new: -17.626637724737254

path: .spaces[0].metrics.mi.mi_original
old: 64.07653738625666
new: 31.788394494535453

path: .spaces[0].metrics.mi.mi_visual_studio
old: 37.47165929020857
new: 18.58970438276927

path: .spaces[0].metrics.loc.blank
old: 10.0
new: 22.0

path: .spaces[0].metrics.loc.lloc
old: 3.0
new: 63.0

path: .spaces[0].metrics.loc.sloc
old: 72.0
new: 150.0

path: .spaces[0].metrics.loc.cloc
old: 26.0
new: 1.0

path: .spaces[0].metrics.loc.ploc
old: 36.0
new: 127.0

path: .spaces[0].metrics.nexits.average
old: 1.0
new: 1.2

path: .spaces[0].metrics.nexits.sum
old: 2.0
new: 24.0

path: .spaces[0].metrics.nom.functions
old: 2.0
new: 20.0

path: .spaces[0].metrics.nom.total
old: 2.0
new: 20.0

path: .spaces[0].metrics.cognitive.average
old: 0.0
new: 1.55

path: .spaces[0].metrics.cognitive.sum
old: 0.0
new: 31.0

path: .spaces[0].metrics.halstead.bugs
old: 0.1771243761313666
new: 1.2225829823224792

path: .spaces[0].metrics.halstead.purity_ratio
old: 1.812050954674317
new: 1.082619360031623

path: .spaces[0].metrics.halstead.time
old: 680.4980379377726
new: 12340.33349319409

path: .spaces[0].metrics.halstead.N2
old: 78.0
new: 305.0

path: .spaces[0].metrics.halstead.difficulty
old: 10.5
new: 41.05769230769231

path: .spaces[0].metrics.halstead.length
old: 193.0
new: 768.0

path: .spaces[0].metrics.halstead.estimated_program_length
old: 349.7258342521432
new: 831.4516685042864

path: .spaces[0].metrics.halstead.vocabulary
old: 66.0
new: 132.0

path: .spaces[0].metrics.halstead.n2
old: 52.0
new: 104.0

path: .spaces[0].metrics.halstead.level
old: 0.09523809523809525
new: 0.024355971896955503

path: .spaces[0].metrics.halstead.n1
old: 14.0
new: 28.0

path: .spaces[0].metrics.halstead.effort
old: 12248.964682879903
new: 222126.0028774936

path: .spaces[0].metrics.halstead.volume
old: 1166.5680650361817
new: 5410.094683667292

path: .spaces[0].metrics.halstead.N1
old: 115.0
new: 463.0

path: .spaces[0].metrics.cyclomatic.sum
old: 4.0
new: 58.0

path: .spaces[0].metrics.cyclomatic.average
old: 1.3333333333333333
new: 2.4166666666666665

Code

namespace fuzzer {

bool IsFile(const std::string &Path) {
  struct stat St;
  if (stat(Path.c_str(), &St))
    return false;
  return S_ISREG(St.st_mode);
}

static bool IsDirectory(const std::string &Path) {
  struct stat St;
  if (stat(Path.c_str(), &St))
    return false;
  return S_ISDIR(St.st_mode);
}

size_t FileSize(const std::string &Path) {
  struct stat St;
  if (stat(Path.c_str(), &St))
    return 0;
  return St.st_size;
}

std::string Basename(const std::string &Path) {
  size_t Pos = Path.rfind(GetSeparator());
  if (Pos == std::string::npos) return Path;
  assert(Pos < Path.size());
  return Path.substr(Pos + 1);
}

void ListFilesInDirRecursive(const std::string &Dir, long *Epoch,
                             Vector *V, bool TopDir) {
  auto E = GetEpoch(Dir);
  if (Epoch)
    if (E && *Epoch >= E) return;

  DIR *D = opendir(Dir.c_str());
  if (!D) {
    Printf("%s: %s; exiting\n", strerror(errno), Dir.c_str());
    exit(1);
  }
  while (auto E = readdir(D)) {
    std::string Path = DirPlusFile(Dir, E->d_name);
    if (E->d_type == DT_REG || E->d_type == DT_LNK ||
        (E->d_type == DT_UNKNOWN && IsFile(Path)))
      V->push_back(Path);
    else if ((E->d_type == DT_DIR ||
             (E->d_type == DT_UNKNOWN && IsDirectory(Path))) &&
             *E->d_name != '.')
      ListFilesInDirRecursive(Path, Epoch, V, false);
  }
  closedir(D);
  if (Epoch && TopDir)
    *Epoch = E;
}


void IterateDirRecursive(const std::string &Dir,
                         void (*DirPreCallback)(const std::string &Dir),
                         void (*DirPostCallback)(const std::string &Dir),
                         void (*FileCallback)(const std::string &Dir)) {
  DirPreCallback(Dir);
  DIR *D = opendir(Dir.c_str());
  if (!D) return;
  while (auto E = readdir(D)) {
    std::string Path = DirPlusFile(Dir, E->d_name);
    if (E->d_type == DT_REG || E->d_type == DT_LNK ||
        (E->d_type == DT_UNKNOWN && IsFile(Path)))
      FileCallback(Path);
    else if ((E->d_type == DT_DIR ||
             (E->d_type == DT_UNKNOWN && IsDirectory(Path))) &&
             *E->d_name != '.')
      IterateDirRecursive(Path, DirPreCallback, DirPostCallback, FileCallback);
  }
  closedir(D);
  DirPostCallback(Dir);
}

char GetSeparator() {
  return '/';
}

FILE* OpenFile(int Fd, const char* Mode) {
  return fdopen(Fd, Mode);
}

int CloseFile(int fd) {
  return close(fd);
}

int DuplicateFile(int Fd) {
  return dup(Fd);
}

void RemoveFile(const std::string &Path) {
  unlink(Path.c_str());
}

void RenameFile(const std::string &OldPath, const std::string &NewPath) {
  rename(OldPath.c_str(), NewPath.c_str());
}

intptr_t GetHandleFromFd(int fd) {
  return static_cast(fd);
}

std::string DirName(const std::string &FileName) {
  char *Tmp = new char[FileName.size() + 1];
  memcpy(Tmp, FileName.c_str(), FileName.size() + 1);
  std::string Res = dirname(Tmp);
  delete [] Tmp;
  return Res;
}

std::string TmpDir() {
  if (auto Env = getenv("TMPDIR"))
    return Env;
  return "/tmp";
}

bool IsInterestingCoverageFile(const std::string &FileName) {
  if (FileName.find("compiler-rt/lib/") != std::string::npos)
    return false; // sanitizer internal.
  if (FileName.find("/usr/lib/") != std::string::npos)
    return false;
  if (FileName.find("/usr/include/") != std::string::npos)
    return false;
  if (FileName == "")
    return false;
  return true;
}

void RawPrint(const char *Str) {
  mozilla::Unused << write(2, Str, strlen(Str));
}

void MkDir(const std::string &Path) {
  mkdir(Path.c_str(), 0700);
}

void RmDir(const std::string &Path) {
  rmdir(Path.c_str());
}

const std::string &getDevNull() {
  static const std::string devNull = "/dev/null";
  return devNull;
}

}  // namespace fuzzer