blob: 2bee066c0454a74a4dc5cc63875ed2d582fcc649 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Using SoftBoundCETS Memory Safety Checking</title>
<link rel="stylesheet" href="llvm.css" type="text/css">
</head>
<body>
<div class="doc_title">
SoftBoundCETS Users Guide
</div>
<!-- ********************************************************************** -->
<!-- * Table of Contents * -->
<!-- ********************************************************************** -->
<ul>
<li><a href="#overview">Overview</a></li>
<li><a href="#compile">Compiling a Program with SoftBoundCETS</a></li>
<li><a href="#sample">Sample Debugging with SoftBoundCETS</a></li>
</ul>
<!-- ********************************************************************** -->
<!-- * Authors * -->
<!-- ********************************************************************** -->
<div class="doc_author">
<p>Written by Santosh Nagarakatte</p>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="overview"><b>Overview</b></a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>
The SoftBoundCETS transformation is a memory safety transformation
that is a part of the SAFECode compiler, which is a memory safety
compiler built using the LLVM Compiler Infrastructure and the Clang
compiler driver. A memory safety compiler is a compiler that inserts
run-time checks into a program during compilation to catch memory
safety errors at run-time. Such errors can include buffer overflows,
invalid frees, and dangling pointer dereferences.
</p>
<p>
This manual will show how to compile programs with SoftBoundCETS and
how to read the diagnostic output when a memory safety error occurs.
</p>
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="compile"><b>Compiling a Program with SoftBoundCETS</b></a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>
The easiest way to use SoftBoundCETS is to use the modified version of
Clang that comes in the SAFECode distribution. Alternatively, the whole
program analysis version of SoftBoundCETS can be downloaded
from the <a href="http://www.cis.upenn.edu/acg/softbound/"> SoftBoundCETS
website</a>. Transforms are performed transparently by the Clang
compiler.
</p>
<p>
To compile programs with SoftBoundCETS memory safety transformation, add the
<i>-fsoftbound</i> command-line option to the Clang command line:
<ul>
<li><tt>clang -g -fsoftbound -c -o <i>file.o</i> <i>file.c</i></tt></li>
</ul>
You may also need to add a <tt>-L$PREFIX/lib</tt> option to the link
command-line to indicate where the libraries are
located; <tt>$PREFIX</tt> is the directory into which SAFECode was installed:
<ul>
<li><tt>clang -fsoftbound -o <i>file</i> <i>file1.o</i> <i>file2.o</i> ...
-L$PREFIX/lib</tt></li>
</ul>
</p>
<p>
To configure an autoconf-based software package to use SoftBoundCETS
in the SAFECode distribution, do the following:
</p>
<ol>
<li> Set the environment variable CC to $PREFIX/clang.</li>
<li> Set the environment variable CXX to $PREFIX/clang++.</li>
<li> Set the environment variable CFLAGS to "-g -fsoftbound "</li>
<li> Set the environment variable LDFLAGS to "-L$PREFIX/lib"
where $PREFIX is the directory into which SAFECode was installed.</li>
<li> Run the configure script</li>
<li> Type "make" to compile the source code.</li>
</ol>
Note that some configure scripts may not use the LDFLAGS variable
properly. If the above directions do not work, try setting CFLAGS to
"-g -fsoftbound -L$PREFIX/lib".
</div>
<!-- *********************************************************************** -->
<div class="doc_section">
<a name="sample"><b>Sample Debugging with SoftBoundCETS in SAFECode Distribution</b></a>
</div>
<!-- *********************************************************************** -->
<div class="doc_text">
<p>
Let's say that we have the following C program:
</p>
<pre>
1 #include "stdio.h"
2 #include "stdlib.h"
3
4 int
5 foo (char * bar) {
6 for (unsigned index = 0; index < 10; ++index)
7 bar[index] = 'a';
8 return 0;
9 }
10
11 int
12 main (int argc, char ** argv) {
13 char * array[100];
14 int max = atoi (argv[1]);
15
16 for (int index = max; index >= 0; --index) {
17 array[index] = malloc (index+1);
18 }
19
20 for (int index = max; index >= 0; --index) {
21 foo (array[index]);
22 }
23
24 exit (0);
25 }
</pre>
<p>
Lines 16-18 allocate character arrays of decreasing size, starting with the
argument plus one specified by the user down to an array of one character.
Lines 20-22 then call the function <tt>foo()</tt> which accesses elements 0-9
of the array.
</p>
<p>
If we compile this program with SoftBoundCETS within the SAFECode compiler and execute it:
<ul>
<li><tt>clang -g -fsoftbound -o <i>test</i> <i>test.c</i> -L$PREFIX </tt></li>
<li><tt>./test 10</tt></li>
</ul>
We'll get the following error report:
</p>
<pre>
In Store Dereference Check, base=0x60c050, bound=0x60c052, ptr=0x60c052, size_of_type=1, ptr+size=0x60c053
Softboundcets: Bounds violation detected
Backtrace:
./test.out[0x4058fc]
./test.out[0x405e83]
./test.out[0x404f0d]
./test.out[0x40563a]
./test.out[0x405a45]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x7fcecaa70bfd]
./test.out[0x404c99]
Aborted
</pre>
<p>
The first thing to note is the error type. SoftBoundCETS is reporting
a spatial safety violation with a store operation, meaning that some
store is trying to access a memory location that it should not. The
value of the pointer is 0x60c052. The size of the access is of one
byte. The bounds of the object that the pointer points to is
[0x60c050, 0x60c52). Debugging the code in gdb reveals that the
out-of-bound memory access occurs in function foo.
</p>
</div>
</body>
</html>