Checking Guests' Memory Accesses - Wasmtime

# Wasm memcheck (wmemcheck)

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 "-W wmemcheck".

   > wasmtime run -W 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

    #include <stdlib.h>

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

compiled with WASI-SDK via

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

you can observe the memory checker working like so:

    $ wasmtime run -W 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