diff --git a/crates/environ/src/demangling.rs b/crates/environ/src/demangling.rs index e9648bd44ccf..b64277bb3a98 100644 --- a/crates/environ/src/demangling.rs +++ b/crates/environ/src/demangling.rs @@ -7,10 +7,14 @@ pub fn demangle_function_name(writer: &mut impl core::fmt::Write, name: &str) -> #[cfg(feature = "demangle")] if let Ok(demangled) = rustc_demangle::try_demangle(name) { return write!(writer, "{demangled}"); - } else if let Ok(symbol) = cpp_demangle::Symbol::new(name) { - if let Ok(demangled) = symbol.demangle() { - return write!(writer, "{demangled}"); - } + } else if name.starts_with("_Z") + // Only attempt to demangle Itanium C++ mangled symbols, which all + // start with `_Z`, as otherwise short names such as `i` are + // "demangled" as types such as `int`. + && let Ok(symbol) = cpp_demangle::Symbol::new(name) + && let Ok(demangled) = symbol.demangle() + { + return write!(writer, "{demangled}"); } write!(writer, "{name}") diff --git a/tests/all/traps.rs b/tests/all/traps.rs index 2455c6eed95f..0a0de3e65a77 100644 --- a/tests/all/traps.rs +++ b/tests/all/traps.rs @@ -323,6 +323,36 @@ error while executing at wasm backtrace: Ok(()) } +#[test] +fn trap_display_demangled_names() -> Result<()> { + let mut store = Store::<()>::default(); + let wat = r#" + (module $m + (func $c unreachable) + (func $i call $c) + (func $_Z3foov call $i) + (func (export "bar") call $_Z3foov) + ) + "#; + + let module = Module::new(store.engine(), wat)?; + let instance = Instance::new(&mut store, &module, &[])?; + let run_func = instance.get_typed_func::<(), ()>(&mut store, "bar")?; + + // Short names like `c` and `i` shouldn't be "demangled" as C++ types, but + // C++ mangled names should still be demangled. + let e = run_func.call(&mut store, ()).unwrap_err(); + e.assert_contains( + "\ +error while executing at wasm backtrace: + 0: 0x23 - m!c + 1: 0x27 - m!i + 2: 0x2c - m!foo() + 3: 0x31 - m!", + ); + Ok(()) +} + #[test] fn trap_display_multi_module() -> Result<()> { let mut store = Store::<()>::default();