Formal verification of translation validators
Abstract
As any piece of software, compilers, and especially optimizing compilers, can be faulty. It is therefore possible that the semantics of a program is changed by the compilation, along with its properties. In the context of critical software, where formal methods are used to ensure that a program satisfies some properties, possibly before it is compiled, this presents a problem. A solution to this problem is to verify the compiler itself by ensuring that it preserves the semantics of the programs being compiled. In this thesis, we evaluate a new method for building verified compiler passes, the formal verification of translation validators. On the one hand, this method uses formal verification based on proof-assistant in order to offer the best safety guarantees on the compiler. On the other hand, it relies on the use of translation validation, where each execution of the compiler is verified a posteriori, a more pragmatic verification method which allows for the verification of advanced optimizations. We show that this novel approach to the problem of verifying compilers is viable, and even advantageous in some cases, through four examples of optimizations that are both realistic and aggressive: list scheduling, trace scheduling, lazy code motion and software pipelining.
Comme tout logiciel, les compilateurs, et tout particulièrement les compilateurs optimisant, peuvent être défectueux. Il est donc possible qu'ils changent la sémantique du programme compilé, et par conséquent ses propriétés. Dans le cadre de développement de logiciels critiques, où des méthodes formelles sont utilisées pour s'assurer qu'un programme satisfait certaines propriétés, et cela avant qu'il soit compilé, cela pose un problème de fond. Une solution à ce problème est de vérifier le compilateur en s'assurant qu'il préserve la sémantique des programmes compilés. Dans cette thèse, nous évaluons une méthode nouvelle pour développer des passes de compilations sûres: la vérification formelle de validateurs de traduction. D'une part, cette méthode utilise la vérification formelle à l'aide d'assistant de preuve afin d'offrir le maximum de garanties de sûreté sur le compilateur. D'autre part, elle repose sur l'utilisation de la validation de traduction, où chaque exécution du compilateur est validée a posteriori, une méthode de vérification plus pragmatique qui a permis de vérifier des optimisations avancées. Nous montrons que cette approche nouvelle du problème de la vérification de compilateur est viable, et même avantageuse dans certains cas, à travers quatre exemples d'optimisations réalistes et agressives: le list scheduling, le trace scheduling, le lazy code motion et enfin le software pipelining.
Loading...