Análisis de programa

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Proceso de análisis del comportamiento del programa informático

En ciencias de la computación, el análisis de programas es el proceso de analizar automáticamente el comportamiento de los programas de computadora con respecto a una propiedad como la corrección, la solidez, la seguridad y la vida. El análisis del programa se centra en dos áreas principales: la optimización del programa y la corrección del programa. El primero se enfoca en mejorar el rendimiento del programa mientras reduce el uso de recursos, mientras que el segundo se enfoca en garantizar que el programa haga lo que se supone que debe hacer.

El análisis del programa se puede realizar sin ejecutar el programa (análisis estático del programa), durante el tiempo de ejecución (análisis dinámico del programa) o en una combinación de ambos.

Análisis de programas estáticos

En el contexto de la corrección del programa, el análisis estático puede descubrir vulnerabilidades durante la fase de desarrollo del programa. Estas vulnerabilidades son más fáciles de corregir que las encontradas durante la fase de prueba, ya que el análisis estático conduce a la raíz de la vulnerabilidad.

Debido a que muchas formas de análisis estático son computacionalmente indecidibles, los mecanismos para hacerlo no siempre terminarán con la respuesta correcta, ya sea porque a veces devuelven un falso negativo ("no se encontraron problemas" cuando el código de hecho tiene problemas) o un falso positivo, o porque nunca devuelven una respuesta incorrecta pero a veces nunca terminan. A pesar de sus limitaciones, el primer tipo de mecanismo podría reducir el número de vulnerabilidades, mientras que el segundo a veces puede dar una fuerte seguridad de la ausencia de cierta clase de vulnerabilidades.

Las optimizaciones incorrectas son altamente indeseables. Entonces, en el contexto de la optimización de programas, hay dos estrategias principales para manejar el análisis computacionalmente indecidible:

  1. Un optimizador que se espera que complete en una cantidad relativamente corta de tiempo, como el optimizador en un compilador optimizador, puede utilizar una versión truncada de un análisis que está garantizado para completar en una cantidad finita de tiempo, y garantizado sólo para encontrar las optimizaciones correctas.
  2. Una herramienta de optimización de terceros puede ser implementada de tal manera que nunca produzca una optimización incorrecta, pero también para que pueda, en algunas situaciones, continuar funcionando indefinidamente hasta que encuentre uno (que puede nunca suceder). En este caso, el desarrollador que utiliza la herramienta tendría que detener la herramienta y evitar ejecutar la herramienta de nuevo en esa pieza de código (o posiblemente modificar el código para evitar tropezar la herramienta).

Sin embargo, también hay una tercera estrategia que a veces se aplica a lenguajes que no están completamente especificados, como C. Un compilador optimizador tiene la libertad de generar código que hace cualquier cosa en tiempo de ejecución, incluso falla, si encuentra código fuente. cuya semántica no está especificada por el estándar de lenguaje en uso.

Control-flujo

El propósito del análisis de flujo de control es obtener información sobre qué funciones se pueden llamar en varios puntos durante la ejecución de un programa. La información recopilada se representa mediante un gráfico de flujo de control (CFG) donde los nodos son instrucciones del programa y los bordes representan el flujo de control. Al identificar bloques de código y bucles, un CFG se convierte en un punto de partida para las optimizaciones realizadas por el compilador.

Análisis de flujo de datos

El análisis de flujo de datos es una técnica diseñada para recopilar información sobre los valores en cada punto del programa y cómo cambian con el tiempo. Los compiladores suelen utilizar esta técnica para optimizar el código. Uno de los ejemplos más conocidos de análisis de flujo de datos es la verificación de corrupción, que consiste en considerar todas las variables que contienen datos proporcionados por el usuario, lo que se considera "contaminado", es decir, inseguro, y evitar que esas variables sean utilizados hasta que hayan sido desinfectados. Esta técnica se usa a menudo para prevenir ataques de inyección SQL. La comprobación de corrupción se puede realizar de forma estática o dinámica.

Interpretación abstracta

La interpretación abstracta permite la extracción de información sobre una posible ejecución de un programa sin ejecutar realmente el programa. Los compiladores pueden usar esta información para buscar posibles optimizaciones o para certificar un programa contra ciertas clases de errores.

