Closer to reliable software: verifying functional behaviour of concurrent programs

If software code is developed by humans, can we as users rely on its absolute correctness? Today's software is large, complex, and prone to errors. Although many bugs are found in the process of testing, we can never slaim that the delivered software is bug-free. Errors still occur when software is in use; and errors exist that will perhaps never occur. Reaching an absolute zero bug state for usable software is practically impossible. On the other side we have mathematical logic, a very powerful machinery for reasoning and drawing conclusions based on facts. The power of mathematical logic is certainty: when a given statement is mathematically proven, it is indeed absolutely correct. When a technique for verifying software is based on logic, it allows one to mathematically prove properties about the program. These so-called formal verification techniques are very challenging to develop, but what they promise is highly valuable, and so, they certainly deserve close research attention. This thesis shows the benefits and drawbacks of this style of reasoning, and proposes novel techniques that respond to some important verification challenges. Still, mathematical logic is theory, and software is practice. Thus, formal verification can not guarantee absolute correctness of software, but it certainly has the potential to move us much closer to reliable software.