O OPAL é uma biblioteca extensível para analisar e engenharia Java ByteCode. O Opal está completamente escrito em Scala e aproveita os recursos avançados de linguagem da Scala para fornecer um nível novo e inadequado de flexibilidade e facilidade de uso. A OPAL foi projetada desde o início, com extensibilidade , adaptabilidade e escalabilidade (memória e desempenho) em mente. Muitas partes da OPAL já estão paralelizadas, fornecem a infraestrutura necessária para implementar análises altamente simultâneas ou são pelo menos seguras de threads.
Opala consiste em vários projetos:
Comum (Opal/Common): contém funções úteis gerais, estruturas de dados (por exemplo, Triemaps) e algoritmos de gráfico (por exemplo, computação componentes fortemente conectados, informações sobre o domínio do domínio, etc.) úteis ao analisar o código (byte).
Infraestrutura de análise estática (OPAL/SI): contém uma estrutura genérica baseada em treliça para a implementação de análises estáticas modularizadas.
Infraestrutura de ByteCode (OPAL/BI): A infraestrutura necessária para analisar Java 1.0 - Java 16 bytecode.
ByteCode Desmontingbler (OPAL/DA): um desmontador Java Bytecode que fornece uma representação individual do arquivo de classe e que pode ser usado para criar representações HTML legíveis dos arquivos de classe Java.
ByteCode Creator (OPAL/BC): a infraestrutura mais básica para projetar o Java Bytecode.
Representação de ByteCode (OPAL/BR): Representação base da OPAL do Java ByteCode. Implementa toda a funcionalidade para fazer análises básicas dos arquivos de classe Java.
Estrutura de interpretação abstrata (OPAL/AI): Implementação de uma estrutura abstrata baseada em interpretação que pode ser usada para implementar facilmente análises em diferentes níveis de precisão.
Três Código de Endereço (OPAL/TAC): fornece duas representação intermediária baseada em código de 3,4 Ades. Um ingênuo que é criado diretamente com base no bytecode e uma representação do tipo SSA de nível superior que fornece diretamente um CFG, bem como informações de uso definido usando os resultados de uma interpretação abstrata básica.
Extração de dependências (OPAL/DE): fornece suporte para extrair e analisar as dependências de código -fonte de um projeto. Este projeto é a base para os projetos, por exemplo, verificar arquiteturas.
Validação da Arquitetura (OPAL/AV): Uma pequena estrutura para verificar a arquitetura implementada de um projeto em relação a uma especificada.
Framework (OPAL/Framework): basicamente apenas agrega todos os subprojetos para possibilitar obter facilmente um instantâneo consistente de todos os subprojetos. Em geral, é recomendável declarar uma dependência deste projeto quando você deseja usar o OPAL.
Demonstrações (Opal/demos): contém amostras de código de trabalho que demonstram como usar o OPAL. O código no projeto de demonstração é principalmente como um recurso de ensino. Para iniciar os exemplos, inicie o sbt Console (Scala Build Tools) e altere o projeto atual para "demos" ( project Demos ). Depois disso, você pode run várias pequenas análises de demonstração.
Hermes (Opal/Tools/Hermes): uma estrutura para executar várias consultas de código contra conjuntos de projetos.
Bugpicker (opala/ferramentas/bp): uma ferramenta para encontrar problemas dependentes de controle/fluxo de dados no código-fonte. O tipo de questões identificadas variam de verificações defensivas inúteis a bugs que levam a exceções de tempo de execução (não tratadas).
A Opal também vem com um número crescente de ferramentas destinadas a ajudar os desenvolvedores a se familiarizarem com o Java ByteCode e/ou Opal. Esses projetos são encontrados na pasta DEVELOPING_OPAL/tools e podem ser executados usando o console SBT.
O seguinte se aplica à filial "Master/Develop".
O Opal usa o SBT como ferramenta de construção e o trabalho com o OPAL é particularmente fácil usando o console SBT. Certifique-se de ter Java 8 pelo menos atualizar 171, Scala 2.12.13 e SBT 1.4.6 instalados e em execução e que o SBT pode usar pelo menos 4 GB de RAM (-xmx4g). Faça o download de um instantâneo recente da Opal ou clone o repositório. Vá para a pasta raiz da Opal.
sbt cleanBuild . Isso compila todos os projetos principais (incluindo testes), gera a documentação do ScalAdoc em todo o projeto e publica o projeto no diretório local da hera.local.sbt e especifique as duas propriedades do sistema ( JAVA_OPTS ): -Dorg.opalj.threads.CPUBoundTasks=8 -Dorg.opalj.threads.IOBoundTasks=24 - Defina os valores apropriados para a sua máquina ( CPUBoundTasks === "Number of real CPUs (Cores)" IOBoundTasks === "Number of (hyperthreaded) cores * 1 .5" ). Você também pode definir essas propriedades ao usar o SBT digitando:eval sys.props("org.opalj.threads.CPUBoundTasks") = "1" .sbt test para executar os testes da unidade e testar que tudo funciona conforme o esperado. Observe que alguns testes geram alguma saída adicional (colorida). No entanto, desde que todos os testes sejam bem -sucedidos sem um erro, está tudo bem. Se sbt test falhar, pode ser devido à memória insuficiente. Nesse caso, é necessário iniciar o próprio SBT com mais memória.sbt it:test para executar o conjunto de testes de integração. A execução deste conjunto de testes pode demorar muito (em uma área de trabalho rápida com 32 GB e 8 núcleos, leva ~ 2H).Você está pronto para ir.
Solução de problemas
Quando você encontrar problemas na construção da OPAL, considere as seguintes opções.
Para começar, vá para a página do projeto. Além disso, o código no projeto Demos contém muitos exemplos curtos (ER) que demonstram como resolver tarefas comumente recorrentes. A maioria dos exemplos pode ser executada diretamente.
Inicie o console do SBT. (Na pasta raiz da Opal, chamada sbt na linha de comando.) Altere o projeto para demos usando as project Demos de comando e o tipo run para executar uma das demos.