Manual Tecnico Blast

19
7/23/2019 Manual Tecnico Blast http://slidepdf.com/reader/full/manual-tecnico-blast 1/19 MANUAL DE USUARIO 0 Manual técnico Model checker

Transcript of Manual Tecnico Blast

Page 1: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 1/19

MANUAL DE USUARIO 0

Manual técnico

Model checker

Page 2: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 2/19

MANUAL DE USUARIO 1

Índice

Introducción ........................................................................................................................................ 2

Software a validar .......................................................................................................................... 2

Comando de ayuda ......................................................................................................................... 2

P ASOS A I NSTALAR ............................................................................................................................. 3

¿Qué es el OCalm? .............................................................................................................................. 4

Ejemplos del BLAST ........................................................................................................................... 4

Código del programa .......................................................................................................................... 5

Page 3: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 3/19

MANUAL DE USUARIO 2

Introducción

BLAST (Berkeley Lazy Abstraction S oftware verification Tool) es una verificación automática de laherramienta para comprobar temporal de las propiedades de seguridad de los programas en C. Dadoun programa en C y temporal de la seguridad de la propiedad, la Explosión de estática demuestraque el programa satisface la seguridad de la propiedad, o proporciona una ruta de ejecución quepresenta una violación de la propiedad (o, ya que el problema es indecidible, no se termina). Laexplosión de construcciones, explora, y refina las abstracciones del estado del programa espaciobasado en lo perezoso predicado de la abstracción y de interpolación basado predicadodescubrimiento.

Se habla de este model checker para hacer pruebas ya que se necesitan muchas instalaciones paraque se pueda correr bien en el computador y la iniciativa de este manual es para que los podremos

instruir que requisitos necesita su computador para que pudiese funcionar de manera perfecta yhacer chequeo de sus pruebas de sus programas.

Software a validar

PROGRAMA: “ Problema del viajero ”

Este programa puede hacer aproximaciones para encontrar la ruta mas corta en base a intercambiossimples entre dos puntos o por medio de invertir el sentido de una parte del recorrido.

Las ciudades son distribuidas a lo largo de una circunferencia de radio igual a 1, por lo tanto el costofinal esperado debe de ser un valor cercano a 2*pi.

Comando de ayuda

Ayuda : Muestra este archivo.

Guarda : Le indica el programa que debe de guardar los datos de las ciudades en un archivo(Guarda el ángulo y las coordenadas). La extensión del archivo debe ser .dat

Iniciar : Inicia la búsqueda de mejores rutas.

Muestra : Muestra los datos de las ciudades.

Pesos : Muestra los costos entre cada ciudad.

Tour : Muestra cada nuevo tour encontrado. Los nuevos recorridos se muestran durante labúsqueda de rutas

Salir : Termina la ejecución del programa.

Page 4: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 4/19

MANUAL DE USUARIO 3

Requisitos del sistema

La aplicación funciona hasta en un ordenador simple pero el procesamiento será algo lento,prácticamente con cualquier sistema operativo. Aun así dispone de ciertos requerimientos. Dichosrequerimientos se fundamentan principalmente en que se ha implementado mediante el lenguaje deprogramación C ya que necesita de una tipo terminal como la que utiliza Linux ya que es la parteesencial de este model checker que necesita.

PASOS AINSTALAR 1. Descargar BLAST de la fuente de distribución.

2. Descomprimir y desempaquetar el código fuente de distribución. Esto creará un directoriollamado blast-2.4 cuya estructura se explica a continuación.

tar xvfz blast-2.4.tar.gz

3. Entrar al directorio blast-2.4/explosión y ejecutar GNU Make para compilar la distribución . cd blast-2.4/blast

make distcleanmake

4. Ahora debe encontrar los ejecutables pblast.opt y spec.opt en el directorio bin. Estos sonenlaces simbólicos a los archivos del mismo nombre en el directorio psrc y especificaciones,respectivamente.

El ejecutable pblast.opt es Blast model checker, el ejecutable de spec.opt es laespecificación instrumentada.

5. También debe descargar e instalar el Simplify Theorem Prover . Esto implica la colocaciónde los archivos ejecutables Simplify (Linux) o Simplify.exe (Windows) en el directorio bin. Además, Blast tiene interfaces con el Cvc Theorem de Prover, si usted desea instalar yutilizar esta herramienta para el theorem prover de llamadas.

