Testes e Depurao de Software Slides preparados por



















- Slides: 19
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, new Integer(3) � Simbólico ◦ Exemplo: $a + 3, $s. index. Of(‘a’) != -1 � Valor Simbólico representa um conjunto de valores concretos
Entrada e Saída (King, 1976) f(int x, int y) Execução Simbólica REQ 1(x, y) REQ 2(x, y) REQn(x, y)
Entrada e Saída (King, 1976) f(int x, int y) Execução Simbólica REQ 1(x, y) REQ 2(x, y) REQn(x, y) denota um requisito de entrada sobre x e y na forma de uma expressão simbólica REQi
Entrada e Saída f(2, 3) f(-1, -1) REQ 1(x, y) f(int x, int y) REQ 2(x, y) Exec. Simb. Constraint Solver REQn(x, y) f(0, 0) Gera restrições simbólicas Resolve restrições. Isto é, instancia variáveis simbólicas
Path Condition (PC) � Representa condições suficientes para execução alcançar um ponto do programa � Forma: � Conjunção � Faz de restrições b 1 Λ b 2 Λ. . . bn parte do estado de uma execução simbólica
Exemplo 1: Fork f(int x, int y){ if(x = y){ Fork na execução. . . PC 1: $a = $b }else{. . . } PC 2: $a != $b } f($a, $b) produz §PC 1 = ($a = $b) §PC 2 = $a != $b
Exemplo 1: Fork f(int x, int y){ Nota: Exemplo ilustrativo. if(x = y){ Fork na execução Considere chamada de funções, . . . }else{ encadeamento loops, de PC 1: $a = $b. . . } condicionais, e outros } PC 2: $a != $b operadores relacionais e booleanos.
Exemplo 2: Estado simbólico f(int x, int y){ x = x + y if(x = y){ Fork na execução. . . PC 1: $a + $b = $b }else{. . . PC 2: $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. . . PC 1: $t == null }. . . PC 2: $t != null }
Lazy Initialization � Só inicializa os objetos no momento em que são usados � Derreferência (ou seja, “r. ”) requer lazy initialization � 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, index. Of, substring, etc. � Duas opções de tratamento: � s e t têm tamanho fixo n. Equivalente a: � foo(int s 1, . . . , sn, t 1, . . . , 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. start. With(“ola ”) } o Σ* l a
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. start. With(“ola ”) if (s. ends. With(“ turma”) && s. length() > 9) { }. . . } Σ+ o l a u r m a t