190 likes | 305 Views
Testes e Depuração de Software. Slides preparados por Bruno Monteiro e Marcelo d’Amorim Execução simbólica - 24/09/2009. Execução Simbólica: Objetivo. Gerar dados de testes de forma automática Explora todos os possíveis caminhos (módulo limitações). Dados concretos e simbólicos. Concreto
E N D
Testes e Depuração de Software Slides preparados por Bruno Monteiro e Marcelo d’Amorim Execução simbólica - 24/09/2009
Execução Simbólica: Objetivo • Gerar dados de testes de forma automática • Explora todos os possíveis caminhos (módulo limitações)
Dados concretos e simbólicos • Concreto • Exemplo: “Fui à escola hoje”, 3, newInteger(3) • Simbólico • Exemplo: $a + 3, $s.indexOf(‘a’) != -1 • Valor Simbólico representa um conjunto de valores concretos
Entrada e Saída (King, 1976) f(int x, int y) REQ1(x,y) Execução Simbólica REQ2(x,y) REQn(x,y)
Entrada e Saída (King, 1976) f(int x, int y) REQ1(x,y) Execução Simbólica REQ2(x,y) REQn(x,y) • REQidenota um requisito de entrada sobre x e y na forma de uma expressão simbólica
Entrada e Saída f(int x, int y) f(2,3) f(-1,-1) f(0,0) REQ1(x,y) REQ2(x,y) Exec. Simb. Constraint Solver REQn(x,y) Resolve restrições. Isto é, instancia variáveis simbólicas Gera restrições simbólicas
Path Condition (PC) • Representa condições suficientes para execução alcançar um ponto do programa • Forma: • Conjunção de restrições b1 Λ b2 Λ ... bn • Faz parte do estado de uma execução simbólica
Exemplo 1: Fork f(int x, int y){ if(x = y){ ... }else{ ... } } Fork na execução PC1: $a = $b PC2: $a != $b f($a,$b) produz • PC1 = ($a = $b) • PC2 = $a != $b
Exemplo 1: Fork f(int x, int y){ if(x = y){ ... }else{ ... } } Nota: Exemplo ilustrativo. Considere chamada de funções, loops, encadeamento de condicionais, e outros operadores relacionais e booleanos. Fork na execução PC1: $a = $b PC2: $a != $b
Exemplo 2: Estado simbólico f(int x, int y){ x = x + y if(x = y){ ... }else{ ... } } Fork na execução • PC1: $a + $b = $b • PC2: $a + $b != $b
Desafios • Suporte para • Métodos Nativos • Loop e recursão • Indexação de Arrays • Strings • Referências fuzzing Interpretação especial de operadores
Referências • Referência • S. Khurshid, C. Pasareanu and W. Visser. Generalized Symbolic Execution for Model Checking and Testing. TACAS 2003 • Strings • D. Shannon, S. Hajra, A. Lee, D. Zhan, and S. Khurshid. Abstracting Symbolic Execution with String Analysis. TAIC-PART 2007.
Exemplo 3: Tipo referência f(T t){ if(t == null){ ... } ... } Fork na execução • PC1: $t == null • PC2: $t != null
LazyInitialization • Só inicializa os objetos no momento em que são usados • Derreferência (ou seja, “r.”) requer lazyinitialization • Três possibilidade para o valor de uma referência: null, objeto novo, objeto existente (alias)
Exemplo 4: Strings foo(String s, String t){ s.equals(t) } • Operadores da linguagem geram restrições. • Por exemplo, equals, indexOf, substring, etc. • Duas opções de tratamento: • se t têm tamanho fixo n. Equivalente a: • foo(int s1, ..., sn, t1, ..., tn) • Não assumir tamanho das entradas
Strings e autômatos • Valor simbólico de uma string $a é caracterizado pelo autômato que reconhece a linguagem com todas possíveis strings concretas associadas a $a
Exemplo 5: Valores associados a string s em pontos do programa Σ* f(String s){ s.startWith(“ola ”) } Σ* l a o
Soluções para strings podem ser obtidas com uma visita no autômato
Exemplo 5: Valores associados a string s em pontos do programa f(String s){ s.startWith(“ola ”) if (s.endsWith(“ turma”) && s.length() > 9) { } ... } Σ+ o l a t u r m a