summaryrefslogtreecommitdiffstats
path: root/third_party/rust/wasm-smith/src/core/terminate.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/wasm-smith/src/core/terminate.rs')
-rw-r--r--third_party/rust/wasm-smith/src/core/terminate.rs30
1 files changed, 18 insertions, 12 deletions
diff --git a/third_party/rust/wasm-smith/src/core/terminate.rs b/third_party/rust/wasm-smith/src/core/terminate.rs
index adcfeed54f..7983c35be6 100644
--- a/third_party/rust/wasm-smith/src/core/terminate.rs
+++ b/third_party/rust/wasm-smith/src/core/terminate.rs
@@ -1,6 +1,5 @@
use super::*;
-use std::mem;
-use wasm_encoder::BlockType;
+use anyhow::{bail, Result};
impl Module {
/// Ensure that all of this Wasm module's functions will terminate when
@@ -12,16 +11,21 @@ impl Module {
///
/// The index of the fuel global is returned, so that you may control how
/// much fuel the module is given.
- pub fn ensure_termination(&mut self, default_fuel: u32) -> u32 {
+ ///
+ /// # Errors
+ ///
+ /// Returns an error if any function body was generated with
+ /// possibly-invalid bytes rather than being generated by wasm-smith. In
+ /// such a situation this pass does not parse the input bytes and inject
+ /// instructions, instead it returns an error.
+ pub fn ensure_termination(&mut self, default_fuel: u32) -> Result<u32> {
let fuel_global = self.globals.len() as u32;
self.globals.push(GlobalType {
val_type: ValType::I32,
mutable: true,
});
- self.defined_globals.push((
- fuel_global,
- GlobalInitExpr::ConstExpr(ConstExpr::i32_const(default_fuel as i32)),
- ));
+ self.defined_globals
+ .push((fuel_global, ConstExpr::i32_const(default_fuel as i32)));
for code in &mut self.code {
let check_fuel = |insts: &mut Vec<Instruction>| {
@@ -41,10 +45,12 @@ impl Module {
let instrs = match &mut code.instructions {
Instructions::Generated(list) => list,
- // only present on modules contained within
- // `MaybeInvalidModule`, which doesn't expose its internal
- // `Module`.
- Instructions::Arbitrary(_) => unreachable!(),
+ Instructions::Arbitrary(_) => {
+ bail!(
+ "failed to ensure that a function generated due to it \
+ containing arbitrary instructions"
+ )
+ }
};
let mut new_insts = Vec::with_capacity(instrs.len() * 2);
@@ -65,6 +71,6 @@ impl Module {
*instrs = new_insts;
}
- fuel_global
+ Ok(fuel_global)
}
}