Métodos Formais em Engenharia de Software |
---|
Cálculo de Sistemas de Informação |
Programação Ciber-física |
Verificação Formal |
Calendário | Sumários |
Anos anteriores |
Alumni |
Comece por experimentar e solucionar os 11 primeiros exemplos discutidos nos slides.
Resolva agora os seguintes exercícios.
Considere o seguinte código (disponivel no ficheiro change_init.c
)
void change(int *a, int *b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
Escreva em ACSL um contrato para esta função.
Prove a segurança da função e sua correção face ao contrato que definiu. Use para isso os plugins WP e RTE do Frama-C.
Escreva uma função main
que chame esta função e verifique-a.
A função negs
testa se um array tem valores negativos, devolvendo 0 caso tenha.
int negs(int A[], int N);
Defina um contrato ACSL que descreva de forma precisa o comportamento desta função.
Escreva a definição da função e comprove sua segurança e correção funcional face ao contrato que definiu.
Escreva a seguinte função main
anotada e verifique-a. Analize os resultados obtidos e acrescente as anotações necessárias para completar a prova com sucesso.
void main(void){
int a[10];
int b[5] = {3,4,8,3,7};
int c[5] = {2,4,-28,3,-17};
int i;
i = negs(b,5);
//@ assert i!=0;
//@ assert i==1;
i = negs(c,5);
//@ assert i==0;
for(i=0; i<10; i++)
a[i] = i*3;
i = negs(a,10);
//@ assert i!=0;
}
A função minarray
devolve o índice em que está o menor valor do array.
int minarray(int A[], int N);
Defina um contrato ACSL que descreva de forma precisa o comportamento desta função.
Escreva a definição da função e comprove sua segurança e correção funcional face ao contrato que definiu.
Escreva uma função main
que invoque esta função e verifique-a.
A função equal_seg
testa se o segmento [a..b] de dois arrays são iguais.
int equal_seg(int A[], int B[], int a, int b, int N);
Defina um contrato ACSL que descreva de forma precisa o comportamento desta função.
Escreva a definição da função e comprove sua segurança e correção funcional face ao contrato que definiu.
Escreva uma função main
que invoque esta função e verifique-a.
A função where
retorna uma posição do array onde o valor guardado é x
. Caso o array não contenhas nenhum valor x
retorna -1.
int where(int A[], int N, int x);
Comece por definir em ACSL o predicado belongs(x,A,n)
que testa se o inteiro x
pretence ao array A
de tamanho n
.
Usando o mecanismo de behaviors
do ACSL defina um contrato que descreva de forma precisa o comportamento da função where
.
Implemente a função e comprove sua segurança e correção funcional face ao contrato que definiu.
Escreva uma função main
que invoque esta função e verifique-a.