Fiabilidade dos Sistemas Informáticos



Documentos relacionados
Proof-Carrying Code Usando Cálculo de Hoare

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá.

Informática II Cap. 3

Instituto Superior Politécnico de VISEU. Escola Superior de Tecnologia

AULA TEÓRICA 10 Tema 9. Introdução à programação. Desenho de Algoritmos

Renata de Freitas e Petrucio Viana. IME, UFF 12 de março de 2015

CAP. I ERROS EM CÁLCULO NUMÉRICO

Programação Funcional. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2015.

Metodos de Programação

Sintaxe e Semântica. Fases da Compilação. programa fonte

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto

Computação Fiável. 1 Novidades. Conteúdo. Departamento de Informática Universidade da Beira Interior. Ano lectivo 2007/2008

2. ALGORITMOS. Unesp Campus de Guaratinguetá. Curso de Programação Computadores Prof. Aníbal Tavares Profa. Cassilda Ribeiro

Geração de código intermediário. Novembro 2006

Conceitos básicos de programação

PROGRAMAÇÃO JAVA. Parte 1

Dadas a base e a altura de um triangulo, determinar sua área.

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Os objetivos indicados aplicam-se a duas linguagens de programação: C e PHP

Geração de código. Ivan Ricarte INTRODUÇÃO À COMPILAÇÃO

Um compilador é um programa que lê um programa escrito numa dada linguagem, a linguagem objecto (fonte), e a traduz num programa equivalente

Programação. Folha Prática 3. Lab. 3. Departamento de Informática Universidade da Beira Interior Portugal Copyright 2010 All rights reserved.

Projeto e Análise de Algoritmos. Profa. Juliana Kaizer Vizzotto. Projeto e Análise de Algoritmos - Aula 1

5. Métodos ágeis de desenvolvimento de software

Licenciatura em Engenharia Informática Sistemas Distribuídos I 2ª chamada, 6 de Julho de º Semestre, 2004/2005

Computabilidade 2012/2013. Sabine Broda Departamento de Ciência de Computadores Faculdade de Ciências da Universidade do Porto

Grupo de trabalho sobre a protecção das pessoas singulares no que diz respeito ao tratamento de dados pessoais. Recomendação 1/99

Tarefa Orientada 13 Agrupamento e sumário de dados

Algoritmos e Linguagem de Programação I

Variáveis e estruturas de controlo. Introdução à Programação André L. Santos

Análise de complexidade

Folha Prática 2. Lab. 2

1.1. Organização de um Sistema Computacional

Algoritmos e Pseudocódigo

COMPILADORES E INTERPRETADORES

OBI2009 Caderno de Tarefas

As fases na resolução de um problema real podem, de modo geral, ser colocadas na seguinte ordem:

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

Arquiteturas RISC. (Reduced Instructions Set Computers)

Gestão do Risco e da Qualidade no Desenvolvimento de Software

1 Descrição do Trabalho

Informática I. Aula 5. Aula 5-13/05/2006 1

OBI2014 Caderno de Tarefas

Apostila de Fundamentos de Programação I. Prof.: André Luiz Montevecchi

Resolução de problemas e desenvolvimento de algoritmos

Sistemas Distribuídos: Princípios e Algoritmos Introdução à Análise de Complexidade de Algoritmos

Processos de Software

PROGRAMAÇÃO DE MICROPROCESSADORES 2011 / 2012

Faculdade Alagoana de Administração FAA Ciência da Computação. (Resolução de Problemas em) Espaço de Estados

TÉCNICAS DE PROGRAMAÇÃO

6.3 Equivalência entre Autômatos com Pilha Não-Determinísticos e Gramáticas Livre do Contexto

Estruturas de Repetição

Curso Técnico em Redes

Introdução à Programação

Figura 1 - O computador

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi

Programação de Computadores I Pseudocódigo PROFESSORA CINTIA CAETANO

CAPÍTULO 6 - ESTRUTURA DE SELEÇÃO

OBI2014 Caderno de Tarefas

SISTEMAS DE INFORMAÇÃO PARA GESTÃO

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO

Comandos Sequenciais if else, e Switch

ARQUITETURA DE COMPUTADORES

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Engenharia de Software III

Pontifícia Universidade Católica do Rio Grande do Sul Faculdade de Informática Organização e Arquitetura de Computadores

