We will discuss those techniques by developing programs with increasingly more rigid safety, correctness, and security guarantees. As such, successful course participants will be able to judge better the benefits – for example: ruling out certain bugs during development – and the costs – for example: additional development effort when working with a tool – of available systems programming languages and verification tools.
Since security is impossible without safety–ca. 70% of all security vulnerabilities can be traced back to memory safety issues – we will start by considering how memory safety issues arise, by looking at different classes of attacks in C and Java, exploiting manual memory management and serialization, respectively. We will then introduce the Rust programming language, a modern high–performance systems programming language. Programming in Rust requires more effort than programming inC/C++: programs that compile in C may be rejected by the Rust compiler unless the programmer carefully adds certain annotations.At the same time, the Rust compiler guarantees that common memory safety issues, for example use–after–free bugs, will never occur in a valid Rust program.