Análise do programa - Program analysis

Em ciência da computação , análise de programa é o processo de analisar automaticamente o comportamento de programas de computador em relação a uma propriedade, como correção, robustez, segurança e vivacidade. A análise do programa concentra-se em duas áreas principais: otimização do programa e correção do programa . O primeiro se concentra em melhorar o desempenho do programa enquanto reduz o uso de recursos, enquanto o último se concentra em garantir que o programa faça o que deve fazer.

A análise do programa pode ser realizada sem a execução do programa ( análise estática do programa ), durante a execução ( análise dinâmica do programa ) ou em uma combinação de ambos.

Análise de programa estático

No contexto da correção do programa, a análise estática pode descobrir vulnerabilidades durante a fase de desenvolvimento do programa. Essas vulnerabilidades são mais fáceis de corrigir do que as encontradas durante a fase de teste, pois a análise estática leva à raiz da vulnerabilidade.

Devido a muitas formas de análise estática serem computacionalmente indecidíveis, os mecanismos para fazer isso nem sempre terminam com a resposta certa - seja porque às vezes eles retornam um falso negativo ("nenhum problema encontrado" quando o código de fato tem problemas) ou um falso positivo ou porque eles nunca retornam a resposta errada, mas às vezes nunca terminam. Apesar de suas limitações, o primeiro tipo de mecanismo pode reduzir o número de vulnerabilidades, enquanto o segundo às vezes pode dar uma forte garantia da falta de uma determinada classe de vulnerabilidades.

Otimizações incorretas são altamente indesejáveis. Portanto, no contexto da otimização do programa, existem duas estratégias principais para lidar com a análise computacionalmente indecidível:

  1. Um otimizador que deve ser concluído em um período de tempo relativamente curto, como o otimizador em um compilador de otimização, pode usar uma versão truncada de uma análise que é garantida para ser concluída em um período de tempo finito e com garantia de apenas encontrar o correto otimizações.
  2. Uma ferramenta de otimização de terceiros pode ser implementada de forma a nunca produzir uma otimização incorreta, mas também para que possa, em algumas situações, continuar rodando indefinidamente até encontrar uma (o que pode nunca acontecer). Nesse caso, o desenvolvedor que usa a ferramenta teria que parar a ferramenta e evitar executá-la naquele pedaço de código novamente (ou possivelmente modificar o código para evitar tropeçar na ferramenta).

No entanto, há também uma terceira estratégia que às vezes é aplicável para idiomas que não estão completamente especificadas, tais como C . Um compilador otimizador tem liberdade para gerar código que faz qualquer coisa em tempo de execução - até mesmo travar - se encontrar código-fonte cuja semântica não seja especificada pelo padrão de linguagem em uso.

Controle de fluxo

O objetivo da análise de fluxo de controle é obter informações sobre quais funções podem ser chamadas em vários pontos durante a execução de um programa. As informações coletadas são representadas por um gráfico de fluxo de controle (CFG) onde os nós são instruções do programa e as arestas representam o fluxo de controle. Ao identificar blocos de código e loops, o CFG se torna um ponto de partida para otimizações feitas pelo compilador.

Análise de fluxo de dados

A análise de fluxo de dados é uma técnica projetada para reunir informações sobre os valores em cada ponto do programa e como eles mudam ao longo do tempo. Essa técnica é freqüentemente usada por compiladores para otimizar o código. Um dos exemplos mais conhecidos de análise de fluxo de dados é a verificação de contaminação, que consiste em considerar todas as variáveis ​​que contêm dados fornecidos pelo usuário - que são considerados "contaminados", ou seja, inseguros - e evitar que essas variáveis ​​sejam usadas antes de serem higienizadas. Essa técnica é freqüentemente usada para evitar ataques de injeção de SQL . A verificação de contaminação pode ser feita de forma estática ou dinâmica.

Interpretação abstrata

A interpretação abstrata permite a extração de informações sobre uma possível execução de um programa sem realmente executá-lo. Essas informações podem ser usadas por compiladores para procurar possíveis otimizações ou para certificar um programa contra certas classes de bugs.

Sistemas de tipo

