OPAL est une bibliothèque extensible pour analyser et génie des bytecode Java. Opal est complètement écrit dans Scala et exploite les fonctionnalités de langage avancées de Scala pour fournir un nouveau niveau de flexibilité et de facilité d'utilisation auparavant invisible. Opal a été conçu à partir de zéro avec une extensibilité , une adaptabilité et une évolutivité (mémoire et performance) à l'esprit. De nombreuses parties de l'Opal sont déjà parallélisées, fournissent l'infrastructure nécessaire pour mettre en œuvre des analyses très concurrentes ou au moins une file d'attente.
Opal se compose de plusieurs projets:
Common (OPAL / Common): contient des fonctions générales utiles, des structures de données (par exemple Triemaps) et des algorithmes graphiques (par exemple, le calcul des composants fortement connectés, des informations sur la domination du calcul, etc.) utiles lors de l'analyse du code (octet).
Infrastructure d'analyse statique (OPAL / SI): contient un cadre générique basé sur un réseau pour la mise en œuvre d'analyses statiques modularisées.
Infrastructure bytecode (OPAL / BI): l'infrastructure nécessaire pour l'analyse de Java 1.0 - Java 16 Bytecode.
ByteCode Demoubler (OPAL / DA): un désassembleur Java Bytecode qui fournit une représentation individuelle du fichier de classe et qui peut être utilisée pour créer des représentations HTML lisibles des fichiers de classe Java.
ByteCode Creator (OPAL / BC): l'infrastructure la plus basique pour ingénieur Java Bytecode.
Représentation bytecode (OPAL / BR): Représentation de base d'Opal de Java Bytecode. Implémente toutes les fonctionnalités pour effectuer des analyses de base des fichiers de classe Java.
Cadre d'interprétation abstrait (OPAL / AI): mise en œuvre d'un cadre basé sur l'interprétation abstrait qui peut être utilisé pour mettre en œuvre facilement des analyses à différents niveaux de précision.
Code de trois adresses (OPAL / TAC): fournit deux représentation intermédiaire basée sur le code à 3 address. Un naïf qui est directement créé sur la base du bytecode et une représentation de type SSA de niveau supérieur qui fournit directement un CFG ainsi que des informations d'utilisation DEF en utilisant les résultats d'une interprétation abstraite de base.
Extraction des dépendances (OPAL / DE): prend en charge l'extraction et l'analyse des dépendances du code source d'un projet. Ce projet est la base des projets, par exemple, de vérifier les architectures.
Validation de l'architecture (OPAL / AV): un petit cadre pour vérifier l'architecture implémentée d'un projet contre une architecture spécifiée d'un projet.
Framework (OPAL / Framework): en gros, il suffit d'agréger tous les sous-projets pour permettre d'obtenir facilement un instantané cohérent de tous les sous-projets. En général, il est recommandé de déclarer une dépendance à ce projet lorsque vous souhaitez utiliser OPAL.
Démos (opale / démos): contient des échantillons de code de travail qui démontrent comment utiliser OPAL. Le code du projet de démonstration est principalement destiné à une ressource d'enseignement. Pour démarrer les exemples, démarrez la console sbt (Scala Build Tools) et modifiez le projet actuel en "démos" ( project Demos ). Après cela, vous pouvez run plusieurs petites analyses de démonstration.
Hermès (Opal / Tools / Hermès): un cadre pour exécuter diverses requêtes de code contre des ensembles de projets.
BugPicker (Opal / Tools / BP): un outil pour trouver des problèmes dépendants de la commande / du flux de données dans le code source. Le type de problèmes identifiés varient des vérifications défensives inutiles aux bogues qui conduisent à des exceptions d'exécution (non gérées).
Opal est également livré avec un nombre croissant d'outils qui sont destinés à aider les développeurs à se familiariser avec Java Bytecode et / ou Opal. Ces projets se trouvent dans le dossier DEVELOPING_OPAL/tools et peuvent être exécutés à l'aide de la console SBT.
Ce qui suit s'applique à la branche "Master / Develop".
OPAL utilise SBT comme outil de construction et travailler avec OPAL est particulièrement facile à l'aide de la console SBT. Assurez-vous d'avoir Java 8 au moins Update 171, Scala 2.12.13 et SBT 1.4.6 installés et en cours d'exécution et que SBT peut utiliser au moins 4 Go de RAM (-xmx4g). Téléchargez un instantané récent d'Opal ou clone le référentiel. Allez dans le dossier racine d'Opal.
sbt cleanBuild . Cela compile tous les projets principaux (y compris les tests), génère la documentation Scaladoc à l'échelle du projet et publie le projet vers votre répertoire IVY local.local.sbt et spécifiez les deux propriétés du système ( JAVA_OPTS ): -Dorg.opalj.threads.CPUBoundTasks=8 -Dorg.opalj.threads.IOBoundTasks=24 IOBoundTasks === "Number of (hyperthreaded) cores * 1 .5" = 24 - Définissez les valeurs appropriées pour votre machine ( CPUBoundTasks === "Number of real CPUs (Cores)" IOBoundTasks === "Number of (hyperthreaded) cores * 1 .5" ). Vous pouvez également définir ces propriétés lorsque vous utilisez SBT en tapant:eval sys.props("org.opalj.threads.CPUBoundTasks") = "1" .sbt test pour exécuter les tests unitaires et tester que tout fonctionne comme prévu. Veuillez noter que certains tests génèrent une sortie supplémentaire (colorée). Cependant, tant que tous les tests réussissent sans erreur, tout va bien. Si sbt test échoue, cela peut être dû à une mémoire insuffisante. Dans ce cas, il est nécessaire de démarrer SBT lui-même avec plus de mémoire.sbt it:test pour exécuter la suite de test d'intégration. L'exécution de cette suite de test peut prendre très longtemps (sur un bureau rapide avec 32 Go et 8 cœurs, il faut ~ 2h).Vous êtes prêt à partir.
Dépannage
Lorsque vous rencontrez des problèmes dans le bâtiment OPAL, veuillez considérer les options suivantes.
Pour commencer, accédez à la page Web du projet. De plus, le code du projet Demos contient de nombreux exemples courts (er) qui montrent comment résoudre des tâches couramment récurrentes. La plupart des exemples peuvent être directement exécutés.
Démarrez la console SBT. (Dans le dossier racine d'Opal, appelez sbt sur la ligne de commande.) Changez le projet en démos à l'aide des project Demos de commande et Type run pour exécuter l'une des démos.