blob: b4355dbc4d4a5999ca2fa3401e48f6a7fb933acf [file] [log] [blame]
#include <bitmap/raw-bitmap.h>
#include <bitmap/storage.h>
#include <fuzzer/FuzzedDataProvider.h>
enum BitmapOps { Set, ClearAll, Scan, Find, Get, Reset, kMaxValue = Reset };
static const size_t kMaxBitmapSize = 10 * 1024 * 1024;
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
bitmap::RawBitmapGeneric<bitmap::DefaultStorage> object;
FuzzedDataProvider fuzzed_data(data, size);
while (fuzzed_data.remaining_bytes() > 0) {
auto op = fuzzed_data.ConsumeEnum<BitmapOps>();
switch (op) {
case Set: {
auto index = fuzzed_data.ConsumeIntegral<size_t>();
auto next = fuzzed_data.ConsumeIntegral<size_t>();
object.Set(index, next);
break;
}
case ClearAll: {
object.ClearAll();
break;
}
case Scan: {
auto off = fuzzed_data.ConsumeIntegral<size_t>();
auto max = fuzzed_data.ConsumeIntegral<size_t>();
auto set = fuzzed_data.ConsumeBool();
size_t out;
object.Scan(off, max, set, &out);
break;
}
case Find: {
auto set = fuzzed_data.ConsumeBool();
auto off = fuzzed_data.ConsumeIntegral<size_t>();
auto max = fuzzed_data.ConsumeIntegral<size_t>();
auto runLen = fuzzed_data.ConsumeIntegral<size_t>();
size_t findOut;
object.Find(set, off, max, runLen, &findOut);
break;
}
case Get: {
auto bit = fuzzed_data.ConsumeIntegral<size_t>();
auto lastBit = fuzzed_data.ConsumeIntegral<size_t>();
size_t first;
object.Get(bit, lastBit, &first);
break;
}
case Reset: {
auto memory = fuzzed_data.ConsumeIntegralInRange<size_t>(0, kMaxBitmapSize);
object.Reset(memory);
break;
}
}
}
return 0;
}