Tópicos em Engenharia de Software II Fernando Castor Profa.: Eliane Martins 1 Roteiro Introdução e Objetivos Técnica 1: Cálculo de Refinamentos Técnica 2: Árvore de Falhas Conclusões 2 Roteiro Introdução e Objetivos Técnica 1: Cálculo de Refinamentos Técnica 2: Árvore de Falhas Conclusões 3 Introdução Nos dias atuais, sistemas de software são empregados em praticamente todos os ramos de nossa sociedade Complexidade desses sistemas aumenta a cada dia Cada vez mais, requisitos de dependability são exigidos 4 Introdução (cont.) Dependability envolve diversos fatores: Confiabilidade (reliability) Segurança contra acidentes (safety) Disponibilidade (availability) Segurança contra intrusão (security) 5 Introdução (cont.) Dependability envolve diversos fatores: Confiabilidade (reliability) Segurança contra acidentes (safety) Disponibilidade (availability) Segurança contra intrusão (security) 6 Confiabilidade “The probability that a system will perform its intended function for a specified period of time under a set of specified environmental conditions” Nancy G. Leveson Um sistema é confiável se ele se comporta de acordo com sua especificação 7 Objetivos Apresentar uma técnica para assegurar confiabilidade e outra para analisar segurança contra acidentes Através de uma mesma aplicação exemplo: algoritmo BubbleSort A segunda técnica será usada para analisar a confiabilidade do exemplo, devido à sua simplicidade Ressaltar as vantagens e desvantagens de cada técnica, com relação ao estudo de caso 8 Roteiro Introdução e Objetivos Técnica 1: Cálculo de Refinamentos Técnica 2: Árvore de Falhas Conclusões 9 Refinamento Se um programa prog2 é melhor que um programa prog1, dizemos que prog2 refina prog1, ou prog1 prog2 Exemplos: Algoritmos de ordenação: inteiros e números de ponto flutuante ou apenas inteiros? Altímetro de um avião: faixa de valores ou valor preciso? 10 Cálculo de Refinamentos Conjunto de leis que visam produzir programas confiáveis a partir de uma especificação formal Código produzido através do uso dessas leis garantidamente implementa a especificação Baseado no cálculo de predicados Especificações são programas que não podem ser executados por um computador: x :[pre, pos] Programas executáveis = código 11 Refinamento de Programas Exemplo: x:[ x > 0 ^ x|2, x > 100] x:[ x > 0, x = 101] ou x:[x > 100 ^ x < 120] Pré-condições são enfraquecidas Pós-condições são fortalecidas 12 Algoritmo BubbleSort m := #as; do !(m = 0) { n := 0; do !(n = m – 1) { if(as[n] > as[n+1]) { swap(as[n], as[n+1]) } else { skip } n := n + 1 }; m := m - 1 } 13 Especificação do BubbleSort var as:seqNZ; con A; and A = bag as as:[ i, j : 0 # as i j as[i] as[ j ] ] 14 Refinamento (1) post i, j : 0 # as i j as[i ] as[ j ] var as :seq N Ζ; con A; and A bag as as : [ post] 6.1 | [varn, m : N; and n # as n m m # as m, n, as[ post] ]| 15 Refinamento (2) 3 .3 INV1 (i, j : m # as i j as[i ] as[ j ]) (m # as l : 0 m as[m] as[l ]) m, n, as : [ INV1 ]; m, n, as : [ INV1 , post] 1. 3 m : # as Obrigação de P rova: pre pos[m \# as] 16 Refinamento (3) 5 .1 m, n, as : [ INV1 , INV1 m 0]; Obrigação de P rova: pre[m, n, as \ m0 , n0 , as0 ] pos' pos 5 .5 do m 0 m, n, as : [m 0 INV1 , INV1 0 m m0 ]; od 17 Código resultante: m :# as; do m 0 n : 0; do n m 1 if(as[n] as[n 1]) swap(as[n], as[n 1]) as[n] as[n 1] skip fi; n : n 1 od m : m 1 od 18 Características da Técnica Vantagens: O código gerado garantidamente atende à especificação Desvantagens: Trabalho muito grande é necessário para realizar o refinamento Não garante a corretude da especificação 19 Roteiro Introdução e Objetivos Técnica 1: Cálculo de Refinamentos Técnica 2: Árvore de Falhas Conclusões 20 Algoritmo BubbleSort (versão implementada) int m = as.length-1; int n = 0; while(0<m) { while(n<m) { if(as[n] > as[n+1]) { int t = as[n+1]; as[n+1] = as[n]; as[n] = t; } n++; } n=0; m--; } return as; 21 Árvore de Falhas para o BubbleSort Array desordenado OR While externo não executado While externo executado m vezes 1. m 0 na primeira iteração 2. 0 as.length 1 3. Se as.length = 0, não há elementos para ordenar 4. Se as.length = 1, o array está ordenado 5. Contradição (...) 22 Árvore de Falhas para o BubbleSort (2) (...) AND 0<m antes o while externo Um sub-conjunto das iterações não ordena o array corretamente (...) 23 Árvore de Falhas para o BubbleSort (3) (...) OR While interno não executado 1. m n, na primeira iteração While interno executado m-1 vezes para cada valor de m 2. n = 0, na primeira iteração 3. 0 < m 4. Por 2 e 3, n < m, na primeira iteração (...) 5. Por 1 e 4, Contradição (se o laço mais externo é executado pelo menos uma vez, o mais interno também é) 24 Árvore de Falhas para o BubbleSort (4) (...) AND n<m antes o while interno Um sub-conjunto das iterações não coloca o maior elemento de as[0..m] na posição m (...) 25 Árvore de Falhas para o BubbleSort (5) (...) OR (...) Primeira iteração: (n-1)-ésima iteração: n = 0 ^ v[0] > v[1] => swap(v[0], v[1]) n > 0 ^ v[n] > v[m] => swap(v[n], v[m]) Indutivamente, percebe-se que a situação Um sub-conjunto das iterações não (...) não ocorre Primeira iteração: n > 0 ^ v[n] < v[m] => skip 26 Características da Técnica Vantagens: Pode ser usada tanto para analisar confiabilidade quanto segurança contra acidentes Mais fácil de aplicar e entender do que uma técnica inteiramente formal Representação gráfica Desvantagens: Não garante a corretude da especificação Pouco empregada, no contexto de software Não provamos que o programa atende à especificação 27 Roteiro Introdução e Objetivos Técnica 1: Cálculo de Refinamentos Técnica 2: Árvore de Falhas Conclusões 28 Conclusões Técnicas que analisar e garantir confiabilidade e segurança contra acidentes são importantes, mas caras Suporte de ferramentas pode amenizar esse custo Técnicas formais são extremamente trabalhosas Árvores de falhas são mais práticas, mas fornecem menos garantias 29 Referências T. Anderson e P. A. Lee. Fault Tolerance: Principles and Practice. Prentice-Hall, 2a edição, 1990. S. Coutinho, T. Reis e A. L. Cavalcanti. Uma ferramenta educacional de refinamentos. Anais do XIII Simpósio Brasileiro de Engenharia de Software - Sessão de Ferramentas, páginas 61-64, 1999. N. Leveson. Software Safety: Why, What and How. ACM Computing Surveys, 18(2):125-164, junho 1986. C. Morgan. Programming from Specifications. Prentice-Hall, 2a edição, 1998. J. D. Reese e N. Leveson. Software Deviation Analysis: A “Safeware” Technique. 1996 Safeware Engineering Corporation. Verification of Safety. Disponível para download em http://www.safeware-eng.com. 30