MyNixOS website logo
Description

Memory allocation with added stress tests and integrity checks.

Provide adaptions of mallocForeignPtrArray and allocaArray that add stress tests and integrity checks.

There are three modules:

  • Guarded.Plain: exports the original allocation routines

  • Guarded.Debug: exports allocation routines that add stress and checks

  • Guarded: exports either Guarded.Plain or Guarded.Debug depending on the Cabal debug flag.

It is intended that you always import the Guarded module in user code and install a package version with enabled debug flag to a custom package database for debugging. If you compile your user program you can choose production or debugging mode by choosing the default or the custom debugging package database, respectively.

This package is inspired by the famous Amiga debug tool MungWall. The Linux counterpart is Electric Fence.

The overall idea of the package is to make programming mistakes let low-level programs fail reproducibly.

What the routines do:

  • After allocation fill the memory with the hex string 0xDEADF00D. This allows to check whether the caller properly initialises allocated buffers.

  • Allocate some memory before and after the actual buffer and fill it with 0xABADCAFE. On deallocation it is checked that this pattern is still intact. If not, abort with an error. This allows to check for range violations.

  • Before deallocation fill the memory with 0xDEADBEEF. This helps to detect when the program reads memory after its deallocation.

  • The create routine additionally makes a copy of the initialized buffer. The finalizer compares the contents of the buffer and its copy. This way it can detect if an immutable array was altered after its creation.

Range violations might alternatively be detected by range checking techniques. Allocation problems might be solved using Regions. The provided functions might overlook range violations but they help detecting bugs when you have not full control over the code that processes memory content, e.g. when calling external routines via FFI.

Metadata

Version

0.0.1

Maintainers (1)

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows