You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.1 KiB
41 lines
1.1 KiB
#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<uint8_t> 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; |
|
}
|
|
|