91 lines
2.7 KiB
C++
91 lines
2.7 KiB
C++
//===- FuzzerMutate.cpp - Mutation utilities -----------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
// Mutate utilities.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "FuzzerMutate.h"
|
|
#include "FuzzerExtFunctions.h"
|
|
#include "FuzzerIO.h"
|
|
#include "FuzzerTracePC.h"
|
|
#include "FuzzerUtil.h"
|
|
|
|
namespace fuzzer {
|
|
namespace {
|
|
|
|
void FromTORC4(size_t Idx, uint32_t *A, uint32_t *B) {
|
|
const auto &X = TPC.TORC4.Get(Idx);
|
|
*A = X.A;
|
|
*B = X.B;
|
|
}
|
|
|
|
void FromTORC8(size_t Idx, uint64_t *A, uint64_t *B) {
|
|
const auto &X = TPC.TORC8.Get(Idx);
|
|
*A = X.A;
|
|
*B = X.B;
|
|
}
|
|
|
|
void FromTORCW(size_t Idx, const uint8_t **DataA, size_t *SizeA,
|
|
const uint8_t **DataB, size_t *SizeB) {
|
|
const auto &X = TPC.TORCW.Get(Idx);
|
|
*DataA = X.A.data();
|
|
*SizeA = X.A.size();
|
|
*DataB = X.B.data();
|
|
*SizeB = X.B.size();
|
|
}
|
|
|
|
void FromMMT(size_t Idx, const uint8_t **Data, size_t *Size) {
|
|
auto W = TPC.MMT.Get(Idx);
|
|
*Data = W.data();
|
|
*Size = W.size();
|
|
}
|
|
|
|
void PrintASCII(const Word &W, const char *PrintAfter) {
|
|
fuzzer::PrintASCII(W.data(), W.size(), PrintAfter);
|
|
}
|
|
|
|
} // namespace
|
|
|
|
void ConfigureMutagen(unsigned int Seed, const FuzzingOptions &Options,
|
|
LLVMMutagenConfiguration *OutConfig) {
|
|
OutConfig->Seed = Seed;
|
|
OutConfig->UseCmp = Options.UseCmp;
|
|
OutConfig->FromTORC4 = FromTORC4;
|
|
OutConfig->FromTORC8 = FromTORC8;
|
|
OutConfig->FromTORCW = FromTORCW;
|
|
OutConfig->UseMemmem = Options.UseMemmem;
|
|
OutConfig->FromMMT = FromMMT;
|
|
OutConfig->CustomMutator = EF->LLVMFuzzerCustomMutator;
|
|
OutConfig->CustomCrossOver = EF->LLVMFuzzerCustomCrossOver;
|
|
OutConfig->MSanUnpoison = EF->__msan_unpoison;
|
|
OutConfig->MSanUnpoisonParam = EF->__msan_unpoison_param;
|
|
}
|
|
|
|
void PrintRecommendedDictionary(MutationDispatcher &MD) {
|
|
auto RecommendedDictionary = MD.RecommendDictionary();
|
|
if (RecommendedDictionary.empty())
|
|
return;
|
|
Printf("###### Recommended dictionary. ######\n");
|
|
for (auto &DE : RecommendedDictionary) {
|
|
assert(DE.GetW().size());
|
|
Printf("\"");
|
|
PrintASCII(DE.GetW(), "\"");
|
|
Printf(" # Uses: %zd\n", DE.GetUseCount());
|
|
}
|
|
Printf("###### End of recommended dictionary. ######\n");
|
|
}
|
|
|
|
void PrintMutationSequence(MutationDispatcher &MD, bool Verbose) {
|
|
const auto &MS = MD.MutationSequence();
|
|
const auto &DS = MD.DictionaryEntrySequence();
|
|
Printf("MS: %zd %s", MS.size(), MS.GetString(Verbose).c_str());
|
|
if (!DS.empty())
|
|
Printf(" DE: %s", DS.GetString(Verbose).c_str());
|
|
}
|
|
|
|
} // namespace fuzzer
|