Tipo de sistemas

Los sistemas de tipos asocian tipos a programas que cumplen ciertos requisitos. Su finalidad es seleccionar un subconjunto de programas de un lenguaje que se consideran correctos según una propiedad.

  • Tipo de comprobación – verifique si el programa es aceptado por el sistema de tipo.

La verificación de tipos se usa en la programación para limitar cómo se usan los objetos de programación y qué pueden hacer. Esto lo hace el compilador o el intérprete. La verificación de tipos también puede ayudar a prevenir vulnerabilidades al garantizar que un valor firmado no se atribuya a una variable sin firmar. La comprobación de tipos se puede realizar de forma estática (en tiempo de compilación), dinámica (en tiempo de ejecución) o una combinación de ambas.

La información de tipo estático (ya sea inferida o proporcionada explícitamente por anotaciones de tipo en el código fuente) también se puede usar para realizar optimizaciones, como reemplazar arreglos en caja con arreglos sin caja.

Sistemas de efectos

Los sistemas de efectos son sistemas formales diseñados para representar los efectos que puede tener la ejecución de una función o método. Un efecto codifica lo que se está haciendo y con lo que se está haciendo, generalmente denominado tipo de efecto y región del efecto, respectivamente.

Comprobación del modelo

La verificación de modelos se refiere a formas estrictas, formales y automatizadas de verificar si un modelo (que en este contexto significa un modelo formal de una pieza de código, aunque en otros contextos puede ser un modelo de una pieza de hardware) cumple con una especificación dada. Debido a la naturaleza inherente de estado finito del código, y tanto la especificación como el código se pueden convertir en fórmulas lógicas, es posible verificar si el sistema viola la especificación utilizando métodos algorítmicos eficientes.

Análisis de programa dinámico

El análisis dinámico puede utilizar el conocimiento del tiempo de ejecución del programa para aumentar la precisión del análisis y, al mismo tiempo, brindar protección en el tiempo de ejecución, pero solo puede analizar una sola ejecución del problema y podría degradar el rendimiento del programa debido a las comprobaciones del tiempo de ejecución.

Pruebas

El software debe probarse para garantizar su calidad y que funcione como se supone que debe hacerlo de manera confiable, y que no cree conflictos con otro software que pueda funcionar junto con él. Las pruebas se realizan ejecutando el programa con una entrada y evaluando su comportamiento y la salida producida. Incluso si no se especifican requisitos de seguridad, se deben realizar pruebas de seguridad adicionales para garantizar que un atacante no pueda alterar el software y robar información, interrumpir las operaciones normales del software o utilizarlo como pivote para atacar a sus usuarios.

Monitoreo

La supervisión del programa registra y registra diferentes tipos de información sobre el programa, como el uso de recursos, los eventos y las interacciones, de modo que pueda revisarse para encontrar o identificar las causas del comportamiento anormal. Además, se puede utilizar para realizar auditorías de seguridad. El monitoreo automatizado de programas a veces se denomina verificación de tiempo de ejecución.

Corte de programa

Para un subconjunto dado del comportamiento de un programa, la segmentación del programa consiste en reducir el programa a la forma mínima que todavía produce el comportamiento seleccionado. El programa reducido se denomina "porción" y es una representación fiel del programa original dentro del dominio del subconjunto de comportamiento especificado. En general, encontrar un segmento es un problema sin solución, pero al especificar el subconjunto de comportamiento objetivo mediante los valores de un conjunto de variables, es posible obtener segmentos aproximados utilizando un algoritmo de flujo de datos. Los desarrolladores suelen utilizar estos segmentos durante la depuración para localizar el origen de los errores.

Contenido relacionado

El arte de la programación informática

El arte de la programación informática es una monografía completa escrita por el científico informático Donald Knuth presentando algoritmos de...

Diagrama de flujo o Flujograma

Un diagrama de flujo es un tipo de diagrama que representa un flujo de trabajo o proceso. Un diagrama de flujo también se puede definir como una...

Algoritmo paralelo

En informática, un algoritmo paralelo, a diferencia de un algoritmo en serie tradicional, es un algoritmo que puede realizar múltiples operaciones en un...
Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save