Software analyses extract facts about programs from source code. Such facts can be employed by compilers to optimize programs during compilation, but can also be used to verify correctness of programs. In this course, we will study different software analysis techniques, in particular various data-flow analyses and abstract interpretation.