Otras fuentes
Boletín S3: Detector del
invariante Daikon
Contenidos:
Visión global
El detector
del invariante Daikon informa de las propiedades
que seguramente sean válidas en ciertos puntos
de un programa. Las propiedades relatadas son ecuaciones
aritméticas como las que usted mismo podría
encontrar en una sentencia assert, una precondición
(cláusula "requires") o una poscondición
(cláusula "effects"); por ejemplo,
"x == abs(y)" o"i < myArray.length".
Estos invariantes pueden ser útiles en la compresión
del programa y en multitud
de otras aplicaciones. Daikon funciona ejecutando
el programa y examinando los valores que computa, buscando
patrones y relaciones entre esos valores.
Daikon está a su disposición
a través del curso 6.170. Al ejecutar daikon
sin ningún argumento, se visualizará la
información de uso:
Athena% daikon
Usage: daikon [OPTIONS] <MAIN CLASS> [MAIN ARGUMENTS]
Options:
-o, --output FILE Save invariants in FILE.inv
...
Como mínimo, debe facilitar
el nombre de una clase "main" que proporcione
el método "public static void main(String[] args)".
Daikon ejecutará esta clase para ejecutar su programa.
Consulte la sección de opciones
de la línea de comando para obtener más
detalles sobre las opciones disponibles para Daikon.
- -o, --output FILE
- Salva los invariantes en un
FICHERO.inv y la fuente en un FICHERO.src.tar.gz.
Si no se le da ningún nombre, automáticamente
se genera y utiliza uno.
- -t, --textfile
- Guarda un listado textual de
los invariantes en un archivo .txt.
- -v, --verbose
- Exhibe mensajes de progreso
durante la ejecución.
- -c, --cleanup
- Elimina los archivos que hayan
quedado de una sesión interrumpida antes de
comenzar. Este comando debería ser utilizado
únicamente cuando Daikon detecta archivos sobrantes
y le ordena que use esta opción.
- -n, --nogui
- Crea el archivos de los invariantes
(y el archivo .txt , si - t se ha facilitado), pero
no arranca la interfaz gráfica de usuario (GUI).
La GUI muestra una vista de árbol
con los resultados. En el primer nivel, muestra una
lista de las clases que están siendo revisadas.
A medida que cada clase se expande, se exhibe una lista
con los puntos del programa.
Un punto del programa se asocia
normalmente con un lugar específico del código
fuente. Por ejemplo, el punto ENTER bajo el
nodo foo() representa las precondiciones tras
la entrada al método foo().
Los puntos del programa ENTER
y EXIT identifican los puntos a la entrada
y a la salida de un método específico.
El punto del programa OBJECT indica los invariantes
de representación (conocidos también como
invariantes del objeto) que se dan en cualquier objeto
de una clase específica, desde el punto de vista
de un cliente o usuario. Estas propiedades se dan a
la entrada a y a la salida de cada método público
de la clase. El punto del programa CLASS es
como el punto del programa OBJECT, pero sólo
para las variables estáticas.
Es posible que unas pocas partes
de la sintaxis de los invariantes visualizados resulten
confusas.
En la salida, la aplicación
de orig(x) a una variable x hace referencia
al valor original de un parámetro formal. Las
variables orig() aparecen sólo en los
puntos del programa EXIT.
Los índices negativos del
array cuentan hacia atrás a partir de
la longitud del array; por ejemplo, a[-1]
indica el último elemento del array a;
es simplemente una
forma de tratamiento sintáctico
para a[a.length-1].
Aunque el método explicado
arriba puede ser suficiente para la mayoría de
los usuarios, tal vez algunos deseen indagar más.
Esta sección describe cómo usar Daikon
sin la ayuda del script wrapper.
Una razón por la que usted podría
estar interesado en esto es porque le permite controlar
la detección del invariante (por ejemplo, qué
clases son examinadas y cuáles ignoradas). Otro
de los beneficios es que usted puede editar y reinstrumentar
algunos ficheros sin arrancar cada vez el proceso completo.
Finalmente, al seguir los pasos uno por uno, obtendrá
un mejor entendimiento de lo que sucede en segundo plano.
La detección de invariantes
implica tres pasos:
- Instrumentar
el programa para añadir instrucciones
que den como salida valores de variable.
- Ejecutar
el programa (utilizando probablemente un conjunto
de pruebas) para crear los ficheros de rastreo
de datos.
- Ejecutar
el detector del invariante Daikon sobre los ficheros
de rastreo de datos para detectar los invariantes.
Paso
1: Instrumentación
La interfaz
de usuario (front end) modifica el programa
de modo que, además de realizar su tarea original,
también escribe valores de variable en un fichero
de rastreo de datos. La interfaz de usuario trabaja en
códigos Java
que correspondan a cualquier versión del
lenguaje Java, desde
la
1.0 a la 1.3.
Ejecute dfej, el Extremo
Frontal de Daikon para Java, en
sus archivos de fuente Java:
dfej filename1.java filename2.java ...
El Extremo Frontal Daikon para
Java lleva a cabo
dos tareas:
- dfej escribe las versiones de
los archivos a los que se añadieron instrucciones
en un directorio daikon-java/.
- dfej crea archivos de declaración
llamados filename1.decls, en un directorio
daikon-output/.
Únicamente los archivos
Java especificados tendrán
instrucciones añadidas; otros ficheros
se ejecutarán sin añadir instrucciones,
lo que permitirá controlar el alcance de la detección
del invariante.
Compile los ficheros generados,
ej.
javac daikon-java/*.java
Ejecute el programa utilizando
algún conjunto de pruebas para crear una
colección de archivos de rastreo de datos. Puede
ejecutar el programa con las instrucciones añadidas,
como lo hizo antes; el único cambio de comportamiento
consistirá en escribir un archivo .dtrace
en el subdirectorio daikon-output/ (que será
creado si no existe ya). Sólo se crea un fichero
.dtrace, incluso si múltiples ficheros
.decls podrían haber sido creados (uno
para cada fichero fuente) cuando se añadieron instrucciones
al programa.
Una vez añadidas las instrucciones,
existen dos versiones del programa: la original y la
versión donde se añadieron las instrucciones
que aparece en el directorio daikon-java/.
Asegúrese de que el directorio daikon-java/
aparece en el path de su clase antes que el directorio
que contiene el código Java original. Puede
hacer esto ejecutando el programa desde ese directorio
si "." (el directorio actual) aparece antes
en su path de clase. Otra opción sería
añadir explícitamente el directorio daikon-java/
a su path de clase.
Después de ejecutar su
aplicación Java , ejecute modbit-munge.pl
sobre el archivo.dtrace resultante:
modbit-munge.pl myprog.dtrace
Este paso arregla algunos posibles
problemas que pueden aparecer en el fichero de rastreo.
Ejecute el detector del invariante
Daikon a través del comando
java daikon.Daikon decl-files... trace-files...
Los decl-files son
archivos de declaración (.decl) creados
en el momento de añadir las instrucciones. Los
trace-files son ficheros de rastreo de datos
(.dtrace) creados al ejecutar el programa al
que se añadieron las instrucciones. Asegúrese
de incluir todos los archivos declaración que sean
necesarios para el archivo especial de rastreo de datos;
el modo más sencillo consiste en incluir todos
los archivos de declaración creados al añadir
instrucciones al programa que es leído.
Daikon produce por defecto, un
listado textual de los invariantes a la salida estándar
(el terminal); sin embargo, también puede originar
un archivo que puede ser cargado en la GUI, mediante
la opción -o:
java daikon.Daikon -o foo.inv decl-files... trace-files...
Luego, usted puede ejecutar
la GUI sobre ese archivo:
java daikon.gui.InvariantsGUI foo.inv
Página
principal del curso de Daikon
Volver arriba
|