Download - Testes e Depuração de Software
Testes e Depuração de Software
Slides preparados por Bruno Monteiro e Marcelo d’Amorim
Execução simbólica - 24/09/2009
Gerar dados de testes de forma automática◦ Explora todos os possíveis caminhos (módulo
limitações)
Execução Simbólica: Objetivo
Concreto◦ Exemplo: “Fui à escola hoje”, 3, new Integer(3)
Simbólico◦ Exemplo: $a + 3, $s.indexOf(‘a’) != -1
Valor Simbólico representa um conjunto de valores concretos
Dados concretos e simbólicos
Entrada e Saída (King, 1976)
Execução Simbólica
f(int x, int y)REQ1(x,y)REQ2(x,y)
REQn(x,y)
Entrada e Saída (King, 1976)
Execução Simbólica
f(int x, int y)REQ1(x,y)REQ2(x,y)
REQn(x,y)
REQi denota um requisito de entrada sobre x e y na forma de uma expressão simbólica
Entrada e Saída
Exec. Simb.
f(int x, int y)
REQ1(x,y)
REQ2(x,y)
REQn(x,y)
Constraint Solver
f(2,3)
f(-1,-1)
f(0,0)
Gera restrições simbólicas
Resolve restrições. Isto é, instancia variáveis simbólicas
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
Path Condition (PC)
f(int x, int y){if(x = y){
... }else{
... }}
Exemplo 1: Fork
Fork na execução PC1: $a = $b PC2: $a != $b
f($a,$b) produzPC1 = ($a = $b) PC2 = $a != $b
f(int x, int y){if(x = y){
... }else{
... }}
Exemplo 1: Fork
Fork na execução PC1: $a = $b PC2: $a != $b
Nota: Exemplo ilustrativo. Considere chamada de funções, loops, encadeamento de condicionais, e outros operadores relacionais e booleanos.
f(int x, int y){x = x + yif(x = y){ ... }else{ ... }
}
Exemplo 2: Estado simbólico
Fork na execução PC1: $a + $b = $b PC2: $a + $b != $b
Suporte para◦ Métodos Nativos◦ Loop e recursão◦ Indexação de Arrays ◦ Strings◦ Referências
Desafios
fuzzing
Interpretação especial de operadores
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.
Referências
f(T t){if(t == null){
... }
... }
Exemplo 3: Tipo referência
Fork na execução PC1: $t == null PC2: $t != null
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)
Lazy Initialization
foo(String s, String t){ s.equals(t)
}
Exemplo 4: Strings
Operadores da linguagem geram restrições. Por exemplo, equals, indexOf, substring, etc.
Duas opções de tratamento: s e t têm tamanho fixo n. Equivalente a:
foo(int s1, ..., sn, t1, ..., tn) Não assumir tamanho das entradas
Valor simbólico de uma string $a é caracterizado pelo autômato que reconhece a linguagem com todas possíveis strings concretas associadas a $a
Strings e autômatos
f(String s){
s.startWith(“ola ”)
}
Exemplo 5: Valores associados a string s em pontos do programa
l a
Σ*
Σ*
o
Soluções para strings podem ser obtidas com uma
visita no autômato
f(String s){s.startWith(“ola ”)
if (s.endsWith(“ turma”) && s.length() > 9) {
} ...}
Exemplo 5: Valores associados a string s em pontos do programa
o l a
u r m
Σ+
t
a