Sie sind auf Seite 1von 19

Qu es el

Anlisis Esttico del Cdigo ?


por

Ral Expsito

Imagen: http://www.flickr.com/photos/scott_waterman/178367110/

Qu es el Anlisis Esttico del Cdigo?

ndice
Qu contiene este documento? Sobre el autor Sobre la licencia Teora acerca del Anlisis Esttico del Cdigo Qu tipos de anlisis esttico del cdigo existen? Cundo debemos hacer estos anlisis? Actividades complementarias al anlisis esttico del cdigo Limitaciones del anlisis esttico del cdigo Conclusiones Anlisis Esttico del Cdigo en Java PMD CPD Checkstyle Findbugs Otras herramientas Anlisis Esttico del Cdigo en Groovy Codenarc 03 03 03 04 06 06 09 09 10 12 13 14 15 16 16 18 18

Pgina 2 de 19

Qu es el Anlisis Esttico del Cdigo?

Qu contiene este documento?


El texto que vas a poder leer a continuacin explica en qu consiste la tcnica del anlisis esttico del cdigo, la cual tiene como objetivo mejorar la calidad del cdigo fuente del software. Te encuentras ante un documento de carcter tcnico que no entra en demasiado detalle para conseguir que cualquier persona pueda leerlo, aunque inevitablemente aparecern algunos trminos y vocablos propios de la jerga informtica que se explicarn de una manera sencilla segn aparezcan. Como complemento a la teora acerca de qu es y en qu consiste el anlisis esttico del cdigo se presentarn varias herramientas para dos lenguajes de programacin en particular: java y groovy. De este modo lo que se pretende es que se entienda mejor cul es el alcance de esta tcnica. La maquetacin de este documento est inspirada en la fantstica maquetacin del documento "Eres Productivo. Vol 1" de Berto Pena, mientras que los iconos son propiedad de Mark James: http://albertopena.com/descargas/ http://www.famfamfam.com/

Sobre el autor
Ral Expsito es un ingeniero en informtica residente en Getafe (Madrid) a quien le gusta materializar ideas, la creatividad, el diseo, el cuidado de los detalles y la simplicidad, definindose por tanto como una persona con vocacin tcnica pero a la vez creativa y con inquietudes. Podis encontrarle en su pgina web: http://raulexposito.com/

Sobre la licencia
Este documento se publica bajo la licencia Creative Commons 3.0 de Reconocimiento-No comercial-Sin obras derivadas, lo que significa que puedes realizar y distribuir copias siempre que: reconozcas la autora de estos textos, no haya un beneficio comercial en tu distribucin de las copias y no modifiques el contenido.

Pgina 3 de 19

Qu es el Anlisis Esttico del Cdigo?

Teora acerca del Anlisis Esttico del Cdigo

Imaginemos que somos miembros de un equipo de desarrollo. Nos encontramos creando cierto software y en un momento determinado nos planteamos analizar estticamente el cdigo. A qu nos referimos con esto?, qu vamos a hacer exactamente?, en qu consiste esta tarea?. Es posible que la definicin ms breve y concisa de la tcnica que vamos a utilizar sea la siguiente:

"El anlisis esttico del cdigo es el proceso de evaluar el software sin ejecutarlo"

Pgina 4 de 19

Qu es el Anlisis Esttico del Cdigo?

Es, por tanto, una tcnica que se aplica directamente sobre el cdigo fuente tal cual, sin transformaciones previas ni cambios de ningn tipo. La idea es que, en base a ese cdigo fuente, podamos obtener informacin que nos permita mejorar la base de cdigo manteniendo la semntica original. El analizador esttico de cdigo, para ello, recibir el cdigo fuente de nuestro programa, lo procesar intentando averiguar qu es lo que queremos que haga y nos dar sugerencias con las que poder mejorar ese cdigo.

Pero, cmo hace esto?, qu hace para "saber" qu es lo que queremos hacer y qu podemos hacer para mejorarlo?. Estas herramientas incluyen, por un lado, analizadores lxicos y sintcticos que procesan el cdigo fuente y, por otro, un conjunto de reglas que aplicar sobre determinadas estructuras. Si nuestro cdigo fuente posee una estructura concreta que el analizador considere como "mejorable" en base a sus reglas nos lo indicar y nos sugerir una mejora. Y todo esto, para qu sirve?, qu salimos ganando realizando estos anlisis?. Bsicamente ganamos en facilidad de mantenimiento y de desarrollo ya que su objetivo es minimizar la deuda tcnica de nuestros proyectos, y es que algunas de las funciones de los analizadores consisten en encontrar partes del cdigo que puedan: reducir el rendimiento, provocar errores en el software, complicar el flujo de datos, tener una excesiva complejidad, suponer un problema en la seguridad.

Como podis ver su misin es la de servirnos de ayuda en nuestros desarrollos, ayudndonos a detectar nuestros propios errores y

Pgina 5 de 19

Qu es el Anlisis Esttico del Cdigo?

ofrecindonos posibles soluciones a los mismos. Nos ofrecen mucho y no nos piden nada a cambio, as que, por qu no utilizarlos?

Qu tipos de anlisis esttico del cdigo existen?


Podramos decir que existen dos. Por un lado est el anlisis automtico que realiza un programa de ordenador sobre nuestro cdigo y por otro est el anlisis manual que realiza una persona. Cada uno de estos anlisis persigue unos objetivos concretos: El anlisis realizado por un programa de ordenador, o anlisis automtico, reduce la complejidad que supone detectar problemas en la base del cdigo ya que los busca utilizando a unas reglas que tiene predefinidas. El anlisis realizado por una persona, o anlisis manual, se centra en apartados propios de nuestra aplicacin en concreto como, por ejemplo, determinar si las libreras que est utilizando nuestro programa se estn utilizando debidamente o si la arquitectura de nuestro software es la correcta.

Ambos, por tanto, son complementarios. El anlisis automtico se centra nicamente en facetas de ms bajo nivel como la sintaxis y la semntica del cdigo, funcionando este anlisis en cualquier tipo de aplicacin, mientras que el anlisis manual se ocupa de facetas de ms alto nivel como, por ejemplo, la estructura de nuestra aplicacin o su manera de trabajar con otros elementos externos como las libreras. La unin de ambos tipos de anlisis nos permitir identificar los potenciales problemas a distintos niveles que generen la deuda tcnica de nuestro proyecto. Debemos, por tanto, unificar ambas para poder mejorar la base de nuestro cdigo fuente, lo cual repercutir en una mejora tanto del desarrollo como del mantenimiento de nuestro software antes incluso de llegar a ejecutarlo.

Cundo debemos hacer estos anlisis?


Ahora que conocemos las ventajas del anlisis esttico del cdigo, que sabemos lo til que es, que sabemos que existe el anlisis manual y el automtico y que sabemos que nos va a ayudar a hacer nuestros desarrollos cabe preguntarnos cada cunto debo realizar este anlisis?,

Pgina 6 de 19

Qu es el Anlisis Esttico del Cdigo?

todos los das antes de acostarme?, cada vez que escriba una nueva lnea de cdigo en mi aplicacin?, o una vez al ao que no hace dao? Debemos tener en mente que el anlisis esttico del cdigo es un medio con el que conseguir mejorar nuestro cdigo fuente, no un fin en s mismo. Debemos, por tanto, usarlo nicamente como apoyo. Una diferencia entre el anlisis automtico y el anlisis manual es el tiempo que ste tarda en realizarse. De este modo un anlisis automtico se realiza en pocos minutos mientras que uno manual puede tardar varias horas. Esto, como es natural, influye a la hora de establecer una periodicidad. Deberamos tratar de realizar el anlisis manual cada vez que vayamos a crear una nueva funcionalidad en nuestro software, preguntndonos en este caso si la arquitectura actual nos permite implementarla con facilidad, si disponemos de las libreras adecuadas o si podemos modificar la base de nuestro cdigo para facilitar el desarrollo de esta nueva funcionalidad. Es decir, lo reservaremos para situaciones concretas. Como es natural tambin podremos hacer este tipo de anlisis cuando el proyecto sencillamente va mal, cuando nos cueste mucho esfuerzo desarrollar nuevas funcionalidades o modificar las que ya tenemos o, en definitiva, cuando sintamos que las piezas del software que estamos desarrollando chirran, aunque este ltimo caso no es el deseable y es precisamente lo que queremos evitar con el anlisis esttico del cdigo.

