mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-20 12:05:48 -04:00
[LibFuzzer] Tweak MutationDispatcher::Mutate_CopyPart
mutation.
It doesn't make sense to non-deterministically choose between `CopyPart(..)` and `InsertPart(..)` when it is known that `InsertPart(..)` will fail. This upstream's a change from JFS solver's fork of LibFuzzer. Differential Revision: https://reviews.llvm.org/D45693 llvm-svn: 330687
This commit is contained in:
parent
3326e785b2
commit
dfd5a90a99
@ -339,7 +339,9 @@ size_t MutationDispatcher::InsertPartOf(const uint8_t *From, size_t FromSize,
|
||||
size_t MutationDispatcher::Mutate_CopyPart(uint8_t *Data, size_t Size,
|
||||
size_t MaxSize) {
|
||||
if (Size > MaxSize || Size == 0) return 0;
|
||||
if (Rand.RandBool())
|
||||
// If Size == MaxSize, `InsertPartOf(...)` will
|
||||
// fail so there's no point using it in this case.
|
||||
if (Size == MaxSize || Rand.RandBool())
|
||||
return CopyPartOf(Data, Size, Data, Size);
|
||||
else
|
||||
return InsertPartOf(Data, Size, Data, Size, MaxSize);
|
||||
|
@ -381,6 +381,21 @@ TEST(FuzzerMutate, CopyPart1) {
|
||||
TEST(FuzzerMutate, CopyPart2) {
|
||||
TestCopyPart(&MutationDispatcher::Mutate, 1 << 13);
|
||||
}
|
||||
TEST(FuzzerMutate, CopyPartNoInsertAtMaxSize) {
|
||||
// This (non exhaustively) tests if `Mutate_CopyPart` tries to perform an
|
||||
// insert on an input of size `MaxSize`. Performing an insert in this case
|
||||
// will lead to the mutation failing.
|
||||
std::unique_ptr<ExternalFunctions> t(new ExternalFunctions());
|
||||
fuzzer::EF = t.get();
|
||||
Random Rand(0);
|
||||
std::unique_ptr<MutationDispatcher> MD(new MutationDispatcher(Rand, {}));
|
||||
uint8_t Data[8] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x00, 0x11, 0x22};
|
||||
size_t MaxSize = sizeof(Data);
|
||||
for (int count = 0; count < (1 << 18); ++count) {
|
||||
size_t NewSize = MD->Mutate_CopyPart(Data, MaxSize, MaxSize);
|
||||
ASSERT_EQ(NewSize, MaxSize);
|
||||
}
|
||||
}
|
||||
|
||||
void TestAddWordFromDictionary(Mutator M, int NumIter) {
|
||||
std::unique_ptr<ExternalFunctions> t(new ExternalFunctions());
|
||||
|
Loading…
Reference in New Issue
Block a user