dart directed automated random testing by patrice godefroid nils klarlund koushik sen
Download
Skip this Video
Download Presentation
DART: directed automated random testing by Patrice Godefroid Nils Klarlund Koushik Sen

Loading in 2 Seconds...

play fullscreen
1 / 28

DART: directed automated random testing by Patrice Godefroid Nils Klarlund Koushik Sen - PowerPoint PPT Presentation


  • 124 Views
  • Uploaded on

DART: directed automated random testing by Patrice Godefroid Nils Klarlund Koushik Sen. Rodrigo Alves Costa [email protected] 22 de Abril de 2008. O Artigo. Directed Automated Random Testing (DART) Apresentado em: PLDI 2005. Objetivo de DART.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' DART: directed automated random testing by Patrice Godefroid Nils Klarlund Koushik Sen' - colton-wise


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
dart directed automated random testing by patrice godefroid nils klarlund koushik sen

DART: directed automatedrandom testingby Patrice Godefroid Nils Klarlund Koushik Sen

Rodrigo Alves Costa

[email protected]

22 de Abril de 2008

o artigo
O Artigo
  • Directed Automated Random Testing (DART)
  • Apresentado em: PLDI 2005

Rodrigo Costa <[email protected]>

objetivo de dart
Objetivo de DART
  • Ferramenta para automatizar geração de testes
    • Gera entradas alternando execução simbólica e aleatória.

Rodrigo Costa <[email protected]>

execu o simb lica
Execução simbólica
  • DIRECIONA o programa em caminhos inexplorados.
    • Geração de novas entradas de maneira a satisfazer path conditions.

a

a

path condition:  a, b 

b

b

b

Rodrigo Costa <[email protected]>

execu o simb lica de test me x y
Execução simbólica de test_me($x, $y)

int double ( int x ) {

return 2 * x;

}

void test_me ( int x, int y ) {

int z = double ( x );

if ( z==y ) {

if ( y == x+10 )

abort(); /* ERRO */

}

}

Rodrigo Costa <[email protected]>

execu o simb lica de test me x y1
Execução simbólica de test_me($x, $y)

int double ( int x ) {

return 2 * x;

}

void test_me ( int x, int y ) {

int z = double ( x );

if ( z==y ) {

if ( y == x+10 )

abort(); /* ERRO */

}

}

2 *$x != $y

2 *$x == $y

$y != $x + 10

$y == $x + 10

Rodrigo Costa <[email protected]>

execu o simb lica de test me x y2
Execução simbólica de test_me($x, $y)

int double ( int x ) {

return 2 * x;

}

void test_me ( int x, int y ) {

int z = double ( x );

if ( z==y ) {

if ( y == x+10 )

abort(); /* ERRO */

}

}

2 *$x != $y

2 *$x == $y

$y != $x + 10

$y == $x + 10

path condition:  2 *$x == $y, $y == $x + 10 

path condition:  2 *$x == $y, $y != $x + 10 

path condition:  2 *$x != $y

Rodrigo Costa <[email protected]>

elementos de uma execu o simb lica
Elementos de uma execução simbólica
  • Componentes de um estado em uma execução simbólica

Path condition – quando é que este caminho é tomado?

Estado simbólico – pode ser visto como a “memória” de uma execução simbólica.

Rodrigo Costa <[email protected]>

problemas para automa o de execu o simb lica
Problemas para automação de execução simbólica
  • Pouco escalável
  • Principal: restrições indecidíveis
  • Proposta de DART
    • Combinar execução simbólica com concreta (escolha de entradas aleatórias).

Rodrigo Costa <[email protected]>

slide10
DART…

1. Automatiza a interface do programa a partir do código-fonte.

2. Geração de um test driveraleatoriamente através da interface.

3. Geração dinâmica de testes, simbolicamente, para direcionar a execução de caminhos alternativos.

  • Juntos: (1) + (2) + (3) = DART

Rodrigo Costa <[email protected]>

exemplo

(1) Extração da interface:

  • parâmetros da função de mais alto nível
  • variáveis globais
  • valores de retorno de funções externas

(2) Geração de um test driver aleatório:

main() {

int tmp1 = randomInt();

int tmp2 = randomInt();

test_me ( tmp1 , tmp2 );

}

Geração de um programa auto-executável

Exemplo

int double ( int x ) {

return 2 * x;

}

void test_me ( int x, int y ) {

int z = double ( x );

if ( z==y ) {

if ( y == x+10 )

abort(); /* ERRO */

}

}

