difficult to debug errors that may occur in concurrent C code.
We developed dynamic analysis tools that run on top of the QEMU
system emulator~\cite{Bellard2005QEMU} to help detect these mistakes.
-Since these tools do not require additional support from the Pintos kernel;
+Since these tools do not require additional support from the Pintos kernel,
students can use them without complicating their code.
Data races are found by using a semaphore-aware modification of the RaceTrack algorithm~\cite{Yu2005RaceTrack}.
Invalid memory accesses, such as a read from newly allocated but uninitialized data, are detected by
tracking all memory accesses. Heap allocation calls are instrumented to map a range of addresses as
uninitialized. When data is written to a memory address, it is marked as initialized. If an address
-marked as uninitialized is read from, the error is reported and the address is marked as
-uninitialized to mask spurious reports.
+marked as uninitialized is read from, an error is reported.
+%cfl: and the address is marked as uninitialized to mask spurious reports.
% More sophisticated analysis may be implemented in the future.
+Each of our tools presents students with one or more concrete backtraces that
+show where the error occurred, which not only helps students debug their code,
+but makes the concept of race conditions more concrete.