De nuevo, esto implica poner el ejecutable para la Cvc en el directorio bin. Tenga en cuentaque en el orden del Blast para el uso de Simplificar o Cvc, el archivo ejecutable paraSimplificar y Cvc debe estar en la ruta de acceso actual. Es una buena idea añadir laExplosión bin del directorio a la ruta de acceso.

El Blast también puede utilizar cualquier otro SMT-LIB compatible teorema de armario parasus consultas.

6. La explosión también viene con una independiente de la GUI. Para instalar la GUI, usteddebe descargar e instalar el LablGTK paquete, además de Ocaml. Después de haberinstalado LablGTK, usted puede construir la interfaz gráfica de usuario por ir al blast-2.4directorio y escribir: make guiEsto va a crear la GUI ejecutable blastgui.opt en el directorio bin.

Page 5: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 5/19

MANUAL DE USUARIO 4

7. Blast (de hecho la GUI) requiere el uso de la variable de entorno BLASTHOME. Por lo tanto,usted debe establecer la variable de entorno BLASTHOME para que apunte al directorio deexplosión-2.4/explosión de donde has descargado Blast.

Puede descargar versiones ejecutables de Blast para Linux y Windows con Cygwin. Usted debe deforma independiente descargar e instalar el Simplify Theorem Prover Blast requiere que el SimplifyTheorem este dentro del path.

Tambien hay mas maneras de instalar el blast. Por ejemplo Usted necesitará OCaml para construirBlast. Blast ha sido probado en Linux y en Windows con Cygwin.

¿Qué es el OCalm

Es un propósito general de fuerza industrial lenguaje de programación con un énfasis en la

expresividad y la seguridad. Es la tecnología de elección en las empresas donde un solo error tepuede costar millones y la velocidad de los asuntos, y que hay una comunidad activa que se hadesarrollado un amplio conjunto de bibliotecas.

Si desea utilizar Blast en Windows, entonces usted debe conseguir una completa instalación deCygwin y el código fuente en OCaml distribución y compilarlo usted mismo usando el Cygwinherramientas (como contraposición a conseguir el nativo Win32-código de la versión de OCaml).

Ejemplos del BLASTCompro bación De La Accesibi l idad

La forma más sencilla de escribir un programa que la Blast debe comprobar es especificar unaetiqueta C, en un programa de ubicación que no debe ser alcanzado. El model checker Blastcomprueba si una etiqueta en el código fuente de C es alcanzable. El comando básico para elfuncionamiento de Blast es "pblast.opt prog.c -de inicio principal -L errlabel". Este se ejecuta elmodelo de ficha en el programa prog.c y comprueba la accesibilidad del error de etiqueta errlabel, apartir de la ubicación inicial de la función de inicio.

Cuando termine la corrida con una traza de error o un mensaje de que el error era inalcanzable (o,desde la accesibilidad problema es indecidible, el programa no puede terminar). Los valorespredeterminados para iniciar y errlabel son los principales y ERROR, respectivamente.

Por lo tanto, la invocación de Explosión con pblast.opt prog.c comprueba si el programa ERROR deetiqueta se puede llegar, cuando comience la ejecución de la función principal.

Page 6: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 6/19

MANUAL DE USUARIO 5

Considere el seguimiento del programa C:int main() {

int x,y;if (x > y) {

x = x - y;

if (x <= 0) {ERROR: goto ERROR;}

}}

Cualquier otra de la seguridad de la propiedad puede ser transformada a la accesibilidad de lacomprobación de programa de instrumentación. Por ejemplo, más sofisticados, las especificacionesestán instrumentados en el código de preprocesamiento paso tal que la falla de la especificación decantidades para llegar a un determinado error de etiqueta. Esto también significa que usted puedeañadir sus propias anotaciones directamente en el código, y un especial de error etiqueta parasignificar la violación de la propiedad que desea comprobar.

Código del programa#include <stdlib.h>#include <string.h>#include <stdio.h>#include <ctype.h>#include <time.h>#include <math.h>

