# Global Metrics

path: .metrics.cyclomatic.sum
old: 28.0
new: 34.0
path: .metrics.cyclomatic.average
old: 5.6
new: 1.096774193548387
path: .metrics.halstead.N1
old: 483.0
new: 283.0
path: .metrics.halstead.purity_ratio
old: 1.4836580651889084
new: 1.1137179691355923
path: .metrics.halstead.bugs
old: 1.1731009813641362
new: 0.6884298723174325
path: .metrics.halstead.difficulty
old: 32.90909090909091
new: 31.636363636363637
path: .metrics.halstead.level
old: 0.030386740331491715
new: 0.031609195402298854
path: .metrics.halstead.vocabulary
old: 182.0
new: 90.0
path: .metrics.halstead.time
old: 11598.784356012016
new: 5214.335096100435
path: .metrics.halstead.volume
old: 6344.086470967898
new: 2966.7768650226612
path: .metrics.halstead.effort
old: 208778.11840821628
new: 93858.03172980784
path: .metrics.halstead.n1
old: 28.0
new: 24.0
path: .metrics.halstead.n2
old: 154.0
new: 66.0
path: .metrics.halstead.estimated_program_length
old: 1253.6910650846276
new: 508.9691118949657
path: .metrics.halstead.length
old: 845.0
new: 457.0
path: .metrics.halstead.N2
old: 362.0
new: 174.0
path: .metrics.cognitive.sum
old: 35.0
new: 3.0
path: .metrics.cognitive.average
old: 8.75
new: 0.1111111111111111
path: .metrics.loc.ploc
old: 201.0
new: 85.0
path: .metrics.loc.cloc
old: 16.0
new: 17.0
path: .metrics.loc.sloc
old: 228.0
new: 118.0
path: .metrics.loc.lloc
old: 79.0
new: 31.0
path: .metrics.loc.blank
old: 11.0
new: 16.0
path: .metrics.nom.closures
old: 0.0
new: 1.0
path: .metrics.nom.functions
old: 4.0
new: 26.0
path: .metrics.nom.total
old: 4.0
new: 27.0
path: .metrics.nexits.sum
old: 4.0
new: 16.0
path: .metrics.nexits.average
old: 1.0
new: 0.5925925925925926
path: .metrics.mi.mi_original
old: 31.07715316434222
new: 44.31970574190363
path: .metrics.mi.mi_visual_studio
old: 18.173773780317088
new: 25.917956574212653
path: .metrics.mi.mi_sei
old: -8.066630959546643
new: 19.436406357269632
path: .metrics.nargs.sum
old: 6.0
new: 11.0
path: .metrics.nargs.average
old: 1.5
new: 0.4074074074074074

# Spaces Data

## Minimal test - lines (20, 116)

path: .spaces[0].metrics.nom.closures
old: 0.0
new: 1.0
path: .spaces[0].metrics.nom.functions
old: 1.0
new: 26.0
path: .spaces[0].metrics.nom.total
old: 1.0
new: 27.0
path: .spaces[0].metrics.nexits.sum
old: 0.0
new: 16.0
path: .spaces[0].metrics.nexits.average
old: 0.0
new: 0.5925925925925926
path: .spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 33.0
path: .spaces[0].metrics.cyclomatic.average
old: 1.0
new: 1.1
path: .spaces[0].metrics.loc.ploc
old: 7.0
new: 77.0
path: .spaces[0].metrics.loc.blank
old: 0.0
new: 14.0
path: .spaces[0].metrics.loc.sloc
old: 7.0
new: 97.0
path: .spaces[0].metrics.loc.cloc
old: 0.0
new: 6.0
path: .spaces[0].metrics.loc.lloc
old: 4.0
new: 31.0
path: .spaces[0].metrics.mi.mi_visual_studio
old: 67.30832023207599
new: 27.973385274321583
path: .spaces[0].metrics.mi.mi_original
old: 115.09722759684992
new: 47.83448881908991
path: .spaces[0].metrics.mi.mi_sei
old: 90.45116734143544
new: 15.46149191733184
path: .spaces[0].metrics.halstead.vocabulary
old: 12.0
new: 86.0
path: .spaces[0].metrics.halstead.difficulty
old: 4.642857142857143
new: 32.70967741935484
path: .spaces[0].metrics.halstead.N2
old: 13.0
new: 169.0
path: .spaces[0].metrics.halstead.effort
old: 482.68959384709854
new: 95010.87330622911
path: .spaces[0].metrics.halstead.bugs
old: 0.020511182682883208
new: 0.6940556361041721
path: .spaces[0].metrics.halstead.N1
old: 16.0
new: 283.0
path: .spaces[0].metrics.halstead.n2
old: 7.0
new: 62.0
path: .spaces[0].metrics.halstead.length
old: 29.0
new: 452.0
path: .spaces[0].metrics.halstead.estimated_program_length
old: 31.26112492884004
new: 479.199271261294
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.0779698251324152
new: 1.060175378896668
path: .spaces[0].metrics.halstead.n1
old: 5.0
new: 24.0
path: .spaces[0].metrics.halstead.volume
old: 103.96391252091352
new: 2904.671669125348
path: .spaces[0].metrics.halstead.level
old: 0.21538461538461537
new: 0.03057199211045365
path: .spaces[0].metrics.halstead.time
old: 26.816088547061028
new: 5278.3818503460625
path: .spaces[0].metrics.cognitive.sum
old: 0.0
new: 3.0
path: .spaces[0].metrics.cognitive.average
old: 0.0
new: 0.1111111111111111
path: .spaces[0].metrics.nargs.average
old: 1.0
new: 0.4074074074074074
path: .spaces[0].metrics.nargs.sum
old: 1.0
new: 11.0