Programação de Computadores III

Álgebra Booleana. Introdução ao Computador 2010/01 Renan Manola

Teoria da Computação Linguagens e Expressões Regulares, Autómatos de Estados Finitos

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

Tópicos em Engenharia de Software (Optativa III) AULA 2. Prof. Andrêza Leite (81 )

Algumas vantagens da Teoria das Descrições Definidas (Russel 1905)

UNIVERSIDADE FEDERAL DE SANTA MARIA CENTRO DE TECNOLOGIA AULA 14 PROFª BRUNO CALEGARO

Conjunto de instruções do CPU. Arquitectura de um computador. Definição das instruções (1) Definição das instruções (2)

Unidade II MODELAGEM DE PROCESSOS

Lógica Proposicional

Lógica Computacional

Introdução. Aulas. ltodi.est.ips.pt/es. Detalhes administrativos Definição de engenharia de software Contexto Relação com outras áreas e disciplinas

Pipeline. Todos os estágios devem estar prontos ao mesmo tempo para prosseguir.

Modelagem no Domínio do Tempo. Carlos Alexandre Mello. Carlos Alexandre Mello 1

Trabalho de Implementação Jogo Reversi

Análise de Sistemas. Conceito de análise de sistemas

ARQUITECTURAS DE SOFTWARE

Projetos. Universidade Federal do Espírito Santo - UFES. Mestrado em Informática 2004/1. O Projeto. 1. Introdução. 2.

Introdução a Algoritmos Parte 04

1 INTRODUÇÃO 1.1 CONCEITO DE PARADIGMAS DE LINGUAGEM DE PROGRAMAÇÃO PARADIGMAS DE LINGUAGEM DE PROGRAMAÇÃO

Computadores de Programação (MAB353)

1. NÍVEL CONVENCIONAL DE MÁQUINA

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE. Modelos de Processo de Desenvolvimento de Software

A Linguagem Algorítmica Estrutura de Repetição. Ex. 2

O Problema do Troco Principio da Casa dos Pombos. > Princípios de Contagem e Enumeração Computacional 0/48

Computação Paralela. Desenvolvimento de Aplicações Paralelas João Luís Ferreira Sobral Departamento do Informática Universidade do Minho.

Nesta aula... Analisamos na ultima aula a evolução e caraterísticas de computadores e linguagens de programação. Nesta aula iremos ver:

Introdução à Programação B 2007/08

computador-cálculo numérico perfeita. As fases na resolução de um problema real podem, de modo geral, ser colocadas na seguinte ordem:

COMPUTAÇÃO e PROGRAMAÇÃO

Engenharia Informática

Arquitecturas de Software Licenciatura em Engenharia Informática e de Computadores

Transcrição:

Fiabilidade dos Sistemas Informáticos Verificação de Programas Imperativos Lógica de Hoare e outros métodos baseado em Pré/Pós-Condições e Invariantes Simão Melo de Sousa Computer Science Department University of Beira Interior, Portugal 2005-2006

Outline 1 Introdução 2 3 Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática 4 5 6 Programas e asserções Programa anotado correctamente Metodologia para a demonstração de programas imperativos 7

Plano 1 Introdução 2 3 4 5 6

Lógica de Floyd-Hoare: Origens Robert W. Floyd. Assigning meaning to programs. In Proc. Symp. in Applied Mathematics, volume 19, 1967. C. A. R. (Tony) Hoare. An axiomatic basis for computer programming. Communications of the ACM, 12 (10): 576-585. October 1969. Edsger W. Dijkstra, Guarded command, nondeterminacy and formal derivation of programs. Communication of the ACM, 18 (8):453-457, August 1975. Referência principal para estes apontamentos: J-F. Monin. Understanding Formal Methods. Springer Verlag, 2002. Objectivo Permitir a demonstração de correcção de programas imperativos. um estado lógico = conjunto de valores de interesse para um programa ideia: ver cada componente do programa analizado como um modificador de estados lógicos. = Cada programa tem um comportamento lógico particular que se pode comprovar