#define SWAP(a,b) {int t; t = a; a = b; b = t;}#define PI 3.141592654#define MAXLIN 40#define MAXWRD 10#define ITE 30000#define TOP 359#define CIU 100#define RADIO 1#define MODIF 7

// Opciones validas

char *opc[] = {"ayuda", "guarda", "iniciar", "muestra", "pesos", "tour", "salir"};

// Lista con los datos de cada punto

typedef struct dato{int numero;int posicion;double x;double y;struct dato *sig;

}PUNTO;

Page 7: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 7/19

MANUAL DE USUARIO 6

// Inicio de listas

PUNTO *inicio = NULL;

// Matriz con las distancias y vector con el viajedouble peso[300][300];int viaje[301], inv = 0, p2p = 0, ver = 0;

// Funciones usadas

void posiciona(int ciudades), libera(void), cambio(int iteraciones, int ciudades);void bussec(int array[], int i, int ciudades), distan(void), manual(void);void muestrame(void), distancias(int ciudades), visual(void), salva(void);void inicial(int ciudades), coordenada(void), toursito(int ciudades);void opciones(int ciudades, int iteraciones), borrar(void);

int getword(char *word, char *line, int pw), abre(void), lookcmd(char *cmd);

double caldis(int vec[], int ciudades);

// Inicio...

int main(int argc, char **argv){

int iteraciones, ciudades;char *com = "abre";srand(time(NULL));

if (argc == 1){

printf("Se usaran valores por defecto:\n");iteraciones = ITE;ciudades = CIU;printf("\tNumero de iteraciones: %d\n", iteraciones);printf("\tNumero de ciudades: %d\n", ciudades);posiciona(ciudades);coordenada();

}

else if (argc == 2){

if ((strcmp(argv[1], com)) == 0){ciudades = abre();

}

else{

Page 8: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 8/19

MANUAL DE USUARIO 7

ciudades = atoi(argv[1]);posiciona(ciudades);coordenada();

}

if (ciudades < 3 || ciudades >300){

puts("ERROR: Argumentos no validos!!!\n");puts("Escriba 'ayuda' en los comandos para ver el manual!!!!!\n");return -1;

}

iteraciones = ITE;printf("Se utilizaran los siguientes valores:\n");printf("\tNumero de iteraciones: %d (por defecto) \n", iteraciones);printf("\tNumero de ciudades: %d\n", ciudades);

}

else if (argc == 3){if ((strcmp(argv[1], com)) == 0){

ciudades = abre();

}

else{

ciudades = atoi(argv[1]);posiciona(ciudades);coordenada();

}

iteraciones = atoi(argv[2]);if (ciudades < 3 || ciudades > 300 || iteraciones < 1){

puts("ERROR: Argumentos no validos!!!\n");puts("Escriba 'ayuda' en los comandos para ver el manual!!!!!\n");return -1;

}

Page 9: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 9/19

MANUAL DE USUARIO 8

printf("Se utilizaran los siguientes valores:\n");printf("\tNumero de iteraciones: %d\n", iteraciones);printf("\tNumero de ciudades: %d\n", ciudades);

}

else{

puts("ERROR: Argumentos no validos!!!\n");puts("Escriba 'ayuda' en los comandos para ver el manual!!!!!\n");return -1;

}

opciones(ciudades, iteraciones);

libera();

return 0;

}

// Ejecuta los comandos dados

void opciones(int ciudades, int iteraciones){int pw, TRUE = 1;int opcion;char line[MAXLIN], word[MAXWRD];

distan();

while(TRUE){

pw = 0;word[0] = line[0] = '\0';printf("\n\nComando-> "); fgets(line, MAXLIN, stdin);

Page 10: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 10/19

MANUAL DE USUARIO 9

if ((pw = getword(word, line, pw)) != 0){opcion = lookcmd(word);

switch(opcion){

case 0:{

manual();break;

}

case 1:{

salva();break;

}

case 2:{

inicial(ciudades);cambio(iteraciones, ciudades);borrar();break;

}

case 3:{

muestrame();break;

}

case 4:{

distancias(ciudades);break;

}

case 5:{

visual();break;

}

case 6:{

TRUE = 0;break;

}

default:{

Page 11: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 11/19

MANUAL DE USUARIO 10

printf("Comando <%s> desconocido, 'ayuda' para ver el manual\n",word);

break;}

}}

}}

