pw_allocator#
This module provides various building blocks for a dynamic allocator. This is composed of the following parts:
block
: An implementation of a linked list of memory blocks, supporting splitting and merging of blocks.freelist
: A freelist, suitable for fast lookups of available memory chunks (i.e.block
s).
Heap Integrity Check#
The Block
class provides two check functions:
bool Block::IsValid()
: Returnstrue
is the given block is valid andfalse
otherwise.void Block::CrashIfInvalid()
: Crash the program and output the reason why the check fails usingPW_DCHECK
.
Heap Poisoning#
By default, this module disables heap poisoning since it requires extra space.
User can enable heap poisoning by enabling the pw_allocator_POISON_HEAP
build arg.
$ gn args out
# Modify and save the args file to use heap poison.
pw_allocator_POISON_HEAP = true
When heap poisoning is enabled, pw_allocator
will add sizeof(void*)
bytes before and after the usable space of each Block
, and paint the space
with a hard-coded randomized pattern. During each check, pw_allocator
will check if the painted space still remains the pattern, and return false
if the pattern is damaged.
Heap Visualizer#
Functionality#
pw_allocator
supplies a pw command pw heap-viewer
to help visualize
the state of the heap at the end of a dump file. The heap is represented by
ASCII characters, where each character represents 4 bytes in the heap.

Usage#
The heap visualizer can be launched from a shell using the Pigweed environment.
$ pw heap-viewer --dump-file <directory of dump file> --heap-low-address
<hex address of heap lower address> --heap-high-address <hex address of heap
lower address> [options]
The required arguments are:
--dump-file
is the path of a file that containsmalloc/free
information. Each line in the dump file represents amalloc/free
call.malloc
is represented asm <size> <memory address>
andfree
is represented asf <memory address>
. For example, a dump file should look like:m 20 0x20004450 # malloc 20 bytes, the pointer is 0x20004450 m 8 0x2000447c # malloc 8 bytes, the pointer is 0x2000447c f 0x2000447c # free the pointer at 0x2000447c ...
Any line not formatted as the above will be ignored.
--heap-low-address
is the start of the heap. For example:--heap-low-address 0x20004440
--heap-high-address
is the end of the heap. For example:--heap-high-address 0x20006040
Options include the following:
--poison-enable
: If heap poisoning is enabled during the allocation or not. The value isFalse
if the option is not specified andTrue
otherwise.--pointer-size <integer of pointer size>
: The size of a pointer on the machine wheremalloc/free
is called. The default value is4
.
Note, this module, and its documentation, is currently incomplete and experimental.