Skip to content

Commit

Permalink
wmemcheck: update docs. (bytecodealliance#6856)
Browse files Browse the repository at this point in the history
* wmemcheck: update docs.

This PR expands the documentation for the Wasm memchecker (`wmemcheck`)
feature significantly, and also links it from the top-level
documentation hierarchy.

* Add syntax/language annotations to quotation sections to keep mdbook happy.
  • Loading branch information
cfallin authored and eduardomourar committed Aug 18, 2023
1 parent 71126b2 commit 21492f7
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
1 change: 1 addition & 0 deletions docs/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
- [Linking Modules](./examples-c-linking.md)
- [Debugging](./examples-c-debugging.md)
- [Using Multi-Value](./examples-c-multi-value.md)
- [Checking Guests' Memory Accesses](./wmemcheck.md)
- [Using WebAssembly from your language](./lang.md)
- [Rust](./lang-rust.md)
- [C](./lang-c.md)
Expand Down
44 changes: 43 additions & 1 deletion docs/wmemcheck.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,50 @@
# Wasm memcheck (wmemcheck)

Wmemcheck provides debug output for invalid mallocs, reads, and writes.
wmemcheck provides the ability to check for invalid mallocs, reads, and writes
inside a Wasm module, as long as Wasmtime is able to make certain assumptions
(`malloc` and `free` functions are visible and your program uses only the
default allocator). This is analogous to the Valgrind tool's memory checker
(memcheck) tool for native programs.

How to use:

1. When building Wasmtime, add the CLI flag "--features wmemcheck" to compile with wmemcheck configured.
> cargo build --features wmemcheck
2. When running your wasm module, add the CLI flag "--wmemcheck".
> wasmtime run --wmemcheck test.wasm
If your program executes an invalid operation (load or store to non-allocated
address, double-free, or an internal error in malloc that allocates the same
memory twice) you will see an error that looks like a Wasm trap. For example, given the program

```c
#include <stdlib.h>

int main() {
char* p = malloc(1024);
*p = 0;
free(p);
*p = 0;
}
```

compiled with WASI-SDK via

```plain
$ /opt/wasi-sdk/bin/clang -o test.wasm test.c
```

you can observe the memory checker working like so:

```plain
$ wasmtime run --wmemcheck ./test.wasm
Error: failed to run main module `./test.wasm`
Caused by:
0: failed to invoke command default
1: error while executing at wasm backtrace:
0: 0x103 - <unknown>!__original_main
1: 0x87 - <unknown>!_start
2: 0x2449 - <unknown>!_start.command_export
2: Invalid store at addr 0x10610 of size 1
```

0 comments on commit 21492f7

Please sign in to comment.