Mejorando la fiabilidad en programas C con VeriFast
Una mirada a cómo VeriFast mejora la verificación de programas en C usando sistemas formales.
― 7 minilectura
Tabla de contenidos
En los últimos años, asegurarse de que los programas de computadora sean correctos y confiables se ha vuelto cada vez más importante. Una forma de hacerlo es a través de un proceso llamado Verificación, que comprueba si un programa se comporta como se espera. En este contexto, vamos a ver cómo una herramienta llamada VeriFast ayuda a verificar programas en C, especialmente en relación con un sistema formal llamado CH2O. Este artículo explicará los métodos utilizados para asegurar que los programas sean correctos, describirá las mejoras hechas a VeriFast y proporcionará un ejemplo simple de cómo funciona la verificación.
Antecedentes sobre la Verificación
La verificación es el proceso de confirmar que un programa se comporta como se pretende. Para los programas en C, que a menudo se utilizan para construir varios tipos de software, es crucial asegurarse de que no tengan comportamientos indefinidos. Un comportamiento indefinido puede llevar a problemas serios, como acceder a memoria que el programa no debería o causar condiciones de carrera donde múltiples procesos intentan cambiar los mismos datos al mismo tiempo.
VeriFast es una herramienta desarrollada para ayudar con este proceso de verificación. Toma programas en C y los comprueba contra ciertas reglas y especificaciones para ver si se comportan correctamente. Sin embargo, es importante notar que aunque VeriFast es una herramienta útil, la herramienta misma no ha sido verificada formalmente. Esto significa que no podemos confiar plenamente en su corrección sin añadir una capa extra de verificación.
Coq y CH2O
El Papel dePara abordar la incertidumbre en torno a VeriFast, se ha introducido un paso adicional. Usando un asistente de pruebas llamado Coq, podemos crear un certificado de corrección para cada ejecución de verificación exitosa de un programa en C. Este certificado es esencialmente una prueba formal que muestra que el programa es correcto de acuerdo con un conjunto de reglas definidas por otro sistema conocido como CH2O.
CH2O proporciona una forma formal de entender los programas en C, especialmente aquellos que siguen el estándar C11. Esto significa que cuando un programa es verificado usando CH2O, se garantiza que funcionará correctamente con cualquier compilador que también sea compatible con C11.
Mejoras a VeriFast
Los esfuerzos por mejorar VeriFast se centran en dos áreas principales. Primero, el código de Coq utilizado para la verificación ha sido reorganizado para utilizar una herramienta de biblioteca llamada STDPP. Esta actualización simplifica muchos aspectos del proceso de prueba, haciéndolo más fácil y eficiente.
En segundo lugar, el backend central de VeriFast ha cambiado de CompCert a CH2O. Este cambio es significativo porque CH2O proporciona una semántica formal de C que es fiel al estándar C11 subyacente. Los beneficios de esta actualización incluyen un modelo de memoria interesante que permite tanto operaciones de bajo nivel como análisis de compiladores de mayor nivel.
El Desafío de la Complejidad
VeriFast es una herramienta compleja con varias características, lo que hace difícil verificarla directamente. El objetivo original de verificar VeriFast en sí mismo parecía una tarea desalentadora debido a sus intrincadas internas. Sin embargo, se encontró una solución extendiendo VeriFast para producir pruebas verificables por máquina con cada ejecución de verificación exitosa.
Estas pruebas toman la forma de scripts de Coq que, al ser verificadas, demuestran que el programa original en C es correcto de acuerdo con las especificaciones diseñadas.
Cómo Funciona la Verificación
Para ilustrar cómo se lleva a cabo la verificación, podemos mirar un programa de ejemplo simple. Este ejemplo mostrará cómo los diferentes pasos del proceso de verificación se juntan.
Programa de Ejemplo
Considera un programa simple en C que cuenta regresivamente desde un número dado. El primer paso en el proceso de verificación implica ejecutar una herramienta que genera un script de Coq que contiene el árbol de sintaxis abstracta (AST) para ese programa. El AST es una representación estructurada del programa que ayuda con el proceso de verificación.
A continuación, ejecutamos VeriFast en este programa en C usando una bandera específica que le dice que genere una prueba de Coq. El resultado es otro script de Coq que contiene la prueba generada por VeriFast.
Finalmente, compilamos ambos scripts de Coq para comprobar si la prueba es correcta. Si el compilador de Coq acepta la prueba, podemos concluir que el programa se adhiere a sus condiciones especificadas.
Analizando los Scripts de Coq
El script de Coq generado por la herramienta CH2O contiene todas las declaraciones necesarias del programa, mientras que el script generado por VeriFast incluye las anotaciones y condiciones que guían la verificación. El siguiente paso implica traducir el AST abstracto de C de CH2O a otra forma adecuada para la prueba.
Establecer la relación entre estas dos formas es vital para la validez de la prueba. Una vez que se establece esta relación, podemos demostrar la corrección vinculándola de nuevo a la ejecución del programa original, asegurando que el programa se comporta como se espera.
La Importancia de la Solidez
La solidez en este contexto significa que si un programa se prueba como correcto por la herramienta de verificación, se comportará correctamente al ejecutarse. Esto es crucial porque proporciona una capa de confianza en la confiabilidad del programa.
Al relacionar la corrección del programa con principios de corrección conocidos dentro de CH2O, podemos crear una cadena de razonamiento que respalde nuestras afirmaciones de corrección.
Esta cadena incluye diversas transformaciones y pasos que, en última instancia, demuestran que el programa cumple con sus especificaciones sin encontrar comportamientos indefinidos.
Desafíos por Delante
Si bien los procesos mencionados anteriormente son efectivos, todavía hay desafíos que abordar. El conjunto actual de características en los programas en C soportados es limitado. El trabajo futuro requerirá agregar más características como punteros, estructuras y asignación de memoria dinámica.
Además, la capacidad de verificar programas más complejos significa que las herramientas de verificación actuales pueden necesitar ser mejoradas o adaptadas. A medida que los programas se vuelven más complicados, se necesitarán nuevas estrategias para manejar tareas de verificación cada vez más complejas.
El soporte para programas concurrentes es otro desafío significativo. Dado que tanto CH2O como CompCert son de un solo hilo, lidiar con múltiples hilos requerirá una planificación cuidadosa y semánticas adicionales.
Conclusión
En conclusión, verificar programas en C es esencial para crear software confiable y sin errores. La herramienta VeriFast combinada con los sistemas formales de CH2O y Coq ofrece una forma prometedora de lograr esta tarea. Las mejoras continuas en estas herramientas y técnicas tienen como objetivo fortalecer el proceso de verificación, asegurando que programas en C más complejos puedan ser validados efectivamente contra comportamientos esperados.
A medida que avanzamos, la integración de más características y el desarrollo de estrategias para manejar escenarios complejos mejorará aún más la capacidad de confiar en la corrección del software. Este esfuerzo continuo, en última instancia, contribuirá al campo de la confiabilidad del software, asegurando que los programas funcionen correctamente y de forma segura en diversos entornos.
Título: Certifying C program correctness with respect to CH2O with VeriFast
Resumen: VeriFast is a powerful tool for verification of various correctness properties of C programs using symbolic execution. However, VeriFast itself has not been verified. We present a proof-of-concept extension which generates a correctness certificate for each successful verification run individually. This certificate takes the form of a Coq script which, when successfully checked by Coq, removes the need for trusting in the correctness of VeriFast itself. The Coq script achieves this by applying a chain of soundness results, allowing us to prove correctness of the program with regards to the third-party CH2O small step semantics for C11 by proving correctness in terms of symbolic execution in Coq. This proof chain includes two intermediate auxiliary big step semantics, the most important of which describes VeriFast's interpretation of C. Finally, symbolic execution in Coq is implemented by transforming the exported AST of the program into a Coq proposition representing the symbolic execution performed by VeriFast itself.
Autores: Stefan Wils, Bart Jacobs
Última actualización: 2023-08-29 00:00:00
Idioma: English
Fuente URL: https://arxiv.org/abs/2308.15567
Fuente PDF: https://arxiv.org/pdf/2308.15567
Licencia: https://creativecommons.org/licenses/by/4.0/
Cambios: Este resumen se ha elaborado con la ayuda de AI y puede contener imprecisiones. Para obtener información precisa, consulte los documentos originales enlazados aquí.
Gracias a arxiv por el uso de su interoperabilidad de acceso abierto.