From 0532093e5856662a11cf66cbf59feaeb3acb9c29 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 18 Sep 2017 16:33:06 -0700 Subject: Expressions should not appear twice in the ast (#1191) --- src/wasm/wasm-validator.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/wasm/wasm-validator.cpp') diff --git a/src/wasm/wasm-validator.cpp b/src/wasm/wasm-validator.cpp index 5534eb7b9..85e2193fa 100644 --- a/src/wasm/wasm-validator.cpp +++ b/src/wasm/wasm-validator.cpp @@ -559,6 +559,24 @@ void WasmValidator::visitFunction(Function *curr) { shouldBeTrue(breakTargets.empty(), curr->body, "all named break targets must exist"); returnType = unreachable; labelNames.clear(); + // expressions must not be seen more than once + struct Walker : public PostWalker> { + std::unordered_set& seen; + std::vector dupes; + + Walker(std::unordered_set& seen) : seen(seen) {} + + void visitExpression(Expression* curr) { + bool inserted; + std::tie(std::ignore, inserted) = seen.insert(curr); + if (!inserted) dupes.push_back(curr); + } + }; + Walker walker(seenExpressions); + walker.walk(curr->body); + for (auto* bad : walker.dupes) { + fail("expression seen more than once in the tree", bad); + } } static bool checkOffset(Expression* curr, Address add, Address max) { -- cgit v1.2.3