Global Metrics
path: .metrics.nom.functions
old: 33.0
new: 6.0
path: .metrics.nom.total
old: 36.0
new: 6.0
path: .metrics.nom.closures
old: 3.0
new: 0.0
path: .metrics.nexits.average
old: 0.9444444444444444
new: 0.16666666666666666
path: .metrics.nexits.sum
old: 34.0
new: 1.0
path: .metrics.cyclomatic.sum
old: 82.0
new: 14.0
path: .metrics.cyclomatic.average
old: 2.102564102564102
new: 1.5555555555555556
path: .metrics.loc.cloc
old: 40.0
new: 19.0
path: .metrics.loc.blank
old: 112.0
new: 15.0
path: .metrics.loc.ploc
old: 599.0
new: 57.0
path: .metrics.loc.lloc
old: 194.0
new: 21.0
path: .metrics.loc.sloc
old: 751.0
new: 91.0
path: .metrics.halstead.length
old: 3075.0
new: 220.0
path: .metrics.halstead.estimated_program_length
old: 2709.812731425597
new: 333.72414129577294
path: .metrics.halstead.effort
old: 1898211.597354593
new: 18587.755102040817
path: .metrics.halstead.n2
old: 305.0
new: 49.0
path: .metrics.halstead.level
old: 0.013636465249368476
new: 0.07101449275362319
path: .metrics.halstead.N2
old: 1209.0
new: 92.0
path: .metrics.halstead.bugs
old: 5.110246234757284
new: 0.2338999020230108
path: .metrics.halstead.time
old: 105456.19985303294
new: 1032.6530612244896
path: .metrics.halstead.difficulty
old: 73.3327868852459
new: 14.081632653061224
path: .metrics.halstead.purity_ratio
old: 0.8812399126587308
new: 1.5169279149807862
path: .metrics.halstead.vocabulary
old: 342.0
new: 64.0
path: .metrics.halstead.volume
old: 25884.896483274133
new: 1320.0
path: .metrics.halstead.N1
old: 1866.0
new: 128.0
path: .metrics.halstead.n1
old: 37.0
new: 15.0
path: .metrics.cognitive.sum
old: 26.0
new: 6.0
path: .metrics.cognitive.average
old: 0.7222222222222222
new: 1.0
path: .metrics.nargs.average
old: 1.6666666666666667
new: 0.5
path: .metrics.nargs.sum
old: 60.0
new: 3.0
path: .metrics.mi.mi_sei
old: -61.346121999275354
new: 40.96020929803942
path: .metrics.mi.mi_visual_studio
old: 0.0
new: 33.53220088503443
path: .metrics.mi.mi_original
old: -7.966129195760104
new: 57.34006351340888
Spaces Data
Minimal test - lines (14, 91)
path: .spaces[0].metrics.loc.cloc
old: 0.0
new: 14.0
path: .spaces[0].metrics.loc.lloc
old: 1.0
new: 21.0
path: .spaces[0].metrics.loc.sloc
old: 8.0
new: 78.0
path: .spaces[0].metrics.loc.ploc
old: 8.0
new: 52.0
path: .spaces[0].metrics.loc.blank
old: 0.0
new: 12.0
path: .spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 13.0
path: .spaces[0].metrics.cyclomatic.average
old: 1.0
new: 1.625
path: .spaces[0].metrics.nom.functions
old: 1.0
new: 6.0
path: .spaces[0].metrics.nom.total
old: 1.0
new: 6.0
path: .spaces[0].metrics.cognitive.average
old: 0.0
new: 1.0
path: .spaces[0].metrics.cognitive.sum
old: 0.0
new: 6.0
path: .spaces[0].metrics.nexits.average
old: 0.0
new: 0.16666666666666666
path: .spaces[0].metrics.nexits.sum
old: 0.0
new: 1.0
path: .spaces[0].metrics.halstead.bugs
old: 0.053385531594046416
new: 0.23494965519069225
path: .spaces[0].metrics.halstead.vocabulary
old: 26.0
new: 60.0
path: .spaces[0].metrics.halstead.volume
old: 263.22462421590114
new: 1275.88836865144
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.7260197631988936
new: 1.415447908652607
path: .spaces[0].metrics.halstead.length
old: 56.0
new: 216.0
path: .spaces[0].metrics.halstead.time
old: 112.60164480346884
new: 1039.612744827099
path: .spaces[0].metrics.halstead.level
old: 0.12987012987012986
new: 0.06818181818181819
path: .spaces[0].metrics.halstead.estimated_program_length
old: 96.65710673913804
new: 305.73674826896314
path: .spaces[0].metrics.halstead.n2
old: 15.0
new: 45.0
path: .spaces[0].metrics.halstead.effort
old: 2026.829606462439
new: 18713.029406887785
path: .spaces[0].metrics.halstead.N2
old: 21.0
new: 88.0
path: .spaces[0].metrics.halstead.N1
old: 35.0
new: 128.0
path: .spaces[0].metrics.halstead.difficulty
old: 7.7
new: 14.666666666666666
path: .spaces[0].metrics.halstead.n1
old: 11.0
new: 15.0
path: .spaces[0].metrics.nargs.average
old: 1.0
new: 0.5
path: .spaces[0].metrics.nargs.sum
old: 1.0
new: 3.0
path: .spaces[0].metrics.mi.mi_original
old: 108.10340671373008
new: 60.24404753921574
path: .spaces[0].metrics.mi.mi_sei
old: 80.36121663649277
new: 43.04727259244317
path: .spaces[0].metrics.mi.mi_visual_studio
old: 63.21836649925735
new: 35.23043715743611
Code
namespace mozilla {
// We use a static var 'fuzzerRunner' defined in nsAppRunner.cpp.
// fuzzerRunner is initialized to nullptr but if this file is linked in,
// then fuzzerRunner will be set here indicating that
// we want to call into either LibFuzzer's main or the AFL entrypoint.
class _InitFuzzer {
public:
_InitFuzzer() { fuzzerRunner = new FuzzerRunner(); }
void InitXPCOM() { mScopedXPCOM = new ScopedXPCOM("Fuzzer"); }
void DeinitXPCOM() {
if (mScopedXPCOM) delete mScopedXPCOM;
mScopedXPCOM = nullptr;
}
private:
ScopedXPCOM* mScopedXPCOM;
} InitLibFuzzer;
static void DeinitXPCOM() { InitLibFuzzer.DeinitXPCOM(); }
int FuzzerRunner::Run(int* argc, char*** argv) {
/*
* libFuzzer uses exit() calls in several places instead of returning,
* so the destructor of ScopedXPCOM is not called in some cases.
* For fuzzing, this does not make a difference, but in debug builds
* when running a single testcase, this causes an assertion when destroying
* global linked lists. For this reason, we allocate ScopedXPCOM on the heap
* using the global InitLibFuzzer class, combined with an atexit call to
* destroy the ScopedXPCOM instance again.
*/
InitLibFuzzer.InitXPCOM();
std::atexit(DeinitXPCOM);
const char* fuzzerEnv = getenv("FUZZER");
if (!fuzzerEnv) {
fprintf(stderr,
"Must specify fuzzing target in FUZZER environment variable\n");
exit(1);
}
std::string moduleNameStr(fuzzerEnv);
FuzzerFunctions funcs =
FuzzerRegistry::getInstance().getModuleFunctions(moduleNameStr);
FuzzerInitFunc initFunc = funcs.first;
FuzzerTestingFunc testingFunc = funcs.second;
if (initFunc) {
int ret = initFunc(argc, argv);
if (ret) {
fprintf(stderr, "Fuzzing Interface: Error: Initialize callback failed\n");
exit(1);
}
}
if (!testingFunc) {
fprintf(stderr, "Fuzzing Interface: Error: No testing callback found\n");
exit(1);
}
#ifdef LIBFUZZER
int ret = mFuzzerDriver(argc, argv, testingFunc);
#else
// For AFL, testingFunc points to the entry function we need.
int ret = testingFunc(NULL, 0);
#endif
InitLibFuzzer.DeinitXPCOM();
return ret;
}
#ifdef LIBFUZZER
void FuzzerRunner::setParams(LibFuzzerDriver aDriver) {
mFuzzerDriver = aDriver;
}
#endif
} // namespace mozilla