A probabilidade de alcançar abort(), e encontrar o erro, aleatoriamente, é extremamente baixa!

Rodrigo Costa <[email protected]>

passo 3 do dart busca direcionada
Passo (3) do DART: Busca direcionada

main() {

int t1 = randomInt();

int t2 = randomInt();

test_me(t1,t2);

}

int double(int x) { return 2 * x; }

voidtest_me (int x, int y) {

int z = double(x);

if (z==y) {

if (y == x+10)

abort(); /* ERRO */

}

}

Path Condition

Execução Concreta

Execução Simbólica

crie variáveis

simbólicas x, y

x = 36, y = 99

Rodrigo Costa <[email protected]>

passo 3 do dart busca direcionada1
Passo (3) do DART: Busca direcionada

main() {

int t1 = randomInt();

int t2 = randomInt();

test_me(t1,t2);

}

int double(int x) { return 2 * x; }

void test_me (int x, int y) {

int z = double(x);

if (z==y) {

if (y == x+10)

abort(); /* ERRO */

}

}

Path Condition

Execução Concreta

Execução Simbólica

crie variáveis

simbólicas x, y

x = 36, y = 99,

z = 72

z = 2 * x

Rodrigo Costa <[email protected]>

passo 3 do dart busca direcionada2
Passo (3) do DART: Busca direcionada

main() {

int t1 = randomInt();

int t2 = randomInt();

test_me(t1,t2);

}

int double(int x) { return 2 * x; }

void test_me (int x, int y) {

int z = double(x);

if (z==y) {

if (y == x+10)

abort(); /* ERRO */

}

}

Path Condition

Execução Concreta

Execução Simbólica

Resolva: 2 * x == y

Solução: x = 1, y = 2

crie variáveis

simbólicas x, y

2 * x != y

x = 36, y = 99,

z = 72

z = 2 * x

Rodrigo Costa <[email protected]>

passo 3 do dart busca direcionada3
Passo (3) do DART: Busca direcionada

main() {

int t1 = randomInt();

int t2 = randomInt();

test_me(t1,t2);

}

int double(int x) { return 2 * x; }

void test_me (int x, int y) {

int z = double(x);

if (z==y) {

if (y == x+10)

abort(); /* ERRO */

}

}

Path Condition

Execução Concreta

Execução Simbólica

crie variáveis

simbólicas x, y

x = 1, y = 2

Rodrigo Costa <[email protected]>

passo 3 do dart busca direcionada4
Passo (3) do DART: Busca direcionada

main() {

int t1 = randomInt();

int t2 = randomInt();

test_me(t1,t2);

}

int double(int x) { return 2 * x; }

void test_me (int x, int y) {

int z = double(x);

if (z==y) {

if (y == x+10)

abort(); /* ERRO */

}

}

Path Condition

Execução Concreta

Execução Simbólica

crie variáveis

simbólicas x, y

x = 1, y = 2, z = 2

z = 2 * x

Rodrigo Costa <[email protected]>

passo 3 do dart busca direcionada5
Passo (3) do DART: Busca direcionada

main() {

int t1 = randomInt();

int t2 = randomInt();

test_me(t1,t2);

}

int double(int x) { return 2 * x; }

void test_me (int x, int y) {

int z = double(x);

if (z==y) {

if (y == x+10)

abort(); /* ERRO */

}

}

Path Condition

Execução Concreta

Execução Simbólica

crie variáveis

simbólicas x, y

x = 1, y = 2, z = 2

2 * x == y

z = 2 * x

Rodrigo Costa <[email protected]>

passo 3 do dart busca direcionada6
Passo (3) do DART: Busca direcionada

main() {

int t1 = randomInt();

int t2 = randomInt();

test_me(t1,t2);

}

int double(int x) { return 2 * x; }

void test_me (int x, int y) {

int z = double(x);

if (z==y) {

if (y == x+10)

abort(); /* ERRO */

}

}

Path Condition

Execução Concreta

Execução Simbólica

Resolva: (2 * x == y) && (y == x +10)

Solução: x = 10, y = 20

crie variáveis

simbólicas x, y

2 * x == y

y != x + 10

x = 1, y = 2, z = 2

z = 2 * x

Rodrigo Costa <[email protected]>

passo 3 do dart busca direcionada7
Passo (3) do DART: Busca direcionada

main() {

int t1 = randomInt();

int t2 = randomInt();

test_me(t1,t2);

}

