size_t Fuzzer::RecordCallerCalleeCoverage() { if (!Options.UseIndirCalls) return 0; if (!__sanitizer_get_total_unique_caller_callee_pairs) return 0; return LastRecordedCallerCalleeCoverage = __sanitizer_get_total_unique_caller_callee_pairs(); }
// Records data to a maximum coverage tracker. Returns true if additional // coverage was discovered. static bool RecordMax(const Fuzzer::FuzzingOptions &Options, Fuzzer::Coverage *C) { bool Res = false; uint64_t NewBlockCoverage = __sanitizer_get_total_unique_coverage(); if (NewBlockCoverage > C->BlockCoverage) { Res = true; C->BlockCoverage = NewBlockCoverage; } if (Options.UseIndirCalls && __sanitizer_get_total_unique_caller_callee_pairs) { uint64_t NewCallerCalleeCoverage = __sanitizer_get_total_unique_caller_callee_pairs(); if (NewCallerCalleeCoverage > C->CallerCalleeCoverage) { Res = true; C->CallerCalleeCoverage = NewCallerCalleeCoverage; } } if (Options.UseCounters) { uint64_t CounterDelta = __sanitizer_update_counter_bitset_and_clear_counters( C->CounterBitmap.data()); if (CounterDelta > 0) { Res = true; C->CounterBitmapBits += CounterDelta; } } uint64_t NewPcMapBits = PcMapMergeInto(&C->PCMap); if (NewPcMapBits > C->PcMapBits) { Res = true; C->PcMapBits = NewPcMapBits; } uintptr_t *CoverageBuf; uint64_t NewPcBufferLen = __sanitizer_get_coverage_pc_buffer(&CoverageBuf); if (NewPcBufferLen > C->PcBufferLen) { Res = true; C->PcBufferLen = NewPcBufferLen; } return Res; }