// Obtiene las palabrasint getword(char *word, char *line, int pw)

{

int i = 0, c;char lw[MAXWRD];while((c = line[pw]) == ' ' || c == '\t')

pw++;while((c = line[pw++]) != ' ' && c != '\t' && c != '\n')

lw[i++] = tolower(c);lw[i] = '\0';

if(i != 0)

strcpy(word, lw);

else

pw = 0;

return(pw == 0 ? 0 : --pw);

}

// Verifica que sea un comando valido

Page 12: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 12/19

MANUAL DE USUARIO 11

int lookcmd(char *cmd){

unsigned i;

for (i=0; i<MODIF; i++)if (strcmp(cmd, opc[i]) == 0)

return i;return(-1);

}

// Posiciona los puntos alrededor de una circunferencia

void posiciona(int ciudades){

int i;for (i=0; i<ciudades; i++){

PUNTO *nuevo;nuevo = (PUNTO *) malloc(sizeof(PUNTO));nuevo->posicion = (rand() % TOP) + 1;nuevo->numero = (i + 1);nuevo->sig = inicio;inicio = nuevo;

}

}

// Obtiene las coordenadas en x, y

void coordenada(void){

PUNTO *pos = inicio;

while (pos){

pos->x = (cos(pos->posicion * PI / 180) * RADIO);pos->y = (sin(pos->posicion * PI / 180) * RADIO);pos = pos->sig;

}}

Page 13: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 13/19

MANUAL DE USUARIO 12

// Calcula el peso de cada arista

void distan(void){

PUNTO *pos = inicio, *temp;double xa, xb, ya, yb;while (pos->sig){

temp = pos->sig;while (temp){

xa = pos->x;ya = pos->y;xb = temp->x;yb = temp->y;

peso[pos->numero][temp->numero] = sqrt(pow((xa-xb),2) + pow((yayb),2));

peso[temp->numero][pos->numero] = peso[pos->numero][temp->numero];temp = temp->sig;

}pos = pos->sig;

}}

// Genera un tour inicial