El anlisis automtico, en cambio, puede ser realizado con una mayor periodicidad ya que no requiere de intervencin humana y, lo que es mejor, puede ser programado y repetido tantas veces como sea necesario. Adems obra con objetividad, siempre nos va a devolver la misma respuesta ante el mismo cdigo fuente de entrada.

Pgina 7 de 19

Qu es el Anlisis Esttico del Cdigo?

Sin embargo no tenemos que creernos literalmente lo que nos diga. Puede que entre sus reglas est determinada una condicin de error concreta que, en nuestro cdigo en particular, no debera ser etiquetada como tal. El caso ideal sera integrar nuestro analizador automtico con alguna opcin de integracin continua o alguna tecnologa que permita generar la aplicacin a partir de nuestro cdigo fuente. De este modo cada vez que hagamos algn cambio o que queramos generar nuestra aplicacin se ejecutar el analizador automtico y este, a su vez, nos har sugerencias.

Los desarrolladores, por lo general, cuando implementamos por completo alguna funcionalidad en nuestros ordenadores dejamos nuestro cdigo fuente en un repositorio centralizado donde el resto de desarrolladores puedan encontrarlo. Un buen momento para analizar automticamente el cdigo es el instante en el que ese cdigo pasa de estar nicamente en nuestros ordenadores a formar parte del repositorio, ya que as todo el equipo de desarrollo puede ser consciente de las posibles mejoras que se puedan realizar sobre ese cdigo. Sin embargo, es posible que queramos que el cdigo ya se encuentre mejorado antes incluso de formar parte del repositorio. Los desarrolladores disponemos, por lo general, de herramientas que transforman nuestro cdigo fuente en aplicaciones. Si utilizamos nuestro analizador automtico en nuestro propio ordenador cuando convertimos nuestro cdigo fuente en aplicaciones slo nosotros recibiremos las sugerencias y podremos seguirlas antes de poner el cdigo a disposicin de todo el equipo de desarrollo. En cualquier caso estas no son reglas de oro ya que el momento en el que se deba realizar el anlisis esttico del cdigo depender del proyecto concreto y de sus circunstancias.

Pgina 8 de 19

Qu es el Anlisis Esttico del Cdigo?

Actividades complementarias al anlisis esttico del cdigo


Sin embargo, las posibilidades de mejorar nuestra base del cdigo no quedan aqu. Hay otras tcnicas que podemos utilizar para conseguir mejorar el cdigo fuente de nuestra aplicacin y, con ello, el software que utilizan los usuarios como producto final. Estas tcnicas, al contrario que la que nos ocupa, se centran en analizar el cdigo mientras este se encuentre en ejecucin. Explicarlas excede el alcance del presente documento pero, sin embargo, se van a resumir brevemente para poder situar an mejor el anlisis esttico del cdigo dentro de su mbito: Tests. Son una serie de procesos que permiten verificar y comprobar que el software cumple con los objetivos y con las exigencias para las que fue creado. Su misin es la de encontrar errores antes de que el software final sea utilizado por los usuarios y los hay de varios tipos: unitarios, funcionales, de integracin, de carga, de regresin, etc., cada uno centrado en una faceta del software en concreto. Profiling. Se encarga de analizar el rendimiento del software mientras este se encuentra en ejecucin determinando qu recursos son utilizados en cada momento por las distintas partes del software. Con ello lo que se persigue es identificar qu partes del cdigo implican una mayor carga para el sistema para poder obrar en consecuencia aplicando cambios.

Estas tcnicas permiten encontrar errores en el software que no es posible detectar cuando se analiza estticamente el cdigo aunque, sin embargo, es posible que el anlisis esttico del cdigo nos permita corregir algunos errores antes incluso de detectarlos durante la realizacin de tests o de profiling.

Limitaciones del anlisis esttico del cdigo


Sin embargo, a pesar de sus ventajas, los analizadores estticos del cdigo tienen sus limitaciones: No nos permiten saber si el software va a hacer lo que se espera de l o no. Podemos analizar el cdigo fuente y saber cmo mejorarlo

Pgina 9 de 19

Qu es el Anlisis Esttico del Cdigo?

