Computers are amazingly fun and useful, but why do they crash and hang? Why are they so terrifyingly insecure? The problem is many-faceted, but an important aspect is that people who develop software must consider a huge number of possible executions of their code, and the human mind doesn't turn out to be all that good at this. Even a single execution of a medium-sized piece of software can be mind-numbingly complex, requiring many hours before an expert can understand what is going on.
The part of the solution to the software problem that I am most interested in is using software tools to make it easier to develop correct and efficient software. Basically, we can create programs to show us possibilities inherent in our software -- such as crashes -- that we did not know about, or better yet create programs to verify that such possibilities do not exist. Similarly, good abstractions such as high-level programming languages make it easier to express our intent, and then we can offload to software tools the problem of making programs run quickly.
The software tool developed by my group that I am most proud of is Csmith, which generates random C programs; here is a fragment of one. Although it sounds easy to generate random code, it is not: C has hundreds of rules that must be followed, and violating any one of them renders the randomly generated code useless. Over several years we used Csmith to find serious bugs in every compiler that we tested, including those that are used to compile safety-critical avionics software. The worst kind of compiler bug, and the kind we specialized in finding, causes the compiler to silently generate incorrect executable code. We found so many bugs (around 500) that I had to write a new tool, C-Reduce, to take large programs that trigger compiler bugs and reduce them to tiny programs that people can understand. Since Csmith is open source software, everyone is free to use it. One time Csmith received a Christmas card from a development team at a compiler company!