void inicial (int ciudades){

int i;

for (i=1; i<=ciudades; i++){viaje[i] = (rand() % ciudades)+1;bussec(viaje, i, ciudades);

}

viaje[0] = viaje[i-1]; // Pone la misma ciudad al final y al principio}

Page 14: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 14/19

MANUAL DE USUARIO 13

// Verifica que solo se pase una vez por cada ciudad

void bussec(int array[], int i, int ciudades){

int j;

for (j=0; j<i; j++){if (array[i] == array[j]){

array[i] = (rand() % ciudades)+1;bussec(array, i, ciudades);

}}

}

// Genera dos numeros aleatorios y determina si el nuevo recorrido es menor

void cambio(int iteraciones, int ciudades){

int i, j, k, h, x, y, a[301], b[301];double dis, nueva, costo1, costo2;dis = caldis(viaje, ciudades);

if (ver){

puts("Recorrido inicial:\n\n");toursito(ciudades);

}

printf("\n\tCosto inicial: %3.3f\n\n", dis);for (h=0; h<iteraciones; h++){

while (x == y){x = (rand() % ciudades) + 1;y = (rand() % ciudades) + 1;

}

for (i=0; i<ciudades; i++){

a[i] = b[i] = viaje[i];

if (a[i] == x)

j = i;

if (a[i] == y)k = i;

}

SWAP(a[j], a[k]);a[i] = a[0];

Page 15: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 15/19

MANUAL DE USUARIO 14

costo1 = caldis(a, ciudades);x = y = 0;

while (x == y){

x = (rand() % ciudades) + 1;y = (rand() % ciudades) + 1;

}

for (i=0; i<ciudades; i++){

if (b[i] == x) j = i;

if (b[i] == y)k = i;

}

if (j > k)

SWAP(j, k);while (j++ < k--)

SWAP(b[j], b[k]);

b[i] = b[0];costo2 = caldis(b, ciudades);

if (costo1 > costo2){

for (i=0; i<=ciudades; i++)

a[i] = b[i];inv++;nueva = costo2;

}

else{p2p++;nueva = costo1;

}

if (nueva < dis){if (ver){

puts("Nuevo recorrido encontrado");

puts("\n\n\tRecorrido propuesto:\n");toursito(ciudades);puts("\n\n");

}printf("Intento: %d\t Anterior: %3.3f\t Nuevo: %3.3f\n", h+1, dis, nueva);dis = nueva;for (j=0; j<=ciudades;j++)

viaje[j] = a[j];}

Page 16: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 16/19

MANUAL DE USUARIO 15

}puts("\n\n");printf("P2P: %d, Inv: %d, Iteraciones: %d\n\n", p2p, inv, iteraciones);

}

// Calcula el costo del recorrido

double caldis(int vec[], int ciudades){int i, x, w;double y = 0;for (i=0; i<ciudades; i++){

x = vec[i];w = vec[i+1];y += peso[w][x];

}return y;

}

// Muestra las distancias desde un punto hacia todos los demas

void distancias(int ciudades){

int i, j;

for (i=1; i<=ciudades; i++){printf("%d", i);for (j=i; j<=ciudades; j++){

printf(": %d,%3.3f", j, peso[i][j]);}puts("\n");

}}

// Muestra los datos de los puntos

void muestrame(void){PUNTO *pos = inicio;printf("\nDatos de los puntos:\n\n");while (pos){

printf("Punto Numero: %d\n", pos->numero);printf("\tPosicion: %3dº\n", pos->posicion);printf("\tCoordenadas: [%3.3f, %3.3f]\n", pos->x, pos->y);pos = pos->sig;

}

}

// Muestra el tour a recorrer

void toursito(int ciudades){

int i;for (i=0; i<=ciudades; i++)

Page 17: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 17/19

MANUAL DE USUARIO 16

printf("%d-", viaje[i]);}

// Libera la memoria utilizada por el programa

void libera(void){

PUNTO *ciud = inicio;while (ciud){

inicio = inicio->sig;free(ciud);ciud = inicio;

}}

// Muestra el archivo manual.txt

void manual(void){

FILE *fp;char *nombre = "manual.txt";int c;

if (!(fp = fopen(nombre, "r"))){

puts("\nError: No se pudo abrir el manual de usuario!!!\n");puts("Verifica que exista el archivo 'manual.txt'\n\n");

}else{

while ((c = fgetc(fp)) != EOF)

printf("%c", c);

fclose(fp);}

}

// Le indica al programa que debe mostar los nuevos recorridos

void visual(void){

if (!ver){ ver = 1;puts("\nActivado\n");

}else{

ver = 0;puts("\nDesactivado\n");

}}

Page 18: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 18/19

MANUAL DE USUARIO 17

// Guarda un archivo con los datos de las ciudades

void salva(void){FILE *fp;PUNTO *p = inicio;

int n, c=0;char *salida, arch[30];printf("\nGuardar como: ");while ((n=getchar()) != '\n')

arch[c++] = n;

arch[c] = '\0';salida = arch;

if (!(fp = fopen(salida, "wb")))

printf("\nERROR!!!! No se pudo crear el archivo de salida\n");

else{

while (p){

fwrite(p, sizeof(PUNTO), 1, fp);

p = p->sig;

}

fclose(fp);

}

}

// Abre un archivo

int abre(void){

FILE *fp;PUNTO aux, *reg;int n, c=0;char *salida, arch[30];printf("\nNombre del archivo: ");while ((n=getchar()) != '\n')

arch[c++] = n;

arch[c] = '\0';salida = arch;

if (!(fp = fopen(salida, "rb")))

printf("\nERROR!!!! No se pudo abrir el archivo\n");

else{

Page 19: Manual Tecnico Blast

7/23/2019 Manual Tecnico Blast

http://slidepdf.com/reader/full/manual-tecnico-blast 19/19

MANUAL DE USUARIO 18

c = 1;while (!feof(fp)){

reg = (PUNTO *)malloc(sizeof(PUNTO));fread(&aux, sizeof(PUNTO), 1, fp);reg->numero = c;reg->posicion = aux.posicion;reg->x = aux.x;

reg->y = aux.y;reg->sig = inicio;inicio = reg;c++;

}fclose(fp);

}return (c-1);

}

// Borra cualquier recorrido guardadovoid borrar(void){

int i;

for (i=0; i<301; i++)

viaje[i] = 0;p2p = inv = 0;

}