muchsimo, pero no sabremos si hace lo que tiene que hacer u otra cosa totalmente distinta e inesperada. Al utilizar analizadores automticos estos nos pueden devolver falsos positivos. Es posible que el analizador detecte como error algo que nosotros sabemos que est bien y que por alguna buena razn est programado as aposta. Estn limitados al anlisis de cdigo sin llegar a ejecutarlo, de tal modo que necesitamos complementarlo con tests o con profiling para poder realizar mejoras en un mbito mayor. Los analizadores estticos del cdigo estn muy ligados a lenguajes de programacin concretos, e incluso entre lenguajes hay diferencias, ya que en lenguajes estticos como java es ms sencillo hacer un anlisis esttico del cdigo que en otros lenguajes dinmicos como groovy.

Conclusiones
A lo largo de este documento hemos introducido la tcnica del anlisis esttico del cdigo, explicando para ello sus objetivos y sus metas y dividindolo entre anlisis manual y anlisis automtico, lo cual nos ha permitido determinar las diferencias de uno con respecto al otro en distintos mbitos. Tambin lo hemos englobado con otras tcnicas que permiten mejorar la base del cdigo como son los tests y el profiling, los cuales tienen su origen en la ejecucin de dicho cdigo. Es realmente importante hacer este tipo de anlisis?, deberamos realizarlo o podramos seguir como estamos?. Esta tcnica es muy sencilla de utilizar, si la automatizamos incluso podemos limitarnos a esperar sus resultados, y como podis ver nos ayuda sin pedirnos nada a cambio. En mi opinin es un tipo de anlisis que deberamos hacer. No cuesta trabajo y slo puede darnos beneficios, tanto a corto plazo mirando en el desarrollo ms inmediato como a largo plazo en vistas a un futuro mantenimiento.

Pgina 10 de 19

Qu es el Anlisis Esttico del Cdigo?

Pero, deberamos quedarnos nicamente ah?, o podemos hacer algo ms para mejorar nuestro cdigo y, con ello, nuestros desarrollos?. Si queremos mejorar la calidad de nuestros productos hacer este tipo de anlisis es un buen primer paso, pero quiz deberamos dar algn paso ms completndolo con tests e incluso con profiling. En cualquier caso, qu podemos perder con probarlo?. El coste es cero y los beneficios palpables, existe una relacin calidad/precio mejor?

Imagen: http://www.flickr.com/photos/ninjaguy82/756138395/

Pgina 11 de 19

Qu es el Anlisis Esttico del Cdigo?

Anlisis Esttico del Cdigo en Java

Una vez hemos terminado de ver qu es el anlisis esttico del cdigo vamos a centrarnos en aplicarlo sobre cdigo escrito en un lenguaje concreto: Java. Gracias a la amplia difusin de este lenguaje hay infinidad de herramientas, libreras y tecnologas que giran en torno suya. El anlisis esttico del cdigo no es una excepcin y, como veremos, hay varios analizadores automticos que nos permitirn mejorar el cdigo fuente de nuestras aplicaciones escritas en java.

Pgina 12 de 19

Qu es el Anlisis Esttico del Cdigo?

Finalmente presentaremos un producto que, como veremos, utiliza los resultados de los analizadores automticos que vamos a mostrar a continuacin y los unifica en una nica salida que pretende ser mejor que la suma de las salidas de los analizadores automticos de manera individual. Pero antes de ello conozcamos los distintos analizadores disponibles:

PMD
http://pmd.sourceforge.net/ Es una herramienta muy conocida, tanto por su facilidad de uso como por su fcil integracin con las tecnologas que estemos utilizando para desarrollar nuestro proyecto. Su funcionamiento se basa en detectar patrones, los cuales son posibles errores que pueden aparecer en tiempo de ejecucin, cdigo que no se puede ejecutar nunca porque no hay manera de llegar a l, cdigo que puede ser optimizado, expresiones lgicas que puedan ser simplificadas, malos usos del lenguaje, etc. Estos patrones se encuentran catalogados en distintas categoras, entre las cuales estaran las bsicas, las de tamao, acoplamiento, tratamiento de excepciones, nombrado, complejidad, optimizacin, seguridad, etc. http://pmd.sourceforge.net/rules/index.html Adems va ms all de lo que nicamente es la deteccin de errores en nuestro cdigo ya que tambin encuentra errores en el uso que hagamos de tecnologas como Android, JSF, JSP o JUnit. Esta herramienta es extensible y configurable ya que se pueden aadir nuevas reglas o configurar las que ya se incluyen en caso de que esto fuera necesario. Adems tambin podemos configurar el formato en el que deseamos que nos devuelva los resultados para que elijamos entre aquello que nos resulte ms cmodo: xml, html, txt, etc.

