|  | // Copyright 2016 the V8 project authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include "src/execution/isolate.h" | 
|  | #include "src/objects/objects-inl.h" | 
|  | #include "src/objects/objects.h" | 
|  | #include "src/wasm/wasm-module-builder.h" | 
|  | #include "test/common/wasm/test-signatures.h" | 
|  | #include "test/fuzzer/wasm-fuzzer-common.h" | 
|  |  | 
|  | namespace v8 { | 
|  | namespace internal { | 
|  | namespace wasm { | 
|  | namespace fuzzer { | 
|  |  | 
|  | class WasmCodeFuzzer : public WasmExecutionFuzzer { | 
|  | bool GenerateModule( | 
|  | Isolate* isolate, Zone* zone, Vector<const uint8_t> data, | 
|  | ZoneBuffer* buffer, int32_t* num_args, | 
|  | std::unique_ptr<WasmValue[]>* interpreter_args, | 
|  | std::unique_ptr<Handle<Object>[]>* compiler_args) override { | 
|  | TestSignatures sigs; | 
|  | WasmModuleBuilder builder(zone); | 
|  | WasmFunctionBuilder* f = builder.AddFunction(sigs.i_iii()); | 
|  | f->EmitCode(data.begin(), static_cast<uint32_t>(data.size())); | 
|  | uint8_t end_opcode = kExprEnd; | 
|  | f->EmitCode(&end_opcode, 1); | 
|  | builder.AddExport(CStrVector("main"), f); | 
|  |  | 
|  | builder.SetMaxMemorySize(32); | 
|  | builder.WriteTo(buffer); | 
|  | *num_args = 3; | 
|  | interpreter_args->reset( | 
|  | new WasmValue[3]{WasmValue(1), WasmValue(2), WasmValue(3)}); | 
|  |  | 
|  | compiler_args->reset(new Handle<Object>[3] { | 
|  | handle(Smi::FromInt(1), isolate), handle(Smi::FromInt(2), isolate), | 
|  | handle(Smi::FromInt(3), isolate) | 
|  | }); | 
|  | return true; | 
|  | } | 
|  | }; | 
|  |  | 
|  | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | 
|  | WasmCodeFuzzer().FuzzWasmModule({data, size}); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | }  // namespace fuzzer | 
|  | }  // namespace wasm | 
|  | }  // namespace internal | 
|  | }  // namespace v8 |