This directory contains an experiment consisting in applying mygcc
to retrieve over 100 already reported bugs in Linux v2.4.1.
These bugs were originally detected using a much more complex, never distributed, C checker called MC, that later evolved as a commercial product. The list of bugs detected by MC is available as an on-line bug database.
To validate mygcc, we chose three checkers used by MC (called NULL, FREE, and BLOCK), rewrote them as constrained reachability properties, and checked 89 among the concerned C files.
The short story is that mygcc found all the bugs
except only 4, introduced only 2 false positives (= false errors),
and found 4 new, unknown bugs. This demonstrates that simple
reachability properties are sufficient to detect many useful
You may browse the results, and compare them with MC's database. The results contain one *.check file for each C file that was checked, containing all mygcc messages. Every user-check message contains the name of the C file, the name of the function that failed a user check, and the buggy statement.
Note: As mygcc works on a simplified AST internal to gcc called Gimple, the buggy statement may look different from the source statement, because complex sub-expressions have been replaced by temporary variables. We are working on printing the buggy statement in its original source form.
The contents of the directory is as follows:
All the checks are contained in a single file: mc.crc.
The checks are driven by the Makefile.
There are two simple Awk scripts performing simple pre-processing of the C files: chfun.awk and protect-multiline-strings.awk. These scripts are used by the Makefile, you do not have to call them directly.
The ref/ directory contains the results.
To run the tests yourself, you need a Linux/x86 machine. Perform the following steps:
download Linux v2.4.1 sources, from an appropriate site and uncompress them on your site in directory $LINUX of your choice
version 0.1.0 and uncompress it on your site in directory $MYGCC
of your choice
Note: do not try to reproduce the examples with a more recent version of mygcc, because kernel v2.4.1 does not compile with any recent gcc version.
customize the first two definitions in $MYGCC/ex/linux/2.4.1/Makefile to point to $LINUX and $MYGCC respectively
Running the tests will create, for each C file called "f.c", the following files:
f.i: the C file after cpp
f.i.c: the f.i file after our simple pre-processing using the two Awk scripts
f.i.c.t09.gimple: the simplified AST form on which checks are performed
f.i.c.check: the log of running mygcc on f.i.c
f.i.o: the compiled object file (recall that mygcc is an extensible gcc version, so it generates object code as usual)
After that, you might want to compare your results with the
reference results in ref/.
Finally, you might want to erase all the produced files using "make clean".