#include "llvm-c/Disassembler.h" #include "llvm-c/Target.h" #include "llvm/MC/SubtargetFeature.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; extern "C" void LLVMFuzzerInit() { LLVMInitializeAllTargetInfos(); LLVMInitializeAllTargetMCs(); LLVMInitializeAllDisassemblers(); } extern "C" int LLVMFuzzerReturnOneInput(const uint8_t *Data, size_t Size, char * AssemblyText) { LLVMDisasmContextRef Ctx; std::vector DataCopy(Data, Data + Size); uint8_t *p = DataCopy.data(); int r = 1; switch(Data[0]) { case 0: Ctx = LLVMCreateDisasmCPUFeatures("i386", "", "", nullptr, 0, nullptr, nullptr); if (LLVMSetDisasmOptions(Ctx, LLVMDisassembler_Option_AsmPrinterVariant) == 0) { abort(); } break; //TODO other cases default: return 1; } assert(Ctx); if (LLVMDisasmInstruction(Ctx, p+1, Size-1, 0, AssemblyText, 80) > 0) { r = 0; } LLVMDisasmDispose(Ctx); return r; }