Over the past decade, language-based security mechanisms--such as type systems, model checkers, symbolic executors, and other program analyses--have been successfully used to uncover or prevent many important (exploitable) software vulnerabilities, such as buffer overruns, side channels, unchecked inputs (leading to code injection), and race conditions, among others.