Relação entre estado lógico e programas Programar... 1 O quê? Descrição da tarefa por realizar, do problema por resolver. 2 Como? O algoritmo, Descrição do método de resolução 3 A realização: o programa em si, concretização do método Necessidade de comprovar que o algoritmo (podem existir vários) e, mais ainda, a própria implementação resolvem o problema proposto. Assim sendo: Estado lógico: Especificação lógica do comportamento e das relações entre os dados manipulados. Semântica, em termos lógicos, do programa. Lógica de Hoare (e afins): método/enquadramento para comprovar a adequação do comportamento de programas com as suas especificações lógicas (que devem modelar problemas e algoritmos).

Plano 1 Introdução 2 3 4 5 6

A linguagem While Para ilustrar de uma forma simples mas completa o conceito de lógica de Hoare vamos introduzir uma linguagem de estudo: a linguagem While, sobre a qual estudaremos os mecanismos de anotação, asserção e demonstração. Sintaxe BNF operadores op ::= + / mod expressões e ::= n x x[e] e op e condições c ::= e e > e e = e e!= e e >= e!(c) c&c c c instruções i ::= skip x := e (c)?s : S while(c){s} sequências S ::= i; S {S}

Plano Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática 1 Introdução 2 3 Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática 4 5

Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática Triplos de Hoare Um triplo de hoare é {P} S {Q} Onde S é um programa while e P e Q são predicados sobre as variáveis de S. P: Pre-Condição Q: pós-condição Semântica Informal: Se a execução de S é iniciada num estado lógico em que P é verificado então esta execução conduz a um estado lógico verificando Q

Conceitos de Base Exemplos Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática {x = 29} x:= x + 1 {x > 20} {x + 1 = 30} x:= x + 1 {x = 30} {x 0}?(x<0)x:=-x:x:=x {x > 0} {m n} x := (m+n)/2 {m x n} Variáveis while e variáveis lógicas No triplo {x + 1 = 30}x:= x + 1{x = 30} a variável x de x + 1 = 30 é uma variável lógica (cujo valor é imutável) a variável x de x := x + 1 é uma variável informática (representa um espaço mémoria cujo conteúdo pode mudar) logo, o x da pre-condição representa um valor que não é o valor do x da pós-condição: o valor presente no espaço memória x da instrução antes da sua execução.

Conceitos de Base Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática Exemplos {x = 29} x:= x + 1 {x > 20} {x + 1 = 30} x:= x + 1 {x = 30} {x 0}?(x<0)x:=-x:x:=x {x > 0} {m n} x := (m+n)/2 {m x n} Triplos precisos Para um determinado programa S, existem muitos pares (P, Q) tais que {P} S {Q}. No entanto nem todos esses pares têm interesse. Os triplos {P} S {Q} considerados pertinentes são tais que P seja o mais fraco possível e Q o mais forte possível. (A é mais fraco do que B ou B mais forte do que A, se B = A )

max Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática { x N y N z N}?(x>y)z:=x:z:=y { (x > y = z = x) (x y = z = y)} ou ainda { x N y N z N}?(x>y)z:=x:z:=y { (x z y z ( t N, (x t y t) = z t)))} Par Seguinte { x N x = x 0 }?(x mod 2 = 0)x:=x+2:x:=x+1 { x > x 0 z N, (z > x 0 ((par z)) = x z)}

Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática Multiplicação {a, b N b > 0} res:=0; i:= 0; while (i!=b) {i:=i+1; res := res + a} {res = a i i = b} Maior Elemento {N N N > 0} res:=a[0]; i:=1; while (i<=n) {?(a[i]>res)res:=a[i]:skip; i:=i+1;} {N N N > 0 x {0 N}, res a[x]}

Demonstrar {P} I 1 ; I 2 ; ; I n {Q} Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática Uma solução: Encontrar as condições intermédias P 1 P n 1 tais que de P se possa chegar a Q passo a passo. {P} I 1 {P 1 }. I n 1 {P n 1 } I n {Q} Para tal... É preciso determinar para cada elemento da linguagem como a pré e a pós condição se interligam.

Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática Regras de Inferências w R = P {P} S {Q} {R} S {Q} s Q = R {P} S {R} {P} S {Q} skip {P} skip {P} := {P(e)} x := e {P(x)} ; {P} i {R} {P} i; S {Q} {R} S {Q}?: {P e} S t {Q} {P e} S e {Q} {P}?(e)S t; S e {Q} while {I e}s{i } {I } while(e)s {I e} while wf I e = v N {I e v = v 0 }S{I v 0 > v} {I } while(e)s {I e}

Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática Correcção Parcial vs. Correcção Total Ciclos e Problema da Terminação Existem duas regras (while e while wf ) para estruturas cíclicas. Porquê? A regra while não se pronuncia sobre quando a condição e deixará de ser verdade = Correcção Parcial: se terminar então o estado final satisfaz a pós-condição A regra while wf explicita um valor inteiro que decresce a cada interação: Iteração bem fundada = Correcção Total: a iteração termina e a sua execução leva a um estado final que satisfaz a pós-condição