Pgina 13 de 19

Qu es el Anlisis Esttico del Cdigo?

CPD:
http://pmd.sourceforge.net/cpd.html Forma parte de PMD, aunque funciona de una manera autnoma, y es sin duda uno de los analizadores ms tiles que podamos encontrar. CPD son las siglas de Copy Paste Detector y con ese nombre queda clara cul es su misin: buscar duplicidades en el cdigo. Todo aquello que est escrito ms de una vez en nuestro cdigo ser detectado por CPD. Pero, qu sentido tiene encontrar cdigo que haya sido copiado y pegado?. Cuando hay cdigo duplicado, triplicado o n-plicado en nuestra aplicacin nos encontramos con un grave problema: si hay que hacer cambios en cdigo duplicado de la aplicacin tendremos que recorrer todo el cdigo de la misma para repercutir ese mismo cambio en todas las copias que hayamos hecho. Imaginemos un caso. Si en varios puntos de mi aplicacin necesito poder comprobar si un ao es bisiesto, tendra sentido que el mismo cdigo de la misma comprobacin apareciera copiado en varios lugares de la aplicacin?, o debera crear una zona especfica donde realizarla? Si al crear el cdigo de la comprobacin original he cometido un error y lo he copiado y pegado por todo el cdigo de mi aplicacin me encontrar con el problema de que, una vez detectado el error y subsanado en el cdigo original, deber buscar el cdigo errneo entre todos los entresijos de su cdigo fuente para poder reemplazarlo por el que resuelve el problema. Pero, quin me asegura que he encontrado todas las copias?, el problema se habr solucionado en todos los casos o funcionar en unos y fallar en otros? En cambio, si tengo ese cdigo en un nico sitio slo me tengo que preocupar de solucionar el problema en un nico punto y s que, una vez solucionado, est solucionado en todos los casos. Otro caso ficticio vendra de la mano de no utilizar el mecanismo de la herencia de Java. Si mi aplicacin necesita un tipo Jefe con nombre, DNI y departamento y un tipo Empleado con nombre, DNI y horario, necesito crear los dos tipos con nombre y DNI separados?. Si son lo mismo, por qu debera tenerlo dos veces?, o es que no debera?

Pgina 14 de 19

Qu es el Anlisis Esttico del Cdigo?

Por suerte puedo crear el tipo Persona, con nombre y DNI, y crear los tipos Jefe y Empleado que hereden de Persona, de tal modo que estos tipos ya tengan nombre y DNI por heredar de Persona. As slo tengo que tenerlo en un nico sitio, en Persona. Los problemas derivados de la funcin copiar y pegar tienen su solucin en su funcin hermana: cortar y pegar: Si inicialmente slo necesitbamos comprobar si un ao es bisiesto en un punto y, posteriormente, necesitamos hacer esta comprobacin en ms sitios lo que tenemos que hacer es mover la comprobacin a un lugar ms adecuado. Para ello cortamos y pegamos el cdigo en un sitio comn a todos los puntos y, desde ellos, invocamos la validacin. Si inicialmente nuestra aplicacin slo tenia jefes y posteriormente se aadieron los empleados, lo que tenemos que hacer es crear un nuevo tipo y all cortamos y pegamos lo que ambos tengan en comn.

Al igual que PMD, CPD permite devolver los resultados de sus anlisis en varios formatos, como por ejemplo xml o txt.

Checkstyle
http://checkstyle.sourceforge.net/ Inicialmente se desarroll con el objetivo de crear una herramienta que permitiese comprobar que el cdigo de nuestras aplicaciones se ajustase a los estndares dictados por Sun Microsystems, empresa creadora del lenguaje Java. Sin embargo, posteriormente se aadieron nuevas capacidades que han hecho que sea un producto muy similar a PMD. Es por ello que tambin busca patrones en el cdigo que se ajustan a categoras muy similares a las de este analizador. Una ventaja que tiene con respecto a PMD es que adems encuentra errores en la documentacin que podamos haber escrito en el javadoc. PMD no realiza ningn tipo de validacin mientras que Checkstyle es muy riguroso en ese sentido.