### Code

    namespace fuzzer {
    // A simple POD sized array of bytes.
    template  class FixedWord {
    public:
      static const size_t kMaxSize = kMaxSizeT;
      FixedWord() {}
      FixedWord(const uint8_t *B, uint8_t S) { Set(B, S); }

      void Set(const uint8_t *B, uint8_t S) {
        assert(S <= kMaxSize);
        memcpy(Data, B, S);
        Size = S;
      }

      bool operator==(const FixedWord &w) const {
        return Size == w.Size && 0 == memcmp(Data, w.Data, Size);
      }

      static size_t GetMaxSize() { return kMaxSize; }
      const uint8_t *data() const { return Data; }
      uint8_t size() const { return Size; }

    private:
      uint8_t Size = 0;
      uint8_t Data[kMaxSize];
    };

    typedef FixedWord<64> Word;

    class DictionaryEntry {
     public:
      DictionaryEntry() {}
      DictionaryEntry(Word W) : W(W) {}
      DictionaryEntry(Word W, size_t PositionHint) : W(W), PositionHint(PositionHint) {}
      const Word &GetW() const { return W; }

      bool HasPositionHint() const { return PositionHint != std::numeric_limits::max(); }
      size_t GetPositionHint() const {
        assert(HasPositionHint());
        return PositionHint;
      }
      void IncUseCount() { UseCount++; }
      void IncSuccessCount() { SuccessCount++; }
      size_t GetUseCount() const { return UseCount; }
      size_t GetSuccessCount() const {return SuccessCount; }

      void Print(const char *PrintAfter = "\n") {
        PrintASCII(W.data(), W.size());
        if (HasPositionHint())
          Printf("@%zd", GetPositionHint());
        Printf("%s", PrintAfter);
      }

    private:
      Word W;
      size_t PositionHint = std::numeric_limits::max();
      size_t UseCount = 0;
      size_t SuccessCount = 0;
    };

    class Dictionary {
     public:
      static const size_t kMaxDictSize = 1 << 14;

      bool ContainsWord(const Word &W) const {
        return std::any_of(begin(), end(), [&](const DictionaryEntry &DE) {
          return DE.GetW() == W;
        });
      }
      const DictionaryEntry *begin() const { return &DE[0]; }
      const DictionaryEntry *end() const { return begin() + Size; }
      DictionaryEntry & operator[] (size_t Idx) {
        assert(Idx < Size);
        return DE[Idx];
      }
      void push_back(DictionaryEntry DE) {
        if (Size < kMaxDictSize)
          this->DE[Size++] = DE;
      }
      void clear() { Size = 0; }
      bool empty() const { return Size == 0; }
      size_t size() const { return Size; }

    private:
      DictionaryEntry DE[kMaxDictSize];
      size_t Size = 0;
    };

    // Parses one dictionary entry.
    // If successful, write the enty to Unit and returns true,
    // otherwise returns false.
    bool ParseOneDictionaryEntry(const std::string &Str, Unit *U);
    // Parses the dictionary file, fills Units, returns true iff all lines
    // were parsed successfully.
    bool ParseDictionaryFile(const std::string &Text, Vector *Units);

    }  // namespace fuzzer