Opal es una biblioteca extensible para analizar e ingeniería de Bytecode Java. Opal está completamente escrito en Scala y aprovecha las características avanzadas del lenguaje de Scala para proporcionar un nivel nuevo y previamente invisible de flexibilidad y facilidad de uso. Opal fue diseñado desde cero con extensibilidad , adaptabilidad y escalabilidad (memoria y rendimiento) en mente. Muchas partes de Opal ya están en paralelo, proporcionan la infraestructura necesaria para implementar análisis altamente concurrentes o son al menos seguros de hilo.
Opal consta de varios proyectos:
Común (Opal/Common): contiene funciones útiles generales, estructuras de datos (p. Ej., TriEmaps) y algoritmos gráficos (por ejemplo, calcular componentes fuertemente conectados, calcular la información del dominador, etc.) útiles al analizar el código (byte).
Infraestructura de análisis estático (OPAL/SI): contiene un marco genérico basado en la red para la implementación de análisis estáticos modularizados.
Infraestructura de Bytecode (Opal/BI): la infraestructura necesaria para analizar Java 1.0 - Java 16 bytecode.
Bytecode Dissembler (Opal/DA): un desapsilador Java Bytecode que proporciona una representación individual del archivo de clase y que puede usarse para crear representaciones HTML legibles de los archivos de clase Java.
Bytecode Creator (Opal/BC): la infraestructura más básica para diseñar Java Bytecode.
Representación de Bytecode (Opal/BR): representación base de Opal del bytecode Java. Implementa toda la funcionalidad para hacer análisis básicos de los archivos de clase Java.
Marco de interpretación abstracta (OPAL/AI): implementación de un marco basado en la interpretación abstracta que puede usarse para implementar fácilmente análisis en diferentes niveles de precisión.
Tres código de dirección (OPAL/TAC): proporciona dos representación intermedia basada en el código de 3 direcciones. Uno ingenuo que se crea directamente en función del bytecode, y una representación similar a SSA de nivel superior que proporciona directamente una información CFG y de uso definido utilizando los resultados de una interpretación abstracta básica.
Extracción de dependencias (OPAL/DE): proporciona soporte para extraer y analizar las dependencias del código fuente de un proyecto. Este proyecto es la base de proyectos para, por ejemplo, verificar las arquitecturas.
Validación de arquitectura (OPAL/AV): un pequeño marco para verificar la arquitectura implementada de un proyecto contra una especificada.
Framework (Opal/Framework): básicamente solo agrega todos los subproyectos para que sea posible obtener fácilmente una instantánea consistente de todos los subproyectos. En general, se recomienda declarar una dependencia de este proyecto cuando desea usar OPAL.
Demos (Opal/Demos): contiene muestras de código de trabajo que demuestran cómo usar OPAL. El código en el proyecto de demostración se entiende principalmente como un recurso docente. Para comenzar los ejemplos, inicie la consola sbt (herramientas de compilación de Scala) y cambie el proyecto actual a "demostraciones" ( project Demos ). Después de eso, puede run varios análisis de demostración pequeños.
Hermes (Opal/Tools/Hermes): un marco para ejecutar varias consultas de código contra conjuntos de proyectos.
BugPicker (Opal/Herramientas/BP): una herramienta para encontrar problemas dependientes de control/flujo de datos en el código fuente. El tipo de problemas que se identifican van desde verificaciones defensivas inútiles hasta errores que conducen a excepciones de tiempo de ejecución (no controladas).
Opal también viene con un número creciente de herramientas que están destinadas a ayudar a los desarrolladores a familiarizarse con Java Bytecode y/o Opal. Estos proyectos se encuentran en la carpeta DEVELOPING_OPAL/tools y se pueden ejecutar utilizando la consola SBT.
Lo siguiente se aplica a la rama "maestro/desarrollo".
Opal usa SBT como su herramienta de compilación y trabajar con Opal es particularmente fácil usando la consola SBT. Asegúrese de tener Java 8 al menos actualización 171, Scala 2.12.13 y SBT 1.4.6 Instalado y en ejecución y que SBT puede usar al menos 4 GB de RAM (-xmx4g). Descargue una instantánea reciente de Opal o clone el repositorio. Vaya a la carpeta de raíz de Opal.
sbt cleanBuild . Esto compila todos los proyectos principales (incluidas las pruebas), genera la documentación de Scaladoc en todo el proyecto y publica el proyecto a su directorio local Ivy.local.sbt y especifique las dos propiedades del sistema ( JAVA_OPTS ): -Dorg.opalj.threads.CPUBoundTasks=8 -Dorg.opalj.threads.IOBoundTasks=24 - Establezca los valores apropiados para su máquina IOBoundTasks === "Number of (hyperthreaded) cores * 1 .5" CPUBoundTasks === "Number of real CPUs (Cores)" . IOBoundTasks === "Number of (hyperthreaded) cores * 1 .5" ). También puede establecer estas propiedades cuando usa SBT escribiendo:eval sys.props("org.opalj.threads.CPUBoundTasks") = "1" .sbt test para ejecutar las pruebas unitarias y probar que todo funciona como se esperaba. Tenga en cuenta que algunas pruebas generan una salida adicional (de color). Sin embargo, siempre que todas las pruebas tengan éxito sin un error, todo está bien. Si sbt test falla, puede deberse a una memoria insuficiente. En este caso, es necesario iniciar SBT con más memoria.sbt it:test para ejecutar el conjunto de pruebas de integración. La ejecución de este conjunto de pruebas puede llevar mucho tiempo (en un escritorio rápido con 32 GB y 8 núcleos, se necesitan ~ 2h).Estás listo para ir.
Solución de problemas
Cuando encuentre problemas en la construcción de OPAL, considere las siguientes opciones.
Para comenzar, vaya a la página web del proyecto. Además, el código en el proyecto Demos contiene muchos ejemplos cortos (ER) que demuestran cómo resolver tareas comúnmente recurrentes. La mayoría de los ejemplos se pueden ejecutar directamente.
Comience la consola SBT. (En la carpeta raíz de Opal, llame sbt en la línea de comando). Cambie el proyecto a demostraciones utilizando las project Demos de comando y el tipo run para ejecutar una de las demostraciones.