Skip to content

Commit 420d0ae

Browse files
authored
Fix ExpressionRunner issues found by the fuzzer (#2790)
Fixes #2788 found by the fuzzer, introduced in #2702, which turned out to be incorrect usage of std::move, by removing any std::moves introduced in that PR to be better safe than sorry. Also fixes problems with WASM_INTERPRETER_DEBUG spotted during debugging.
1 parent 2a5d77d commit 420d0ae

3 files changed

Lines changed: 22 additions & 17 deletions

File tree

src/passes/Precompute.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class PrecomputingExpressionRunner
7979
if (iter != getValues.end()) {
8080
auto values = iter->second;
8181
if (values.isConcrete()) {
82-
return Flow(std::move(values));
82+
return Flow(values);
8383
}
8484
}
8585
return ExpressionRunner<PrecomputingExpressionRunner>::visitLocalGet(curr);

src/wasm-interpreter.h

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,7 +1252,7 @@ class ExpressionRunner : public OverriddenVisitor<SubType, Flow> {
12521252
// Check if a constant value has been set in the context of this runner.
12531253
auto iter = localValues.find(curr->index);
12541254
if (iter != localValues.end()) {
1255-
return Flow(std::move(iter->second));
1255+
return Flow(iter->second);
12561256
}
12571257
return Flow(NONCONSTANT_FLOW);
12581258
}
@@ -1288,7 +1288,7 @@ class ExpressionRunner : public OverriddenVisitor<SubType, Flow> {
12881288
// Check if a constant value has been set in the context of this runner.
12891289
auto iter = globalValues.find(curr->name);
12901290
if (iter != globalValues.end()) {
1291-
return Flow(std::move(iter->second));
1291+
return Flow(iter->second);
12921292
}
12931293
return Flow(NONCONSTANT_FLOW);
12941294
}
@@ -1327,13 +1327,13 @@ class ExpressionRunner : public OverriddenVisitor<SubType, Flow> {
13271327
auto argFlow = visit(curr->operands[i]);
13281328
if (!argFlow.breaking()) {
13291329
assert(argFlow.values.isConcrete());
1330-
localValues[i] = std::move(argFlow.values);
1330+
localValues[i] = argFlow.values;
13311331
}
13321332
}
13331333
auto retFlow = visit(func->body);
1334-
localValues = std::move(prevLocalValues);
1334+
localValues = prevLocalValues;
13351335
if (retFlow.breakTo == RETURN_FLOW) {
1336-
return Flow(std::move(retFlow.values));
1336+
return Flow(retFlow.values);
13371337
} else if (!retFlow.breaking()) {
13381338
return retFlow;
13391339
}
@@ -1343,7 +1343,7 @@ class ExpressionRunner : public OverriddenVisitor<SubType, Flow> {
13431343
return Flow(NONCONSTANT_FLOW);
13441344
}
13451345

1346-
Flow visitCallIndirect(CallIndirect*) {
1346+
Flow visitCallIndirect(CallIndirect* curr) {
13471347
NOTE_ENTER("CallIndirect");
13481348
return Flow(NONCONSTANT_FLOW);
13491349
}
@@ -1375,39 +1375,39 @@ class ExpressionRunner : public OverriddenVisitor<SubType, Flow> {
13751375
NOTE_ENTER("MemoryFill");
13761376
return Flow(NONCONSTANT_FLOW);
13771377
}
1378-
Flow visitAtomicRMW(AtomicRMW*) {
1378+
Flow visitAtomicRMW(AtomicRMW* curr) {
13791379
NOTE_ENTER("AtomicRMW");
13801380
return Flow(NONCONSTANT_FLOW);
13811381
}
1382-
Flow visitAtomicCmpxchg(AtomicCmpxchg*) {
1382+
Flow visitAtomicCmpxchg(AtomicCmpxchg* curr) {
13831383
NOTE_ENTER("AtomicCmpxchg");
13841384
return Flow(NONCONSTANT_FLOW);
13851385
}
1386-
Flow visitAtomicWait(AtomicWait*) {
1386+
Flow visitAtomicWait(AtomicWait* curr) {
13871387
NOTE_ENTER("AtomicWait");
13881388
return Flow(NONCONSTANT_FLOW);
13891389
}
1390-
Flow visitAtomicNotify(AtomicNotify*) {
1390+
Flow visitAtomicNotify(AtomicNotify* curr) {
13911391
NOTE_ENTER("AtomicNotify");
13921392
return Flow(NONCONSTANT_FLOW);
13931393
}
1394-
Flow visitSIMDLoad(SIMDLoad*) {
1394+
Flow visitSIMDLoad(SIMDLoad* curr) {
13951395
NOTE_ENTER("SIMDLoad");
13961396
return Flow(NONCONSTANT_FLOW);
13971397
}
1398-
Flow visitSIMDLoadSplat(SIMDLoad*) {
1398+
Flow visitSIMDLoadSplat(SIMDLoad* curr) {
13991399
NOTE_ENTER("SIMDLoadSplat");
14001400
return Flow(NONCONSTANT_FLOW);
14011401
}
1402-
Flow visitSIMDLoadExtend(SIMDLoad*) {
1402+
Flow visitSIMDLoadExtend(SIMDLoad* curr) {
14031403
NOTE_ENTER("SIMDLoadExtend");
14041404
return Flow(NONCONSTANT_FLOW);
14051405
}
1406-
Flow visitPush(Push*) {
1406+
Flow visitPush(Push* curr) {
14071407
NOTE_ENTER("Push");
14081408
return Flow(NONCONSTANT_FLOW);
14091409
}
1410-
Flow visitPop(Pop*) {
1410+
Flow visitPop(Pop* curr) {
14111411
NOTE_ENTER("Pop");
14121412
return Flow(NONCONSTANT_FLOW);
14131413
}
@@ -2470,7 +2470,8 @@ template<typename GlobalManager, typename SubType> class ModuleInstanceBase {
24702470
functionStack.pop_back();
24712471
}
24722472
#ifdef WASM_INTERPRETER_DEBUG
2473-
std::cout << "exiting " << function->name << " with " << ret << '\n';
2473+
std::cout << "exiting " << function->name << " with " << flow.values
2474+
<< '\n';
24742475
#endif
24752476
return flow.values;
24762477
}

src/wasm-printing.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ inline std::ostream& operator<<(std::ostream& o, wasm::Expression& expression) {
5353
return wasm::WasmPrinter::printExpression(&expression, o);
5454
}
5555

56+
inline std::ostream& operator<<(std::ostream& o, wasm::Expression* expression) {
57+
return wasm::WasmPrinter::printExpression(expression, o);
58+
}
59+
5660
inline std::ostream& operator<<(std::ostream& o, wasm::StackInst& inst) {
5761
return wasm::WasmPrinter::printStackInst(&inst, o);
5862
}

0 commit comments

Comments
 (0)