Formal Verification of Temporal Properties for Parametrized Concurrent Programs and Concurrent Data Structures

Los tipos de datos concurrentes son implementaciones concurrentes de las abstracciones de datos clasicas, con la diferencia de que han sido especificamente disenados para aprovechar el gran paralelismo disponible en las modernas arquitecturas multiprocesador y multinucleo. La correcta manipulacion de los tipos de datos concurrentes resulta esencial para demostrar la completa correccion de los sistemas de software que los utilizan. Una de las mayores dificultades a la hora de disenar y verificar tipos de datos concurrentes surge de la necesidad de tener que razonar acerca de un numero arbitrario de procesos que invocan estos tipos de datos de manera concurrente. Esto requiere considerar sistemas parametrizados. En este trabajo estudiamos la verificacion formal de propiedades temporales de sistemas concurrentes parametrizados, poniendo especial enfasis en programas que manipulan estructuras de datos concurrentes. La principal dificultad a la hora de razonar acerca de sistemas concurrentes parametrizados proviene de la interaccion entre el gran nivel de concurrencia que estos poseen y la necesidad de razonar al mismo tiempo acerca de la memoria dinamica. La verificacion de sistemas parametrizados resulta en si un problema desafiante debido a que requiere razonar acerca de estructuras de datos complejas que son accedidas y modificadas por un numero ilimitado de procesos que manipulan de manera simultanea el contenido de la memoria dinamica empleando metodos de sincronizacion poco estructurados. En este trabajo, presentamos un marco formal basado en metodos deductivos capaz de ocuparse de la verificacion de propiedades de safety y liveness de sistemas concurrentes parametrizados que manejan estructuras de datos complejas. Nuestro marco formal incluye reglas de prueba y tecnicas especialmente adaptadas para sistemas parametrizados, las cuales trabajan en colaboracion con procedimientos de decision especialmente disenados para analizar complejas estructuras de datos concurrentes. Un aspecto novedoso de nuestro marco formal es que efectua una clara diferenciacion entre el analisis del flujo de control del programa y el analisis de los datos que se manejan. El flujo de control del programa se analiza utilizando reglas de prueba y tecnicas de verificacion deductivas especialmente disenadas para lidiar con sistemas parametrizados. Comenzando a partir de un programa concurrente y la especificacion de una propiedad temporal, nuestras tecnicas deductivas son capaces de generar un conjunto finito de condiciones de verificacion cuya validez implican la satisfaccion de dicha especificacion temporal por parte de cualquier sistema, sin importar el numero de procesos que formen parte del sistema. Las condiciones de verificacion generadas se corresponden con los datos manipulados. Estudiamos el diseno de procedimientos de decision especializados capaces de lidiar con estas condiciones de verificacion de manera completamente automatica. Investigamos teorias decidibles capaces de describir propiedades de tipos de datos complejos que manipulan punteros, tales como implementaciones imperativas de pilas, colas, listas y skiplists. Para cada una de estas teorias presentamos un procedimiento de decision y una implementacion practica construida sobre SMT solvers. Estos procedimientos de decision son finalmente utilizados para verificar de manera automatica las condiciones de verificacion generadas por nuestras tecnicas de verificacion parametrizada. Para concluir, demostramos como utilizando nuestro marco formal es posible probar no solo propiedades de safety sino ademas de liveness en algunas versiones de protocolos de exclusion mutua y programas que manipulan estructuras de datos concurrentes. El enfoque que presentamos en este trabajo resulta ser muy general y puede ser aplicado para verificar un amplio rango de tipos de datos concurrentes similares. Abstract Concurrent data types are concurrent implementations of classical data abstractions, specifically designed to exploit the great deal of parallelism available in modern multiprocessor and multi-core architectures. The correct manipulation of concurrent data types is essential for the overall correctness of the software system built using them. A major difficulty in designing and verifying concurrent data types arises by the need to reason about any number of threads invoking the data type simultaneously, which requires considering parametrized systems. In this work we study the formal verification of temporal properties of parametrized concurrent systems, with a special focus on programs that manipulate concurrent data structures. The main difficulty to reason about concurrent parametrized systems comes from the combination of their inherently high concurrency and the manipulation of dynamic memory. This parametrized verification problem is very challenging, because it requires to reason about complex concurrent data structures being accessed and modified by threads which simultaneously manipulate the heap using unstructured synchronization methods. In this work, we present a formal framework based on deductive methods which is capable of dealing with the verification of safety and liveness properties of concurrent parametrized systems that manipulate complex data structures. Our framework includes special proof rules and techniques adapted for parametrized systems which work in collaboration with specialized decision procedures for complex data structures. A novel aspect of our framework is that it cleanly differentiates the analysis of the program control flow from the analysis of the data being manipulated. The program control flow is analyzed using deductive proof rules and verification techniques specifically designed for coping with parametrized systems. Starting from a concurrent program and a temporal specification, our techniques generate a finite collection of verification conditions whose validity entails the satisfaction of the temporal specification by any client system, in spite of the number of threads. The verification conditions correspond to the data manipulation. We study the design of specialized decision procedures to deal with these verification conditions fully automatically. We investigate decidable theories capable of describing rich properties of complex pointer based data types such as stacks, queues, lists and skiplists. For each of these theories we present a decision procedure, and its practical implementation on top of existing SMT solvers. These decision procedures are ultimately used for automatically verifying the verification conditions generated by our specialized parametrized verification techniques. Finally, we show how using our framework it is possible to prove not only safety but also liveness properties of concurrent versions of some mutual exclusion protocols and programs that manipulate concurrent data structures. The approach we present in this work is very general, and can be applied to verify a wide range of similar concurrent data types.