Inicio Artículos de fondo SuperGuard: validación de la biblioteca estándar de C para aplicaciones de seguridad...

SuperGuard: validación de la biblioteca estándar de C para aplicaciones de seguridad crítica

6953
0

Cómo se desarrollan las pruebas con SuperGuard

Al implementar las comprobaciones basadas en requisitos recomendadas en la Parte 8 y la Parte 6 del estándar de seguridad funcional ISO 26262, el principal problema con las especificaciones de la Biblioteca Estándar de C y C++ es que, si bien proporcionaban una descripción detallada de la respuesta para cada función, ninguna de ellas define un conjunto claro de requisitos. Por tanto, los requisitos necesarios para cada función se deben crear a partir de las descripciones de las respuestas.

SuperGuard C Library Safety Qualification Suite incorpora el paquete de prueba probado para la Biblioteca Estándar de C ya incluido en SuperTest, el paquete líder en el mundo para test y verificación del compilador de Solid Sands, que ha seguido las especificaciones del lenguaje (ISO) durante más de 30 años. No obstante, SuperGuard va mucho más allá que SuperTest por sus capacidades de generación de informes, requisitos de documentación, test individuales y resultados de la prueba en conformidad con estándares de seguridad funcional como ISO 26262, EN 50128 e IEC 61508.

Las pruebas en el paquete de prueba de SuperGuard están diseñados según los siguientes principios, por lo que están indicados para una gran variedad de entornos de desarrollo.

Las pruebas de SuperGuard se basan en la respuesta, es decir, verifican que la implementación responda cumpliendo la especificación de la biblioteca. Cada test ejecuta la construcción o función comprobada y compara los resultados de la ejecución con los resultados previstos (“modelo”) definidos en la especificación de la biblioteca. El propio test indica si este ha sido superado al controlador.

Estas pruebas se compilan y ejecutan en un entorno de ejecución con el fin de comprobar la respuesta de la implementación, lo cual significa que en cada test se recurre a toda la cadena de herramientas, incluido el procesador de destino. Esto hace que SuperGuard resulte apropiado para la verificación de hardware en lazo de la biblioteca.

Las pruebas para la parte autónoma de la biblioteca (que se suelen usar en sistemas sin sistema operativo) requieren unos recursos mínimos. La mayoría de Las pruebas con SuperGuard se pueden ejecutar en sistemas con menos de 4K de memoria, por lo que es posible usar SuperGuard en sistemas embebidos muy pequeños.

Para implementar comprobaciones basadas en requisitos, SuperGuard suministra un desglose detallado de las especificaciones de la Biblioteca Estándar de C en requisitos de implementación comprobables junto con especificaciones de prueba que describen cómo se comprueba cada requisito.

Al vincular los resultados de la ejecución de cada prueba con la especificación de la prueba correspondiente, el requisito de la prueba y la función de la biblioteca estándar, SuperGuard ofrece la trazabilidad total necesaria para la comprobación basada en requisitos. Para demostrar que ha sido completada, proporciona una cobertura de código estructural cercana al 100% para más del 80% de las funciones con un alto MC/DC (Modified Condition/Decision Coverage). Obsérvese que esto se dirige a la propia implementación de la biblioteca, no de la capa del SO subyacente.

Un ejemplo

Cada prueba de la biblioteca en SuperGuard está desarrollado de acuerdo con una metodología consistente como ilustra la función strncpy mostrada a continuación. Esta es la especificación en la Sección 7.21.2.4 de la definición del lenguaje C99:

7.21.2.4 La función strncpy

Sinopsis

1          #include < string.h >
            char * strncpy(char * restrict s1, const char * restrict s2, size_t n);

Descripción

2          La función strncpy copia no más de n caracteres (los caracteres situados tras un carácter nulo no se copian) desde la matriz apuntada por s2 a la matriz apuntada por s1. Si la copia tiene lugar entre objetos que se superponen, la respuesta es indefinida.

