// // Tiny example, using Binaryen to walk a WebAssembly module in search // for direct integer divisions by zero. To do so, we inherit from // WasmWalker, and implement visitBinary, which is called on every // Binary node in the module's functions. // #include #include using namespace wasm; int main() { // A module with a function with a division by zero in the body. Module module; Function func; func.name = "func"; Binary div; div.op = BinaryOp::DivS; Const left; left.value = 5; Const right; right.value = 0; div.left = &left; div.right = &right; div.finalize(); func.body = ÷ module.addFunction(&func); // Print it out std::cout << module; // Search it for divisions by zero: Walk the module, looking for // that operation. struct DivZeroSeeker : public WasmWalker { void visitBinary(Binary* curr) { // In every Binary, look for integer divisions if (curr->op == BinaryOp::DivS || curr->op == BinaryOp::DivU) { // Check if the right operand is a constant, and if it is 0 auto right = curr->right->dyn_cast(); if (right && right->value.getInteger() == 0) { std::cout << "We found that " << curr->left << " is divided by zero\n"; } } } }; DivZeroSeeker seeker; seeker.startWalk(&module); }