MalCheck
Check dynamic allocations in C
Download MalCheck v1.1.1.1 [21k Zip file]
Download MalCheck Source (v2.0) [683k Zip file]
What it does
This library gives you some help to track down program errors
involving dynamically allocated memory blocks.
(That is, blocks manipulated with malloc(),
realloc(),
calloc() and free())
These usually manifest themselves as unpredictable crashes at
locations in the program that look perfectly correct.
The damage was done at an earlier point, but only shows itself later.
A surefire pointer to such a problem is when the postmortem backtrace
indicates that the last routine called was one of the above four functins.
This package keeps an eye on dynamically allocated blocks and
tries to see if data was written outside the block or into free
or dealloc blocks. (Free blocks are blocks released by free(),
dealloc blocks are blocks left behind when realloc() needed to
move data to a bigger block.)
How to use MalCheck
Include this line in the sources you want to check:
#include "MalCheck:malcheck.h"
Add the library 'MalCheck:o.malcheck' to the list
given to the Link command
in your Makefile. Note: If you use the (obsolete) ansilib,
then put the malcheck library before C:o.ansilib.
Define the macro 'MALCHECK' by passing -DMALCHECK
to the compile
commands. Note: you can switch off MalCheck without changing
the sources by compiling without this macro defined.
Make sure that the MalCheck$Path is set (e.g. by calling
SetVars,
which can be found in the package).
Make your software. When you run it, checks will be performed
and output written to stderr.
How it works
MalCheck intercepts calls to malloc(), calloc(),
realloc() and free(),
by replacing them with macros that call special library functions.
These functions then perform the normal action requested, with a
little extra. When blocks are allocated, a header with maintenance
information is put before them, and a 'magic number' (m3) is put
after the block. The header is used to maintain a list of blocks
and to keep information about each block. Changes in the data can
be detected by a calculated CRC which is kept in the header. The header
itself is protected by it's own CRC, plus magic numbers at the start
(m1) and at the end (m2).
Every time one of the above functions is called by the user program,
the library runs though it's list of blocks and looks for suspicious
things. For example: a change in m3 will show that probably the end
of the allocated block was overwritten. This commenly happens when a
string written to a block is too large for that block (maybe the
terminating zero was forgotten in the count). Problems are reported
on stderr, if their level is equal to or worse than the current report level.
If nothing desastrous has happened, the MalCheck function then performs
the duty it was called for, checking whether nothing illegal is done
(like calling free() with a pointer that does not
point to an existing
block). When no problems occured equal to or worse than the current
quit level, the routine returns to the user program.
As an extra, atexit() is used to install a routine which produces a
listing of all blocks when the program exits.
Manipulating output
MalCheck includes the following routines
- MalCheck_setlevel(level);
- Set the level of output, rangeing from fatal messages only up to
giving a list of all blocks on each call.
- MalCheck_setquit(level);
- Set the level of error at which MalCheck will exit.
- MalCheck_setoutput(File *);
- Direct the output stream to a given file.
More information
For further details you can see the ReadMe
file here. You can also check out the
Frequently Asked Questions.
Release notes for version 1.1.1.1
-
The package now contains the SetVars Obey file, which was
omitted from the 1.1 package
-
A separate, 26-bit version of the library is now included (as
o.malcheck26) which will link with 26 bit object files without
complaints from the linker.
-
Due to changes in UnixLib, this library no longer works correctly with
programs that are linked with UnixLib. This means only the Shared C
Library is left as a possible target. Because of the current plethora of
different libraries to link against (UnixLib, Clib (Stubs), StubsG), it
becomes very hard to produce a library that can be used anywhere. The
author is considering the notion of putting this package in Public Domain.
Release notes for version 2.0
-
The package is now Free Software,
with freedoms 0, 1, 2 and 3 as defined by the Free Software Foundation
-
The functionality is the same as version 1.1.1.1; What has changed is the publication of the sources and the
change to a fully Free Software licence.
-
With this publication, the author no longer gives support for this package.
[home]
File identification:
$Id: malcheck.html 1.5 2022-07-09 21:42:06+02 erikgrnh Exp $