diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/fuzzing/fuzzing.cpp | 7 | ||||
-rw-r--r-- | src/wasm/wasm-validator.cpp | 58 |
2 files changed, 60 insertions, 5 deletions
diff --git a/src/tools/fuzzing/fuzzing.cpp b/src/tools/fuzzing/fuzzing.cpp index f4f059deb..57c7ec6b0 100644 --- a/src/tools/fuzzing/fuzzing.cpp +++ b/src/tools/fuzzing/fuzzing.cpp @@ -224,13 +224,14 @@ void TranslateToFuzzReader::setupMemory() { auto segment = builder.makeDataSegment(); segment->memory = memory->name; segment->offset = builder.makeConst(int32_t(0)); - segment->setName(Name::fromInt(0), false); - wasm.dataSegments.push_back(std::move(segment)); + segment->setName(Names::getValidDataSegmentName(wasm, Name::fromInt(0)), + false); auto num = upTo(USABLE_MEMORY * 2); for (size_t i = 0; i < num; i++) { auto value = upTo(512); - wasm.dataSegments[0]->data.push_back(value >= 256 ? 0 : (value & 0xff)); + segment->data.push_back(value >= 256 ? 0 : (value & 0xff)); } + wasm.addDataSegment(std::move(segment)); } } diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index e8a4033ef..689872a19 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -3908,7 +3908,7 @@ static void validateTags(Module& module, ValidationInfo& info) { } } -static void validateModule(Module& module, ValidationInfo& info) { +static void validateStart(Module& module, ValidationInfo& info) { // start if (module.start.is()) { auto func = module.getFunctionOrNull(module.start); @@ -3924,6 +3924,59 @@ static void validateModule(Module& module, ValidationInfo& info) { } } +namespace { +template<typename T, typename U> +void validateModuleMap(Module& module, + ValidationInfo& info, + T& list, + U getter, + const std::string& kind) { + // Given a list of module elements (like exports or globals), see that we can + // get the items using the getter (getExportorNull, etc.). The getter uses the + // lookup map internally, so this validates that they contain all items in + // the list. + for (auto& item : list) { + auto* ptr = (module.*getter)(item->name); + if (!ptr) { + info.fail(kind + " must be found (use updateMaps)", item->name, nullptr); + } else { + info.shouldBeEqual(item->name, + ptr->name, + item->name, + "getter must return the correct item"); + } + } + + // TODO: Also check there is nothing extraneous in the map, but that would + // require inspecting private fields of Module. +} +} // anonymous namespace + +static void validateModuleMaps(Module& module, ValidationInfo& info) { + // Module maps should be up to date. + validateModuleMap( + module, info, module.exports, &Module::getExportOrNull, "Export"); + validateModuleMap( + module, info, module.functions, &Module::getFunctionOrNull, "Function"); + validateModuleMap( + module, info, module.globals, &Module::getGlobalOrNull, "Global"); + validateModuleMap(module, info, module.tags, &Module::getTagOrNull, "Tag"); + validateModuleMap(module, + info, + module.elementSegments, + &Module::getElementSegmentOrNull, + "ElementSegment"); + validateModuleMap( + module, info, module.memories, &Module::getMemoryOrNull, "Memory"); + validateModuleMap(module, + info, + module.dataSegments, + &Module::getDataSegmentOrNull, + "DataSegment"); + validateModuleMap( + module, info, module.tables, &Module::getTableOrNull, "Table"); +} + static void validateFeatures(Module& module, ValidationInfo& info) { if (module.features.hasGC()) { info.shouldBeTrue(module.features.hasReferenceTypes(), @@ -4004,7 +4057,8 @@ bool WasmValidator::validate(Module& module, Flags flags) { validateDataSegments(module, info); validateTables(module, info); validateTags(module, info); - validateModule(module, info); + validateStart(module, info); + validateModuleMaps(module, info); validateFeatures(module, info); if (info.closedWorld) { validateClosedWorldInterface(module, info); |