Los programas al diván!Los programas al diván!Programas que analizan programasProgramas que analizan programas
Diego GarbervetskyDiego Garbervetsky
Laboratorio Laboratorio DependexDependex
int insomnio(int dias) { int tot=0; int i = 0; while(i<dias) { tot=tot+8; i++; } return tot;}
AclaracionesAclaraciones
No soy Ingeniero de No soy Ingeniero de Software!Software! No tengo moto…No tengo moto…
No mato ratasNo mato ratas
No busco petróleoNo busco petróleo
No juego con perritosNo juego con perritos
Van a tener que ver Van a tener que ver muchos muchos programitas!programitas!
Analizando programasAnalizando programasUna mirada “psicológica”Una mirada “psicológica”
void imprimir(int[] A) { ordenar(A); for(int i=0;i< a.length; i++) { ordenar(A); System.out.println(A[i]); ordenar(A); } ordenar(A); ordenar(A);}
Neurótico Obsesivo
Qué es el análisis de programas?Qué es el análisis de programas?
Técnicas para Técnicas para predecirpredecir propiedades de los propiedades de los programas antes de ejecutarlos (o sea, saber de programas antes de ejecutarlos (o sea, saber de antemano cosas que pasarán al ejecutarlos) antemano cosas que pasarán al ejecutarlos)
Algunas propiedades que interesan:Algunas propiedades que interesan: Variables “vivas”Variables “vivas”
int noSoyOptimo(int n){ x = n; {n} acum = n; {acum} i = 0; {acum, i} while(i< 10) {acum, i} { k = i + 1; {acum, k} acum = acum + 1; {acum, k} i = k; {acum, i} } return acum; { acum }}
• Una variable está viva en una posición del programa si es USADA en alguna posición a partir de ese punto SIN SER REASIGNADA
• Una variable ASIGANDA pero no viva, puede ser eliminada junto con sus ASIGNACIONES
Qué es el análisis de programas?Qué es el análisis de programas?
Técnicas para Técnicas para predecirpredecir propiedades de los propiedades de los programas antes de ejecutarlos (o sea, saber de programas antes de ejecutarlos (o sea, saber de antemano cosas que pasarán al ejecutarlos) antemano cosas que pasarán al ejecutarlos)
Algunas propiedades que interesan:Algunas propiedades que interesan: Variables “vivas”Variables “vivas” Expresiones usadas frecuentementeExpresiones usadas frecuentementeint noSoyOptimo(int n, int[] a)
{ acum = 0; for(int i=0; i< 10; i++) { a[2*n+i]=a[2*n+i]+1; acum = acum + a[2*n+i]; } return m;}
• Una expresión es usada frecuentemente si aparece varias veces en un programa y el valor que representa es siempre el mismo.
Qué es el análisis de programas?Qué es el análisis de programas?
Técnicas para Técnicas para predecirpredecir propiedades de los propiedades de los programas antes de ejecutarlos (o sea, saber de programas antes de ejecutarlos (o sea, saber de antemano cosas que pasarán al ejecutarlos) antemano cosas que pasarán al ejecutarlos) Algunas propiedades que interesan:Algunas propiedades que interesan: Variables “vivas”Variables “vivas” Expresiones usadas frecuentementeExpresiones usadas frecuentemente InvariantesInvariantes Accesos correctos a Arrays, a referencias (punteros)Accesos correctos a Arrays, a referencias (punteros) Código alcanzableCódigo alcanzable Tiempo de ejecuciónTiempo de ejecución Y muchas más!Y muchas más!
int noSoyOptimo(int n){ { true } acum = n; { acum = n } for(int i=0; i< 10; i++) { {0≤ i<10 acum=n+i } acum = acum + 1; {0≤ i<10 acum=n+i+1 } } { i = 10 acum=n+10 } return acum; }
Invariante en un punto: Invariante en un punto: Relación entre variables que se Relación entre variables que se mantiene mantiene para cualquier para cualquier ejecución ejecución de un programade un programa
Tipos de AnálisisTipos de Análisis
Dos enfoquesDos enfoques Estático: Se analiza el programa Estático: Se analiza el programa sin sin
ejecutarloejecutarlo. . Se deduce el comportamiento a partir del Se deduce el comportamiento a partir del TEXTOTEXTO del código. del código.
Dinámico: Se ejecuta el programa Dinámico: Se ejecuta el programa (varias veces)(varias veces)
Se deduce el comportamiento a partir de Se deduce el comportamiento a partir de datos obtenidos de las ejecuciones.datos obtenidos de las ejecuciones.
El TESTING es un tipo análisis dinámicoEl TESTING es un tipo análisis dinámico
Vamos a hablar de Análisis Estático
MotivaciónMotivaciónPor qué analizar programas?Por qué analizar programas?
Generación de CódigoGeneración de Código CompilaciónCompilación OptimizaciónOptimización TransformaciónTransformación
VerificaciónVerificación Contra especificacionesContra especificaciones Bugs en códigoBugs en código Generación de casos de TestGeneración de casos de Test
ComprensiónComprensión Obtención de invariantesObtención de invariantes Obtención de modelos a partir de códigoObtención de modelos a partir de código
SeguridadSeguridad Buffer overflows…Buffer overflows…
Por qué analizar programas?Por qué analizar programas?Generación de CódigoGeneración de Código
Compilar: Transformar un programa en Compilar: Transformar un programa en un lenguaje que nosotros “entendemos” un lenguaje que nosotros “entendemos” por algo que entiende la máquinapor algo que entiende la máquina
int ordenar(int[] A){ for(int i=0;i< a.size; i++) { swap(i, min(A,i) ); }}
ordenar Mov cx,0 L1: call minimo Mov bx, data[ax] Mov ex, data[cx] Mov data[cx], bx Mov data[ax], ex Inc cx; cmp cx,data[size] jnz L1
Estructura de un CompiladorEstructura de un Compilador
Analizador Léxico
ParserAnalizador Semántico Optimizador
independientedel procesador
Generador de código
Optimizadorespecifico
para el procesador
Cadena de Tokens
Síntaxis Abstracta
Representación
Intermedia
Representación
IntermediaOptimizadaCódigo para
una máquina especifica
Código=Texto
Código optimizadopara una máquina específica
Por qué analizar programas?Por qué analizar programas?OptimizarOptimizar
Optimizar: Hacer algo más eficiente según Optimizar: Hacer algo más eficiente según algún criterio…algún criterio…
Espacio!
Miss Gorda 2004 - Foto: Terra/Reuters Pampita - Foto: HardDisk E. Mockscos
Por qué analizar programas?Por qué analizar programas?OptimizarOptimizar
Optimizar: Hacer algo más eficiente según Optimizar: Hacer algo más eficiente según algún criterioalgún criterio
int noSoyOptimo(int x){ int n = x; int h = 10; int m; for(int i=0; i< 1000; i++) { m = max(n,h); } return m;}
int soyOptimo(int x){ return max(x,10);}
•Espacio!
•N° de instrucciones ejecutadas!
•Velocidad!
Optimizaciones TípicasOptimizaciones Típicas
Evitar cómputos redundantesEvitar cómputos redundantes Reusar resultados disponiblesReusar resultados disponibles Sacar de los “loops” los resultados que no Sacar de los “loops” los resultados que no
varían en ellosvarían en ellos
Evitar cómputos superfluosEvitar cómputos superfluos Resultados no necesariosResultados no necesarios Resultados calculables en tiempo de Resultados calculables en tiempo de
compilación (ej.:constantes)compilación (ej.:constantes)
Reusar resultados disponiblesReusar resultados disponibles
int noSoyOptimo(int n, int[] a){ acum = 0; for(int i=0; i< 10; i++) { a[2*n+i]=a[2*n+i]+1; acum = acum + a[2*n+i]; } return m;}
int soyMasOptimo(int n, int[] a){ acum = 0; for(int i=0; i< 10; i++) { tmp = 2*n+i; a[tmp]=a[tmp]+1; acum = acum + a[tmp]; } return m;}
Primer cálculo
Cálculos repetidos
Otros análisisOtros análisis
int noSoyOptimo(int x){ int n = x; int h = 10; int m; for(int i=0; i<1000; i++) { m = max(n,h); } return m;}
No depende del Loop
int noSoyOptimo(int x){ int n = x; int h = 10; int m; m = max(n,h);return m;}
h es constanten es siempre x
int noSoyOptimo(int x){ int n = x; { x } int h = 10; { x } int m; {x} m = max(x,10); {m}return m; {} }
n, h no están vivas!!
Resultados no necesariosResultados no necesariosResultados calculables en Resultados calculables en tiempo de compilaciòntiempo de compilaciòn
Instrucciones que no dependen Instrucciones que no dependen del loopdel loop
int casiOptimo(int x){ int m; m = max(x,10); return m;}
Analizando programasAnalizando programasUna mirada “psicológica”Una mirada “psicológica”
void imprimir(int[] A){ System.out.println(A[i]); i=i-i; while(a.length<i); i = 0;}
Esquizofrénico!
Por qué analizar programas?Por qué analizar programas? Verificar Verificar
Dos enfoquesDos enfoques 1) Ver si el programa cumple con lo 1) Ver si el programa cumple con lo
especificado. especificado. Testing… (dinámico)Testing… (dinámico) Descubrir invariantes y comparar (estática o Descubrir invariantes y comparar (estática o dinámicamente)dinámicamente)
2) Evitar la mayor cantidad errores en tiempo 2) Evitar la mayor cantidad errores en tiempo de ejecuciónde ejecución
chequeo de accesos indebidos a arrays, chequeo de accesos indebidos a arrays, A[i] con i mayor a la dimensión del array o negativo!A[i] con i mayor a la dimensión del array o negativo!
punteros nulos, punteros nulos, variables no inicializadas…variables no inicializadas…
WARNING!Ingeniería
de Software
Verificación EjemplosVerificación Ejemplos
PolySpace aplica técnicas análisis PolySpace aplica técnicas análisis estático para la verificación de estático para la verificación de programas “críticos”programas “críticos”Verificó una aplicación de Verificó una aplicación de sincronización de los trenes de alta sincronización de los trenes de alta velocidad TGV (Francia)velocidad TGV (Francia)15.000 líneas de código15.000 líneas de códigoDescubrió (sin ejecutar) los Descubrió (sin ejecutar) los siguientes tipos de errores:siguientes tipos de errores:
Acceso a variables no inicializadasAcceso a variables no inicializadas Divisiones por zeroDivisiones por zero Acceso fuera de límites de ArraysAcceso fuera de límites de Arrays Acceso concurrente a variables Acceso concurrente a variables
compartidas sin sincronizarcompartidas sin sincronizar
POTENCIALES ERRORES EN EJECUCION!
!!!!!CHOQUES!!!!!!
WARNING!Ingeniería
de Software
Limites del AnálisisLimites del Análisis
El problema de la Parada…El problema de la Parada…
Sea “Tusam” un programa que dado otro Sea “Tusam” un programa que dado otro programa nos dice si este para o no.programa nos dice si este para o no.
Tusam(P) =Tusam(P) =SI SI si P parasi P para
NONO si P se “cuelga”si P se “cuelga”
Existe el programa Existe el programa TusamTusam??
Limites del AnálisisLimites del Análisis
Supongamos que existe Supongamos que existe TusamTusam
Sea “TonyKamo” otro programa Sea “TonyKamo” otro programa
TonyKamo(P) =TonyKamo(P) =Se cuelga Se cuelga si Tusam(P) = SI si Tusam(P) = SI
OKOK si Tusam(P) = NO si Tusam(P) = NO
Que pasa si corremos TonyKamo(TonyKamo)?Que pasa si corremos TonyKamo(TonyKamo)?1)1) Si se cuelga, entonces Tusam(TonyKamo)=SI, entonces Si se cuelga, entonces Tusam(TonyKamo)=SI, entonces
Tonykamo para!, pero se colgó…Tonykamo para!, pero se colgó…2)2) Si da OK, entonces Tusam(TonyKamo) =NO, entonces Si da OK, entonces Tusam(TonyKamo) =NO, entonces
TonyKamo se cuelga, pero dio OK!TonyKamo se cuelga, pero dio OK!
Absurdo!Absurdo!
ConsecuenciasConsecuencias
El problema de la parada no es computableEl problema de la parada no es computable
Lamentablemente muchos problemas tampoco Lamentablemente muchos problemas tampoco lo son. Ejemplos:lo son. Ejemplos: Decidir si un punto del programa es alcanzable por Decidir si un punto del programa es alcanzable por
alguna ejecución o no (código muerto)alguna ejecución o no (código muerto) Calcular (exactamente) cuanta memoria necesita un Calcular (exactamente) cuanta memoria necesita un
programa para ejecutarseprograma para ejecutarse Saber si dos variables refieren al mismo objeto Saber si dos variables refieren al mismo objeto
(aliasing)(aliasing)
AproximacionesAproximaciones
No dar el resultado exacto (ya vimos que a veces es No dar el resultado exacto (ya vimos que a veces es imposible)imposible)Dar una aproximación conservativaDar una aproximación conservativa
Tener en cuenta para que vamos a usar el resultado del Tener en cuenta para que vamos a usar el resultado del análisisanálisis
Tiene que ofrecer datos SEGUROS según la transformación Tiene que ofrecer datos SEGUROS según la transformación que hagamosque hagamos
Copiar Constantes Variables Vivas
= Espacio aproximado= Espacio de soluciones exacto
Analizando programasAnalizando programasUna mirada “psicológica”Una mirada “psicológica”
Narcisista…
void imprimir(int[] A){ for(int i=0;i< A.length; i++) { System.out.println("Soy groso!“ +A[i]); } }
Que estamos haciendo?Que estamos haciendo?
Nos interesan los programas que Nos interesan los programas que corren en “aparatitos” (sistemas corren en “aparatitos” (sistemas embebidos)embebidos) Limitaciones de espacio y poder de Limitaciones de espacio y poder de
computocomputo Aplicaciones “generalmente” críticasAplicaciones “generalmente” críticas
También nos interesan los También nos interesan los sistemas de tiempo realsistemas de tiempo real Necesitamos predictibilidad Necesitamos predictibilidad
temporal (saber que cierto proceso temporal (saber que cierto proceso SIEMPRE tarda menos que X SIEMPRE tarda menos que X tiempo)tiempo)
Problemas en sistemas embebidosProblemas en sistemas embebidos
Son generalmente críticos y de tiempo Son generalmente críticos y de tiempo realreal
Usan lenguajes de programación de bajo Usan lenguajes de programación de bajo nivelnivel
Difíciles de programar y propensos a erroresDifíciles de programar y propensos a errores Muy difíciles de verificarMuy difíciles de verificar
Es un quilombo! Es un quilombo!
Tenemos que buscar formas de trabajar Tenemos que buscar formas de trabajar con lenguajes más modernos y con lenguajes más modernos y “cómodos”.“cómodos”.
Programador de embebidos
www.Soypelado.com.ar
Análisis de Memoria en lenguajes Análisis de Memoria en lenguajes orientados a Objetosorientados a Objetos
Los lenguajes orientados a objetos tienen Los lenguajes orientados a objetos tienen muchas ventajas:muchas ventajas: Abstracción, encapsulación, Modularidad, Reuso, etc.Abstracción, encapsulación, Modularidad, Reuso, etc. Muchos programadores y diseñadores “conocen” Muchos programadores y diseñadores “conocen”
POOPOO
Casi no usados para sistemas críticos o de Casi no usados para sistemas críticos o de tiempo real... tiempo real... Problemitas:Problemitas: Garbage Collector (recolección de objetos ya no Garbage Collector (recolección de objetos ya no
utilizados)utilizados) Binding dinámico y polimorfismoBinding dinámico y polimorfismo
•No son predecibles!! No son predecibles!! •Muy difícil analizarlos!!!Muy difícil analizarlos!!!
Modelo de Memoria en Lenguajes Modelo de Memoria en Lenguajes ModernosModernos
void usoMemoria(int n){ Carita v; for(int i=0;i<n;i++) { v = dameObjeto(); System.out.print(v); }}
Carita dameObjeto(){ Carita ret = new Carita() return ret;}
v
Modelo de Memoria en Lenguajes Modelo de Memoria en Lenguajes ModernosModernos
void usoMemoria(int n){ Carita v; for(int i=0;i<n;i++) { v = dameObjeto(); System.out.print(v); }}
Carita dameObjeto(){ Carita ret = new Carita() return ret;}
v
Señor Garbage Collector
ProblemaProblema
No sabemos cuando actua el GCNo sabemos cuando actua el GC
No sabemos cuanto va a tardarNo sabemos cuanto va a tardar
El GC es Malo… (para nosotros!)El GC es Malo… (para nosotros!)
Tenemos que eliminarlo!!!!Tenemos que eliminarlo!!!!
SOY MALO!!!
Modelo de Memoria en Lenguajes OOModelo de Memoria en Lenguajes OO
Nosotros podemos darnos cuenta Nosotros podemos darnos cuenta que los objetos dejan de estar que los objetos dejan de estar “Apuntados”“Apuntados”
Analizando el Código!Analizando el Código!v
Entonces podemos modificar Entonces podemos modificar el código para hacer lo mismo el código para hacer lo mismo que el Garbage Collector…que el Garbage Collector…
Cuando y de la forma que querramos!Cuando y de la forma que querramos!
El programador NI SE ENTERA!El programador NI SE ENTERA!
Más cosas sobre la memoriaMás cosas sobre la memoria
Recordemos que nos interesa la predictibilidad Recordemos que nos interesa la predictibilidad y que tenemos poco espacio (aparatitos!)y que tenemos poco espacio (aparatitos!)
Nos interesa mucho administrar bien la memoriaNos interesa mucho administrar bien la memoria
Necesitamos:Necesitamos: Entender como trabajan los programas con la Entender como trabajan los programas con la
memoria (tiempo de vida de los objetos que memoria (tiempo de vida de los objetos que alocamos)alocamos)
Administrar bien la memoria Administrar bien la memoria Mecanismo eficiente y predictivo sin el GC!Mecanismo eficiente y predictivo sin el GC!
Poder aproximar el consumo!!Poder aproximar el consumo!!
Más cosas…Más cosas…Análisis de InvariantesAnálisis de Invariantes
Invariante: Relación entre variables que Invariante: Relación entre variables que debe cumplirse siempredebe cumplirse siempre
Nos explican que pasa con el programa Nos explican que pasa con el programa en determinados puntosen determinados puntos
Sirven para entender Sirven para entender
Para verificarPara verificar
Y para estimar consumo de memoria!Y para estimar consumo de memoria!
ret =1
x != 1
ret =x
return ret
x > y
ret = y
Análisis de Invariantes EstáticoAnálisis de Invariantes Estático
int maximoPrieto(int x, int y){1: int ret = 1:
2: if(x!=1) {
3: if(x>y)
4: ret = x;
else5: ret = y; }
6: return ret; }
{ no se nada…}
{ ret = 1 }
{ ret = 1 x!=1 }
{ ret = 1 x!=1 x > y }
{ ret = x x!=1 x > y }
{ ret = 1 x!=1 x ≤ y }
{ ret = y x!=1 x ≤ y }
{ (x!=1 ((x > y ret = x) (x ≤ y ret = y)) ) (x = 1 ret = 1) }
{ ret = 1 x= 1 }
Análisis Invariantes DinámicoAnálisis Invariantes Dinámico
int maximoPrieto(int x, int y){1: int ret = 1:
2: if(x!=1) {
3: if(x>y)
4: ret = x;
else5: ret = y; }
6: return ret; }
1: (ret=1, x=3, y=4) 2: (ret=1, x=3, y=4) 3: (ret=1, x=3, y=4)5: (ret=4, x=3, y=4)6: (ret=4, x=3, y=4)
1: (ret=1, x=5, y=4) 2: (ret=1, x=5, y=4) 3: (ret=1, x=5, y=4)4: (ret=5, x=5, y=4)6: (ret=5, x=5, y=4)
1: (ret=1, x=6, y=4) 2: (ret=1, x=6, y=4) 3: (ret=1, x=6, y=4)4: (ret=6, x=6, y=4)6: (ret=6, x=6, y=4)
1: (ret=1, x=4, y=4) 2: (ret=1, x=4, y=4) 3: (ret=1, x=4, y=4)5: (ret=4, x=4, y=4)6: (ret=4, x=4, y=4)
Se deduce un valor según las trazas de ejecución
Y si nunca ejecutamos con x=1??
Se deduce que en 6: ret = Maximo(x,y)
Otras cosas: Otras cosas: Analisis de consumo de Analisis de consumo de memoria en Javamemoria en Java
Dado un método (función o procedimiento) Dado un método (función o procedimiento) obtenemos un obtenemos un polinomiopolinomio en función de sus en función de sus parámetros que sobre aproxima la cantidad de parámetros que sobre aproxima la cantidad de memoria que necesita para corrermemoria que necesita para correr
void usoMemoria(int n){ for(int i=0;i<n;i++) { for(int j=0;j<i;j++) { C v = new C(); } }}
P(n) = ½ n2 + ½n
Inv ={ 0≤i<n 0≤j<i }
Mago Capria
DePendex - Laboratorio de investigación DePendex - Laboratorio de investigación en Software Confiableen Software Confiable
Si, Victor es Groso!Alfred Olivero Sergio Yovine
Chapa Nico Yo
Andran “Guru” Eclipse Diego “Invariante” Piemonte
Que hacemos en DEPENDEX?Que hacemos en DEPENDEX?
Modelado y análisis de sistemas de tiempo realModelado y análisis de sistemas de tiempo real Lenguajes gráficos para describir requerimientos Lenguajes gráficos para describir requerimientos
temporalestemporales Model CheckingModel Checking Extracción de modelos a partir de diseñosExtracción de modelos a partir de diseños
Predicción de uso de memoriaPredicción de uso de memoria Análisis de “tiempo de vida” de los objetosAnálisis de “tiempo de vida” de los objetos Transformación de códigoTransformación de código Calculo de InvariantesCalculo de Invariantes
Programación orientada a AspectosProgramación orientada a Aspectos
Dependex – Proyectos / AplicacionesDependex – Proyectos / AplicacionesModelado, análisis y verificación de Sistemas de Modelado, análisis y verificación de Sistemas de Tiempo RealTiempo Real
VInTimeVInTime: Un tool-suite para la verificación de sistemas de : Un tool-suite para la verificación de sistemas de tiempo real tiempo real
LapsusLapsus: Herramienta para diseño de sistemas de tiempo real: Herramienta para diseño de sistemas de tiempo realVTSVTS: Un lenguaje grafico para la especificación de requerimientos: Un lenguaje grafico para la especificación de requerimientosObsSliceObsSlice: Un reductor “exacto” de sistemas de tiempo real: Un reductor “exacto” de sistemas de tiempo realZeusZeus: Un “model checker” distribuido basado en KRONOS.: Un “model checker” distribuido basado en KRONOS.
TraceIt!TraceIt!: Generador de trazas de eventos para sistemas de : Generador de trazas de eventos para sistemas de tiempo real distribuidos tiempo real distribuidos
Herramientas que operan sobre programasHerramientas que operan sobre programas JScoperJScoper: Un plug-in para Eclipse que facilita la traducción de : Un plug-in para Eclipse que facilita la traducción de
aplicaciones Java estándar a Java Real Timeaplicaciones Java estándar a Java Real Time JMemoryJMemory: Un estimador simbólico del consumo de memoria de : Un estimador simbólico del consumo de memoria de
aplicaciones javaaplicaciones java JInvariantJInvariant: Un generador automático de invariantes poliédricos : Un generador automático de invariantes poliédricos
para programas Javapara programas Java SetPointSetPoint: Una heramienta para Programación Orientada a : Una heramienta para Programación Orientada a
Aspectos basada en poincuts semánticosAspectos basada en poincuts semánticos
FIN!FIN!
PREGUNTAS?
Quedo algo de vino?
Top Related