int double(int x) { return 2 * x; }

void test_me (int x, int y) {

int z = double(x);

if (z==y) {

if (y == x+10)

abort(); /* ERRO */

}

}

Path Condition

Execução Concreta

Execução Simbólica

crie variáveis

simbólicas x, y

x = 10, y = 20

Rodrigo Costa <[email protected]>

passo 3 do dart busca direcionada8
Passo (3) do DART: Busca direcionada

main() {

int t1 = randomInt();

int t2 = randomInt();

test_me(t1,t2);

}

int double(int x) { return 2 * x; }

void test_me (int x, int y) {

int z = double(x);

if (z==y) {

if (y == x+10)

abort(); /* ERRO */

}

}

Path Condition

Execução Concreta

Execução Simbólica

crie variáveis

simbólicas x, y

x = 10, y = 20, z = 20

z = 2 * x

Rodrigo Costa <[email protected]>

passo 3 do dart busca direcionada9
Passo (3) do DART: Busca direcionada

main() {

int t1 = randomInt();

int t2 = randomInt();

test_me(t1,t2);

}

int double(int x) { return 2 * x; }

void test_me (int x, int y) {

int z = double(x);

if (z==y) {

if (y == x+10)

abort(); /* ERRO */

}

}

Path Condition

Execução Concreta

Execução Simbólica

crie variáveis

simbólicas x, y

x = 10, y = 20, z = 20

2 * x == y

z = 2 * x

Rodrigo Costa <[email protected]>

passo 3 do dart busca direcionada10
Passo (3) do DART: Busca direcionada

main() {

int t1 = randomInt();

int t2 = randomInt();

test_me(t1,t2);

}

int double(int x) { return 2 * x; }

void test_me (int x, int y) {

int z = double(x);

if (z==y) {

if (y == x+10)

abort(); /* ERRO */

}

}

Path Condition

Execução Concreta

Execução Simbólica

Erro encontrado

crie variáveis

simbólicas x, y

2 * x == y

x = 10, y = 20, z = 20

z = 2 * x

y == x +10

Rodrigo Costa <[email protected]>

resumo do funcionamento de dart
Resumo do funcionamento de DART
  • Geração dinâmica de testes para direcionar a execução dos diversos caminhos do código.
    • Coleta restrições simbólicas em branches. Caminhos não percorridos são armazenados para próximas execuções.
    • Utiliza provadores de teorema em novos PC para gerar novas entradas. Quando não consegue, chuta valores aleatórios.
    • A próxima execução é orientada pelas novas entradas para explorar o branch alternativo.
    • Verifica por meio de instrumentação dinâmica se um determinado branch foi, de fato, explorado.

Rodrigo Costa <[email protected]>

resultados
Resultados
  • Protocolo de autenticação NS (Needham-Schroeder)
    • Cerca de 400 linhas de código C, em um P-III 800Mhz rodando Linux.
    • DART demorou menos de 2 s (664 tentativas) para descobrir uma vulnerabilidade.
    • Em contrapartida, o VeriSoft (model checker) não achou o problema.
  • Biblioteca oSIP (Open Source SIP)
    • 30.000 linhas de código, 600 funções públicas.
    • DART encontrou erros em 65% das funções em menos de 1.000 tentativas.
    • A maioria destes erros eram decorrentes da ausência de verificação em ponteiros.

Rodrigo Costa <[email protected]>

conclus es
Conclusões
  • Totalmente automatizado
    • Extrai a interface, gera os test drivers e os stubs
  • Tenta explorar todos os caminhos
    • Busca aleatória
    • Busca direcionada
  • Duas limitações principais:
    • Provadores de teorema.
    • Possibilidade de nunca terminar (path explosion).
      • Solução: SMART (DART escalável)
  • Exemplos de implementação do DART
    • Bell labs – versão do paper
    • CUTE (UIUC)
    • “Execution-generated tests” (Stanford)

Rodrigo Costa <[email protected]>

backup
BACKUP

Rodrigo Costa <[email protected]>

arquitetura dart para c
Arquitetura (DART para C)

prgm.c

CIL (Berkeley)

dart

(OCaml, C)

test_driver.c

prgm_instrumented.c

Compilador

prgm.exe

dart.c

3 possíveis saídas:

  • Erro encontrado
  • Cobertura completa
  • Loop infinito…

provador de

teorema

Rodrigo Costa <[email protected]>

ad