Fundamentos de Análise Estática. O que é? Análise automática feita em código sem execução.

Post on 07-Apr-2016

215 views 0 download

Transcript of Fundamentos de Análise Estática. O que é? Análise automática feita em código sem execução.

Fundamentos de Análise Estática

O que é?

• Análise automática feita em código sem execução

Objetivo (Para que serve?)

• Verificação de propriedades• Entendimento de código Foco desta aula

Objetivo (Para que serve?)

• Verificação de propriedades• Entendimento de código Foco desta aula

Entendimento de código pode facilitar verificação!

Várias formas (Como?)

• Sistemas de tipos• Verificação de restrições• Análise de dataflow Foco desta aula

Conceitos Básicos

Aproximação de soluções

• Propriedades complexas– Análise é indecidível ou alto custo

Aproximação de soluções

• Propriedades complexas– Análise é indecidível ou alto custo

Maioria das propriedades interessantes são complexas!

Aproximação de soluções

• Propriedades complexas– Análise é indecidível ou alto custo

• Abordagem: aproximar espaço de solução– super-aproximação: falso positivos– sub-aproximação: falso negativos

comum

Aproximação de soluções

• Propriedades complexas– Análise é indecidível ou alto custo

• Abordagem: aproximar espaço de solução– super-aproximação: falso positivos– sub-aproximação: falso negativos

• Prática: – Balanço entre falso positivos e negativos e

escalabilidade potencializa utilidade da análise

comum

Uma análise é conservadora quando resultado inclui necessariamente todas as soluções. Por exemplo, uma análise para encontrar erros de tipo é conservadora quando não permite escapar nenhum erro. Por outro lado, geralmente, reporta erros espúrios (i.e., alarmes falso).

Frequentemente balanço entre falso positivos, negativos, e escalabilidade é mais importante (i.e., útil) que garantias fortes de correção (0% falso negativos) e completude (0% falso positivos).

Um pouco de teoria...

Teoria dos Reticulados (Lattice)

• O que estes grafos tem em comum?– Obs. vértice denota relação de ordem

Ordem Parcial

• Ordem parcial é uma relação binária:– reflexiva, transitiva e anti-simétrica

• Conceitos associados– Upper Bound– Least Upper Bound (LUB)– Lower Bound– Greatest Lower Bound (GLB)

LUB

LUB para este subconjunto?

LUB

LUB para este subconjunto?

GLB

GLB para este subconjunto?

GLB

GLB para este subconjunto?

Top e Bottom

Bottom

Top

Lattice

• Reticulado– Ordem parcial onde qualquer subconjunto de

elementos da relação possui LUB e GLB associado

• Esta ordem parcial é um lattice?

Exemplos: Lattices

Exemplo: relação de inclusão de inteiros {0,1,2,3}

Função monotônica e Ponto Fixo

• Função f: L → L– Monotônica

• Não decresce. Conceitualmente, acumula informação

• Função f: L → L– Monotônica

• Não decresce. Conceitualmente, acumula informação

• Ponto fixo fix(f), f(fix(f)) = fix(f)• Teorema do ponto fixo (Tarski):

– Toda função monotônica f admite ponto fixo em um reticulado L de altura finita.

Função monotônica e Ponto Fixo

Ilustração

• Iterações sucessivas de uma função– Acumula informação

(f é monotônica)– Para em ponto fixo quando

“não há mais informação para se descobrir”

Relação com nosso problemaO domínio e contra-domínio de f representam alguma informação de nosso interesse no programa. Por exemplo, definições alcançáveis em um ponto do programa. Tipicamente, f opera em uma representação abstrata do programa. Por exemplo, o control-flow graph (CFG) ou o inter. flow graph (IFG). Uma iteração de f propaga informação nesta estrututura. Por exemplo, propaga informação armazenada nos nós pelos vértices de um CFG.

Um pouco de prática...

Perspectiva

• Análise estática propaga informação usando estrutura do programa– Intra-procedural: fluxo de controle de um

método/função (CFG)– Inter-procedural: fluxo de chamadas entre

métodos/funções (IFG)

Perspectiva

• Análise estática propaga informação usando estrutura do programa– Intra-procedural: fluxo de controle de um

método/função (CFG)– Inter-procedural: fluxo de chamadas entre

métodos/funções (IFG)

CFG

Quiz

• Quais as definições de f alcançáveis no nó return f? (assuma que uma def. consiste de um nome de variável + id. do bloco básico)

Como mecanizar análise mental?

• Associado a cada nó i:– Informação acumulada: xi

• No exemplo anterior xi armazena conjunto de definições

– Função (monotônica) de transferência: Fi

Chaotic IterationSimplificação: na prática, Fi lê apenas conteúdo em nós vizinhos a i!

Framework

• Em geral, 4 funções descrevem uma análise intra-procedural: in, out, kill e gen

• Ilustração

in

out

genkill

Exemplo: Reachable Definitions

• in[b] = U OUT[k], for all k ∈ pred[b]• out[b] = (IN[b] – kill[b]) + gen[b]• kill[b] = “definições mortas em b”• gen[b] = “novas definições (não mortas) em b”

Existem vários frameworks de análise que permitem escrever basicamente estas 4 funções e obter sua análise intra-proc. E.g., SOOT (http://www.sable.mcgill.ca/soot)

Outros Detalhes

• Generalização– May/Must– Forward/Backward

• Reachable Defintions é uma análise– May e Forward

Perspectiva

• Análise estática propaga informação usando estrutura do programa– Intra-procedural: fluxo de controle de um

método/função (CFG)– Inter-procedural: fluxo de chamadas entre

métodos/funções (IFG)

Similaridades entre Inter e Intra• Informação se propaga em um grafo

– Informação e função de transferência associada a cada nó

Grafo inclui informação de chamador e chamado

Diferenças

• Representação do grafo é diferente• Context insensitivity: alguns caminhos (de

chamadas) são explorados, mas não são possíveis!

g()

f() calls g()

returns from g() back to f() returns from g() back to h()

h() calls g()

Caixinha é um CFG

Diferenças

• Representação do grafo é diferente• Context insensitivity: alguns caminhos (de

chamadas) são explorados, mas não são possíveis!

g()

f() calls g()

returns from g() back to f() returns from g() back to h()

h() calls g()

propagada informação acumulada no contexto de chamada de h() para o retorno da chamada de g() em f()!

Inlining

• Uma tentativa é representar um CFG do programa fazendo inlining de função

• Problemas– Como tratar recursão?– Não escala (vários contextos de chamada)

Existe uma variedade de representações de interprocedural flow graphs (IFGs). Por exemplo, IFG proposto por Harrold e Soffa em “Efficient Computation of Interprocedural Definition-Use Chains”, TOPLAS 1994.

Considerações Finais

• Representação do programa pode facilitar muito a análise do programa– 3-address– SSA

O framework SOOT oferece 4 representações (formatos) do programa de entrada.

Leitura adicional

• Michael Shwartzbach’s Lecture Notes on Static Analysis: http://www.brics.dk/~mis/static.pdf