Une trancheuse de programme pour Java, basée sur le graphique de dépendance du système (SDG). Le découpage du programme est une technique d'analyse logicielle pour extraire le sous-ensemble d'instructions qui sont pertinentes pour la valeur d'une variable dans une déclaration spécifique (le critère de tranchage ). Le sous-ensemble des instructions est appelé tranche , et il peut être utilisé pour le débogage, la parallélisation, la détection des clones, etc. Ce référentiel contient deux modules:
sdg-core , une bibliothèque qui obtient des tranches du code source Java via le SDG, une structure de données qui représente les instructions en tant que nœuds et leurs dépendances en tant qu'arcs.sdg-cli , un client de ligne de commande pour sdg-core , qui prend en entrée un programme Java et le critère de tranchage, et publie la tranche correspondante. AVERTISSEMENT: Tous les appels de méthode doivent se résoudre à une déclaration de méthode. Si votre programme Java nécessite des bibliothèques supplémentaires, leur code source doit être disponible et inclus dans l'analyse avec l'option -i . Tout appel de méthode qui ne peut pas être résolu entraînera une erreur d'exécution.
JavasdgsLicer gère ses dépendances via Maven, vous devez donc faire installer le JDK (≥11) et Maven, puis exécuter
mvn package -Dmaven.test.skip
Un gros pot contenant toutes les dépendances du projet peut ensuite être situé à ./sdg-cli/target/sdg-cli-{version}-jar-with-dependencies.jar {version }-jar-with-dependces.jar.
Le critère de découpage peut être spécifié avec le Flag -c {file}#{line}:{var} , où le fichier, la ligne et la variable peuvent être spécifiés. Si la variable apparaît plusieurs fois dans la ligne donnée, toutes seront sélectionnées.
Si nous souhaitons couper le programme suivant en ce qui concerne sum variable à la ligne 11,
public class Example {
public static void main(String[] args) {
int sum = 0;
int prod = 0;
int i;
int n = 10;
for (i = 0; i < 10; i++) {
sum += 1;
prod += n;
}
System.out.println(sum);
System.out.println(prod);
}
}
Le programme peut être enregistré dans Example.java , et la trancheuse fonctionne avec:
java -jar sdg-cli.jar -c Example.java#11:sum
Une description plus détaillée des options disponibles peut être vue avec:
java -jar sdg-cli.jar --help
Notre trancheuse exige que le programme Java d'entrée soit compilable, de sorte que toutes les bibliothèques doivent être fournies à l'aide du drapeau -i . Pour les cas où le code source n'est pas disponible, vous pouvez inclure les bibliothèques requises dans le chemin de classe Java en utilisant l'appel suivant:
java -cp your-libraries.jar -jar sdg-cli.jar -c Example.java#11:sum
Cette approche produit des tranches de qualité inférieure, car le contenu des appels de la bibliothèque n'est pas connu.
Un bon exemple d'utilisation de sdg-core pour obtenir une tranche à partir du code source est disponible sur Slicer.java # Slice (), où les étapes suivantes sont effectuées:
CompilationUnit .SlicingCriterion est créé, à partir des arguments d'entrée, et la tranche est obtenue.CompilationUnit (chacune représentant un fichier).CompilationUnit est jeté dans leur fichier correspondant. Si le graphique est intéressant, il peut être sorti au format dot ou PDF via SDGLog#generateImages() , comme on peut le voir dans phpslice.java # 124 (cette classe présente un frontage pour un slicer Java Web non publié).