Pgina 15 de 19

Qu es el Anlisis Esttico del Cdigo?

Gracias a ello, si tenemos una funcin recibe dos parmetros y documentamos uno o ninguno, Checkstyle nos avisar de que estamos dejando parte de la funcin sin documentar.

Findbugs
http://findbugs.sourceforge.net/ Es un producto de la Universidad de Maryland que, como su nombre indica, est especializado en encontrar errores. Al igual que los dems tiene una serie de categoras donde poder catalogar dichos errores, y es que segn findbugs estos pueden ser malas prcticas, mal uso del lenguaje, internacionalizacin, posibles vulnerabilidades, mal uso de multihilo, rendimiento, seguridad o, directamente, chapuzas. http://findbugs.sourceforge.net/bugDescriptions.html

Otras herramientas
En esta lista faltara por mencionar Crap4J, que es un producto de Agitar Software cuya funcin es la de tratar de descubrir qu parte de nuestro cdigo es muy difcil de modificar: http://www.crap4j.org/ http://adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=crap4j Para ello utiliza, por un lado, el nmero de bifurcaciones de los fragmentos de cdigo y, por el otro, hasta qu punto stos estn cubiertos por tests unitarios. Lo he dejado apartado ya que los tests deben ejecutar el cdigo y se salen, por tanto, de las tcnicas de anlisis esttico del cdigo. Una herramienta muy interesante, la cual he introducido al comenzar este apartado dedicado a Java, es Sonar: http://sonar.codehaus.org/ Su misin es la que aparece en la pgina web: Pon tu deuda tcnica bajo control En su demo podemos verlo en accin analizando muchos proyectos open source:

Pgina 16 de 19

Qu es el Anlisis Esttico del Cdigo?

http://nemo.sonarsource.org/ Si vemos los resultados para Checkstyle, veremos lo siguiente: http://nemo.sonarsource.org/project/index/136602 Sonar internamente utiliza las herramientas comentadas anteriormente: PMD, CPD, Findbugs, checkstyle, etc. y unifica sus resultados mostrando, adems, ms informacin: complejidad, nmero de mtodos, de clases, de lneas de cdigo, mantenibilidad, etc. Todo de una manera muy visual y muy intuitiva. Si ests desarrollando proyectos con Java ests ante una herramienta absolutamente imprescindible.

Imagen: http://www.flickr.com/photos/dodogoeslr/2858347645/

Pgina 17 de 19

Qu es el Anlisis Esttico del Cdigo?

Anlisis Esttico del Cdigo en Groovy

Groovy es un lenguaje de programacin bastante reciente, dinmico, muy expresivo, productivo y con caractersticas similares a otros lenguajes como Ruby o Python que funciona bajo la mquina virtual de Java. http://groovy.org/ http://www.escueladegroovy.com/ A pesar de su ser un lenguaje nuevo, o posiblemente debido a ello, no hay muchos analizadores estticos del cdigo para este lenguaje. Al contrario de lo que ocurra con Java, Groovy es un lenguaje dinmico, lo cual dificulta en parte la tarea de analizar el cdigo. Sin embargo contamos con un analizador: codenarc.

Codenarc
http://codenarc.sourceforge.net/ http://raulexposito.com/blog/2009/11/analiza-tu-codigo-fuente-groovycon-codenarc/

Pgina 18 de 19

Qu es el Anlisis Esttico del Cdigo?

Segn cuentan en su pgina web, codenarc es un analizador inspirado en PMD y en Checkstyle entre otros. Es por ello que sus reglas son similares a las de los analizadores anteriores, ya que posee reglas dedicadas a encontrar potenciales problemas en cosas bsicas del uso del lenguaje, en excepciones, en carga de otras clases, en cdigo sin utilizar, etc. Su uso es muy sencillo, ya que se puede integrar fcilmente con tecnologas que usan groovy como base como son Grails y Griffon, aunque tambin puede ser ejecutado directamente desde la consola. Es un analizador muy til para un lenguaje muy interesante que est en pleno crecimiento. Espero que crezca y que aparezcan otros analizadores alternativos con los que poder mejorar nuestros desarrollos escritos en groovy.

Imagen: http://www.flickr.com/photos/tussenpozen/31414294/

Pgina 19 de 19

Das könnte Ihnen auch gefallen