blob: bbce4aab58024c1188b40ead6558eb175015702c [file] [log] [blame]
//===- 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) {
const 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) {
memset(OutConfig, 0, sizeof(*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