3          Si la matriz apuntada por s2 es una cadena con menos de n caracteres, los caracteres nulos se agregan a la copia en la matriz apuntada por s1 hasta que se hayan escrito los n caracteres.

Resultados

4          La función strncpy entrega el valor de s1.

El aspecto más curioso sobre esta especificación es que el Párrafo 2 no especifica un límite inferior de en el número de caracteres que copia strncpy(). Dice así: “copia no más de n caracteres”. La especificación no exige en ningún punto que se copia ningún carácter de s2 a s1. En el Párrafo 3 se indica una acción, en concreto que s1 está rellena con caracteres nulos. Tomado de forma literal, una implementación correcta siguiendo esta especificación consistiría tan solo es escribir n caracteres nulos en s1.

En efecto, la función no fue creada para esto ni es lo que se espera que haga. La interpretación general es que la función copia tantos caracteres como sea posible de s2 a s1 hasta que la cadena s2 o n se han consumido. No hay confusión sobre ello y según parece nadie se ha quejado sobre esta frase desde ANSI C89 porque las mismas palabras siguen presentes en C18. Pero para definir los requisitos hemos de ser un poco más precisos.

El primer paso en nuestro proceso de desarrollo de la prueba consiste en extraer un conjunto de requisitos (REQ) de esta descripción teniendo en cuenta a qué se destina la función en realidad:

  • REQ-copystring: Si s2 apunta a una cadena con una longitud ‘l2‘ (tal como la define strlen()) que es inferior a n, strncpy() copiará l2 caracteres, en orden, desde la matriz s2 hasta la matriz s1.
  • REQ-copyn: Si s2 no apunta a una cadena con una longitud inferior a n, strncpy() copiará los primeros n caracteres, en orden, desde la matriz s2 hasta la matriz s1.
  • REQ-shorter: Si s2 apunta a una cadena con una longitud inferior a n, strncpy() agregará caracteres nulos (‘\0’) tras los caracteres copiados en la matriz s1 hasta que se hayan escrito n caracteres en total.
  • REQ-nomore: strncpy() no escribirá en la matriz de destino s1 tras los primeros n caracteres.
  • REQ-nochange: strncpy() no modificará la matriz s2.
  • REQ-return: strncpy()entregará el valor de s1.

El requisito REQ-nochange sigue a ladeclaración de s2 como una matriz constante, pero la declaración por sí sola no garantiza que una implementación de strncpy() no escriba en s2.

Se ha desarrollado una especificación de prueba para cada uno de estos requisitos. La especificación de prueba define cómo verifica una prueba si el requisito es cierto. Una sola especificación de prueba suele conducir a un determinado número de casos de uso que cubren los dominios de entrada y salida de la función. Los casos de prueba son implementados por la prueba. La especificación de prueba vincula el requisito a las pruebas.

Por ejemplo, las especificaciones de la prueba para los requisitos de REQ-copystring y REQ-nomore son los siguientes:

  • Especificación de test para REQ-copystring: Aplicar la función strncpy() con diferentes valores del parámetro n (incluido n==0) iguales y mayores que la longitud de la cadena de origen. Compruebe que la cadena de origen se ha copiado en la matriz de destino hasta el último carácter nulo.
  • Especificación de prueba para REQ-nomore: En todos los casos, compruebe que el carácter con índice n en la matriz de destino s1 no se ha modificado. Si ello concuerda con la prueba, compruebe que tampoco se han modificado caracteres después de n.

En este caso se implementa la especificación de prueba REQ-nomore en el mismo archivo de prueba que los otros casos de prueba para strncpy(). Dado que el requisito se debe mantener incondicionalmente cada vez que se aplica strncpy(), en lugar de crear nuevos test para esta especificación de prueba, se implementa simplemente realizando una comprobación adicional en cada test de caso para los otros requisitos en lugar de crear nuevos test para él.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.