Demonstração: Nova Perspectiva Mesmo Objectivo: {P} I 1 {P 1 }. I n 1 {P n 1 } I n {Q} Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática Mas: Fazer bom uso das duas primeiras regras Para uma instrução I j, uma pré-condição P e um pós-condição Q, definir dois predicados A e B tais que se verifiquem: Sugere: {A} I j {B}, B = Q (i.e. regra s), P = A (i.e. regra w). 1 começar da pós-condição e subir até a pré-condição. De P calcular os sucessivos P i até ao fim (i.e. até P n) e demonstrar então que P n = Q 2 começar da pré-condição e descer até a pós-condição. De Q calcular os sucessivos Q i até ao início (i.e. até Q n) e demonstrar então que P = Q n

Demonstração: Nova Perspectiva Ou seja: Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática Weakest Pre condition Calculus {P} Confrontar P e P 0 {P 0 } I 1 {Q 1 } Confrontar Q 1 e P 1 {P 1 } I 2 {Q 2 } Confrontar Q 2 e P 2 {P 2 }. I n 1 {Q n 1 } Confrontar Q n 1 e P n 1 {P n 1 } I n {Q n} Confrontar Q n e Q {Q} Strongest Post Condition Calculus

Complementos: caso do cíclo Conceitos de Base Exemplos Demonstrar a Correcção Semântica Axiomática Ou seja: Como provar que {P} while(b)s{q} P Descobrir um predicado I chamado I Invariante e uma medida estritamente while(b) descrescente v ( o variante ver acetato {I C (v = v correcção total vs parcial), tais que 0 )} S P = I, {I (v < v I B = Q, 0 )} ; I B = v N, {I C} {I C (v = v 0 )}S{I (v < v 0 )}, Q Desafio = encontrar o bom invariante

Plano 1 Introdução 2 3 4 5 6