Os sistemas de tipo associam tipos a programas que atendem a certos requisitos. Seu objetivo é selecionar um subconjunto de programas de uma linguagem que são considerados corretos de acordo com uma propriedade.

A verificação de tipo é usada na programação para limitar como um objeto de programação é usado e o que eles podem fazer. Isso é feito pelo compilador ou interpretador. A verificação de tipo também pode ajudar a prevenir vulnerabilidades, garantindo que um valor com sinal não seja atribuído a uma variável sem sinal. A verificação de tipo pode ser feita estaticamente (em tempo de compilação), dinamicamente (em tempo de execução) ou uma combinação de ambos.

As informações de tipo estático ( inferidas ou explicitamente fornecidas por anotações de tipo no código-fonte) também podem ser usadas para fazer otimizações, como substituir matrizes em caixa por matrizes não embaladas.

Sistemas de efeito

Os sistemas de efeitos são sistemas formais projetados para representar os efeitos que a execução de uma função ou método pode ter. Um efeito codifica o que está sendo feito e com o que está sendo feito - geralmente referido como tipo de efeito e região, respectivamente.

Verificação de modelo

A verificação de modelo refere-se a formas estritas, formais e automatizadas de verificar se um modelo (o que, neste contexto, significa um modelo formal de um pedaço de código, embora em outros contextos possa ser um modelo de um pedaço de hardware) está em conformidade com um determinado especificação. Devido à natureza de estado finito inerente do código, e tanto a especificação quanto o código sendo conversíveis em fórmulas lógicas, é possível verificar se o sistema viola a especificação usando métodos algorítmicos eficientes.

Análise dinâmica de programa

A análise dinâmica pode usar o conhecimento de tempo de execução do programa para aumentar a precisão da análise, ao mesmo tempo que fornece proteção de tempo de execução, mas pode analisar apenas uma única execução do problema e pode degradar o desempenho do programa devido às verificações de tempo de execução.

Testando

O software deve ser testado para garantir sua qualidade e seu desempenho conforme esperado de maneira confiável, e para que não crie conflitos com outro software que possa funcionar junto com ele. Os testes são realizados executando o programa com uma entrada e avaliando seu comportamento e a saída produzida. Mesmo que nenhum requisito de segurança seja especificado, testes de segurança adicionais devem ser realizados para garantir que um invasor não possa adulterar o software e roubar informações, interromper as operações normais do software ou usá-lo como um pivô para atacar seus usuários.

Monitoramento

O monitoramento do programa registra e registra diferentes tipos de informações sobre o programa, como uso de recursos, eventos e interações, para que possa ser revisado para encontrar ou apontar as causas do comportamento anormal. Além disso, pode ser usado para realizar auditorias de segurança. O monitoramento automatizado de programas às vezes é chamado de verificação de tempo de execução .

Fatiamento de programa

Para um determinado subconjunto do comportamento de um programa, a divisão do programa consiste em reduzir o programa à forma mínima que ainda produz o comportamento selecionado. O programa reduzido é chamado de “fatia” e é uma representação fiel do programa original dentro do domínio do subconjunto de comportamento especificado. Geralmente, encontrar uma fatia é um problema insolúvel, mas ao especificar o subconjunto do comportamento alvo pelos valores de um conjunto de variáveis, é possível obter fatias aproximadas usando um algoritmo de fluxo de dados. Essas fatias são geralmente usadas por desenvolvedores durante a depuração para localizar a origem dos erros.

Veja também

Referências

Leitura adicional

  • Agrawal, Hiralal; Horgan, Joseph R. Fatiamento dinâmico de programa (PDF) .
  • Chunlei, Wang; Gang, Zhao; Yiqi, Dai (2009). "Uma abordagem de análise de segurança de fluxo de controle eficiente para executáveis ​​binários". 2009 2ª Conferência Internacional IEEE sobre Ciência da Computação e Tecnologia da Informação . pp. 272–276. doi : 10.1109 / ICCSIT.2009.5234950 . ISBN 978-1-4244-4519-6.
  • Nielson, Flemming; Nielson, Hanne Riis; Hankin, Chris (2005). Princípios de análise de programas . Springer Science + Business Media .

links externos