Testing and debugging tools for concurrent programs are often validated on known bugs. To aid the development of these tools, we present the Race, Atomicity, and Deadlock Benchmark (RADBench) suite. The RADBench suite contains the full source of 10 real concurrency bugs found in large open-source software projects including Mozilla SpiderMonkey, Mozilla NSPR, Memcached, Apache Web Server, and Google Chromium Web Browser. We discuss the difficulties we have found in reproducing these bugs that must be accounted for when building testing and debugging tools. Finally, we propose an approach to reproducibility that has a number of benefits over standard deterministic replay for debugging. RADBench is open source and publicly available.
We propose a heuristic algorithm, Tinertia, that automatically simplifies a trace of a buggy concurrent program execution. Tinertia works by iteratively increasing the granularity of the thread interleavings in the buggy trace. We have implemented Tinertia in a tool for C/C++ programs that use Pthreads and applied it to 11 multithreaded benchmarks. Our results suggest that Tinertia often generates optimally simplified traces in practice.
We present Looper, an automated technique for dynamically analyzing a running program to prove that it is non-terminating. Looper uses symbolic execution to produce simple non-termination arguments for infinite loops dependent on both program values and the shape of heap. We demonstrate our technique's effectiveness on several non-terminating benchmarks, including a reported infinite loop bug in the open-source text editor jEdit.
Many large software projects find they do not have enough resources to triage all incoming bug reports. We propose a method which automatically identifies duplicate bug reports to save on triage effort. We use natural language processing and clustering to build a classifier that works on bug reports as they are submitted.