blob: 8ba188e17c76623100bd57af18048eef60db76f6 [file] [log] [blame]
<?xml version="1.0"?> <!-- -*- sgml -*- -->
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<chapter id="ac-manual" xreflabel="Addrcheck: a lightweight memory checker">
<title>Addrcheck: a lightweight memory checker</title>
<para>To use this tool, you must specify
<option>--tool=addrcheck</option> on the Valgrind command line.</para>
<para>Note: Addrcheck does not work in Valgrind 3.1.0. We may reinstate
it in later releases.</para>
<sect1>
<title>Kinds of bugs that Addrcheck can find</title>
<para>Addrcheck is a simplified version of the Memcheck tool described
in Section 3. It is identical in every way to Memcheck, except for one
important detail: it does not do the undefined-value checks that
Memcheck does. This means Addrcheck is faster than Memcheck, and uses
less memory. Addrcheck can detect the following errors:</para>
<itemizedlist>
<listitem>
<para>Reading/writing memory after it has been free'd</para>
</listitem>
<listitem>
<para>Reading/writing off the end of malloc'd blocks</para>
</listitem>
<listitem>
<para>Reading/writing inappropriate areas on the stack</para>
</listitem>
<listitem>
<para>Memory leaks - where pointers to malloc'd blocks are lost
forever</para>
</listitem>
<listitem>
<para>Mismatched use of malloc/new/new [] vs free/delete/delete []</para>
</listitem>
<listitem>
<para>Overlapping <computeroutput>src</computeroutput> and
<computeroutput>dst</computeroutput> pointers in
<computeroutput>memcpy()</computeroutput> and related
functions</para>
</listitem>
</itemizedlist>
<para>Rather than duplicate much of the Memcheck docs here, users of
Addrcheck are advised to read <xref linkend="mc-manual.bugs"/>. Some
important points:</para>
<itemizedlist>
<listitem>
<para>Addrcheck is exactly like Memcheck, except that all the
value-definedness tracking machinery has been removed. Therefore,
the Memcheck documentation which discusses definedess ("V-bits") is
irrelevant. The stuff on addressibility ("A-bits") is still
relevant.</para>
</listitem>
<listitem>
<para>Addrcheck accepts the same command-line flags as Memcheck,
with the exception of ... (to be filled in).</para>
</listitem>
<listitem>
<para>Like Memcheck, Addrcheck will do memory leak checking
(internally, the same code does leak checking for both tools). The
only difference is how the two tools decide which memory locations
to consider when searching for pointers to blocks. Memcheck will
only consider 4-byte aligned locations which are validly addressible
and which hold defined values. Addrcheck does not track definedness
and so cannot apply the last, "defined value", criteria.</para>
<para>The result is that Addrcheck's leak checker may "discover"
pointers to blocks that Memcheck would not. So it is possible that
Memcheck could (correctly) conclude that a block is leaked, yet
Addrcheck would not conclude that.</para>
<para>Whether or not this has any effect in practice is unknown. I
suspect not, but that is mere speculation at this stage.</para>
</listitem>
</itemizedlist>
<para>Addrcheck is, therefore, a fine-grained address checker. All it
really does is check each memory reference to say whether or not that
location may validly be addressed. Addrcheck has a memory overhead of
one bit per byte of used address space. In contrast, Memcheck has an
overhead of nine bits per byte.</para>
<para>Addrcheck is quite pleasant to use. It's faster than Memcheck,
and the lack of valid-value checks has another side effect: the errors
it does report are relatively easy to track down, compared to the
tedious and often confusing search sometimes needed to find the cause of
uninitialised-value errors reported by Memcheck.</para>
</sect1>
</chapter>