Automatização do Processo Ascendente wp : weakest pre-condition calculus (Dijkstra) wp(x := e, Q) = Q[x := e] wp(skip, Q) = Q wp(s; T, Q) = wp(s, wp(t, Q)) wp(?(b)s : T, Q) = (B = wp(s, Q)) ( B = wp(t, Q))) wp(while((b){{i, v}s}, Q) = I (I B = wp(s, I )) (I B = Q) (I = v N) (I B v = v 0 = wp(s, v < v 0 ))

Plano 1 Introdução 2 3 4 5 6

Troca {x = x 0, y = y 0 } t:=x; {t = x 0, y = y 0 } {t = x 0, y = y 0 } x:=y; {t = x 0, x = y 0 } {t = x 0, x = y 0 } y:=t; {x = y 0, y = x 0 } ; := {t = x0, y = y 0 } x := y; {t = x 0, x = y 0 } {t = x 0, y = y 0 } x := y; y := t; {y = x 0, x = y 0 } := {t = x0, x = y 0 } y := t; {y = x 0, x = y 0 } ; := {x = x0, y = y 0 } t := x; {t = x 0, y = y 0 } {t = x 0, y = y 0 } x := y; y := t; {y = x 0, x = y 0 } {x = x 0, y = y 0 } t := x; x := y; y := t; {x = y 0, y = x 0 }

Par Seguinte {(x = x 0 ) (x N)} {(x = x 0 ) (x N)}?(x mod 2 = 0) {(x = x 0 ) (x N) (par x)} = {(par x + 2) (x + 2 > x 0 )} x:=x+2; {(par x) (x > x 0 )} : {(x = x 0 ) (x N) (par x)} = {(par x + 1) (x + 1 > x 0 )} x:=x+1; {(par x) (x > x 0 )} {(par x) (x > x 0 )} {(par x) (x > x 0 )}

Max {(x, y, z N) (x = x 0 ) (y = y 0 )} {(x = x 0 ) (x N)}?(x < y = 0) {(x, y, z N) (x = x 0 ) (y = y 0 ) (x > y)} = {(x 0 > y 0 = x = x 0 ) (x 0 y 0 = z = y 0 )} z:=x; {(x 0 > y 0 = z = x 0 ) (x 0 y 0 = z = y 0 )} : {(x, y, z N) (x = x 0 ) (y = y 0 ) (x y)} = {(x 0 > y 0 = z = x 0 ) (x 0 y 0 = y = y 0 )} z:=y; {(x 0 > y 0 = z = x 0 ) (x 0 y 0 = z = y 0 )} {(x 0 > y 0 = z = x 0 ) (x 0 y 0 = z = y 0 )} {(x 0 > y 0 = z = x 0 ) (x 0 y 0 = z = y 0 )}

Multiplicação {(a, b N) (b > 0)} {0 = a 0} res:=0; {res = a 0} {res = a 0} i:= 0; {res = a i} {res = a i} while (i!=b) { {(res = a i) (i b)} {(res + a = a (i + 1))} i:=i+1; {(res + a = a i)} {(res + a = a i)} res := res + a; {(res = a i)} } {(res = a i) ( i b)} {(res = a b)}

Pesquisa em Tabela (J.F. Monin) {(p, q N) (p q) (P {p q 1})} x:=p;y:=q; while (x!=y) {p x < q}?(p x)y:=x; : x:=x+1; {x N (p x q) (x < q = (P x)) ((x = q) = ( i N, p i < q = (P i)))} variante: y x Invariante: I 1 I 2 I 3 onde I 1 = x, y N p x y q Domínio de x e de y I 2 = i N, p i < x = (P i) I 3 = y < q = (P x)

Plano Programas e asserções Programa anotado correctamente Metodologia para a demonstração de programas imperativos 1 Introdução 2 3 4 5 6 Programas e asserções

Programas e asserções Programa anotado correctamente Metodologia para a demonstração de programas imperativos O conceito de Base Permitir que o programador comente o seu código com anotações/asserções de comporamento. Caso simples: uma anotação no início e uma no fim. Caso elaborado: todas as anotações formando a prova em lógica de Hoare é preciso saber encontrar o bom nível de detalhe. Em geral, o caso simples + invariantes (i.e. anotações nos pontos difíceis do programa). estas anotações podem ser vistas como um resumo da demonstração de correcção do programa

Programas e asserções Programa anotado correctamente Metodologia para a demonstração de programas imperativos Anotação e Correcção Dis-se que um programa é anotado correcto quando as asserções que contém são demonstráveis (na lógica de Hoare). Duma certa forma quando o resumo descrto pelas asserções corresponde realmente a uma demonstração. Ou seja, quando: 1 De cada vez que um triplo {P} S {Q} aparece no programa anotado, existe uma demonstração em lógica de Hoare; 2 Cada vez que duas asserções {P} e {Q} são seguem (são contíguas) no programa anotado, então temos P = Q Asim podemos mostrar que qualquer programa anotado correcto corresponde a uma demonstração em Lógica de Hoare (e reciprocamente)

Programas e asserções Programa anotado correctamente Metodologia para a demonstração de programas imperativos anotações + wp escrever um programa contendo anotações em pontos estratégicos (pré e pós condições gerais mais invariantes nos ciclos e anotações em pontos difíceis do programa); transmitir o código anotado a uma ferramenta verifica a correcção das anotações. Por exemplo a uma ferramenta que gera todas fórmulas P = wp(s, Q) para cada triplo {P} S {Q} (Chamadas Condições de Verificação); Demonstrar estas condições de verificação.

Plano 1 Introdução 2 3 4 5 6

Anotações, porquê? Conceito na base de muitos métodos formais Caso de sucesso: linguagem EIFFEL Linguagens de anotações: JML para o Java (http://www.cs.iastate.edu/ leavens/jml), Spec Como verificar por computador as anotações? 1 em tempo de execução (asserções como um mecanismo particular de excepções). Veja por exemplo o mecanismo assert presente em várias linguagens (C, OCaml incluido) 2 automaticamente: Model Checking, Analizadores estáticos (ESC/JAVA, etc...). 3 demonstração assistida: Jack, Caduceus/Krakatoa/Why, LoopTool, KeyTool