Discussion:
[ANN] Archicheck v 0.4.0
(trop ancien pour répondre)
Lionel Draghi
2017-11-17 21:50:12 UTC
Permalink
Bonjour à tous,

nouvelle version d’ArchiCheck (http://lionel.draghi.free.fr/Archicheck/index.html).

Depuis l’annonce précédente, les points principaux :
- migration sur github, https://github.com/LionelDraghi/ArchiCheck (avec tout
l’historique Darcs depuis 2005) ;
- pas mal de refactoring dans le code, avec l’utilisation d’OpenToken pour
parser le ficher de règles, le pluggin du multi-langage, le début de
l’utilisation de trait d’Ada 2012, etc. ;
- un test sur un logiciel réel et un peu plus substantiel que mes tests
précédents avec quelques packages : GtkAda.

Pour rappel, l’outil vérifie que le code respecte bien des décisions d’architecture que l’on ne sait pas exprimer dans la sémantique du langage.
Gtk is a layer over Gdk
(ce qui est plus ou moins vrai, cf. https://www.gtk.org/overview.php, mais c’est juste un test!)

Et en l’occurrence, le résultat sur la version de GtkAda installée sur ma Debian, c’est que 5 packages de Gdk utilisent des packages de Gtk (qui est censé être au-dessus).
NB : c’est juste un test case, je ne critique pas les décisions de design ou de codage de GtkAda, dont j’ignore tout.
(et en plus, de mémoire, il me semble que pour certaines des dépendances c’est un point identifié dans le code comme temporaire, en attendant l’utilisation d’un service équivalent dans Glib)

Lionel
g***@hotmail.com
2017-11-21 22:45:03 UTC
Permalink
Salut,

Quelle est la version minimale de GNAT pour construire ArchiCheck ?
GNAT GPL 2016 s'arrête sur:

opentoken-production-parser-lalr-parser_lists.adb:487:26
access discriminant in return aggregate would be a dangling reference

Ou alors j'utilise la mauvaise version d'OpenToken ?
(J'ai récupéré la 6.0b sur http://stephe-leake.org/ada/opentoken.html )
_________________________
Gautier's Ada programming
http://gautiersblog.blogspot.com/search/label/Ada
NB: Pour une réponse directe, adresse e-mail valable par le lien ci-dessus
Lionel Draghi
2017-11-30 21:57:10 UTC
Permalink
Hello Gautier,

j'utilise les packages Debian.

$ gnat --version
donne "GNAT 6.3.0"

Et le package de la lib OpenToken est en version 6.0b-5+b2, j'ai donc l'impression que c'est bien la 6.0b...

Tu compiles avec mon gpr?

Lionel
g***@hotmail.com
2017-12-01 15:50:34 UTC
Permalink
Post by Lionel Draghi
Tu compiles avec mon gpr?
Oui... avec une toute petite modification (pour pouvoir GNATer en nomade sur une machine Windows "invitée"):

Dans le répertoire ArchiCheck, je mets un sous-répertoire "ot" avec OpenToken 6.0b. La première ligne de archicheck.gpr devient:

with "ot/build/opentoken.gpr";

Voilà tout (ou presque: il faut corriger qqes lignes de opentoken.gpr pour qu'il trouve les sources au bon endroit, etc.)

J'obtiens la même erreur de compilation au même endroit avec GNAT GPL 2017.
g***@hotmail.com
2017-12-01 15:53:57 UTC
Permalink
Post by g***@hotmail.com
J'obtiens la même erreur de compilation au même endroit avec GNAT GPL 2017.
Est-ce qu'il y aurait un lien vers les sources d'OpenToken sur Debian ?
Lionel Draghi
2017-12-01 20:27:45 UTC
Permalink
Je ne sais pas ou trouver les sources en ligne, mais je t'ai fait un zip : http://ovh.to/q6t1KDD

En cherchant, j'ai vu qu'en Debian "testing", il y a un package 6.0b-7 plus récent que ma version "stable" 6.0b-5, mais pas sûr que les évolutions concernent les sources.

Je vais essayer de les récupérer, et je fais un diff.
Lionel Draghi
2017-12-01 20:31:10 UTC
Permalink
Ah si, j'ai trouvé, il y a un lien vers les sources utilisés pour faire le package en bas de cette page : https://packages.debian.org/source/sid/libs/opentoken
Lionel Draghi
2017-12-01 20:36:01 UTC
Permalink
Bingo, Il y a un seul patch, et c'est précisément sur la ligne de ton erreur!

Description: Work around GCC bug 70867.
Bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70867
Forwarded: by mail 2016/04/28
Author: Nicolas Boulenguez ....

--- a/opentoken-production-parser-lalr-parser_lists.adb
+++ b/opentoken-production-parser-lalr-parser_lists.adb
@@ -484,7 +484,7 @@
is
pragma Unreferenced (Container);
begin
- return (Element => Position.Item'Access);
+ return (Element => Position.all.Item'Access);
end Constant_Reference;

type List_Access_Constant is access constant List;
g***@hotmail.com
2017-12-01 21:37:46 UTC
Permalink
Giga!
Entre-temps j'ai pu compiler le tout (en réduisant opentoken.gpr à: project opentoken is for Source_Dirs use ("opentoken"); end opentoken;), ça compile comme sur des roulettes.
J'ai testé l'outil sur Zip-Ada, voici ce qu'il en dit (attention: j'y suis allé au pifomètre, je n'ai sûrement pas compris toutes les finesses)...

rules.txt:
Zip is a layer over Zip_Streams
UnZip is a layer over Zip_Streams
UnZip is a layer over Zip

archicheck rules.txt -I ./zip_lib

Qqes observations:
1) J'ai une série de "Warning : Unknown Ada Unit" pour
length_limited_huffman_code_lengths.adb
length_limited_huffman_code_lengths.ads
zip-compress-deflate.adb
zip-compress-deflate.ads
zip-compress-lzma_e.adb
zip-compress-lzma_e.ads
zip-compress-reduce.adb
zip-compress-reduce.ads
zip-compress-shrink.adb
zip-compress-shrink.ads

qui sont procédures ou bien génériques ou privées; je devine que ce n'est pas encore reconnu par archicheck ?

2) Y a-t-il moyen d'ignorer certains Ada.* (Exemple: "Warning : Zip.Create (in Zip layer) uses Ada.Exceptions") ? Ou alors on met des "X is a layer over Ada" ?

3) Ceci me semble plus mystérieux:
Warning : UnZip is neither in Zip or Zip_Streams layer, and so shall not directly use Zip_Streams in the Zip_Streams layer

Doc à lire plus soigneusement... La nuit porte conseil...
Lionel Draghi
2017-12-02 00:05:50 UTC
Permalink
AH, génial, un vrai test case! :-)
Post by g***@hotmail.com
Zip is a layer over Zip_Streams
UnZip is a layer over Zip_Streams
UnZip is a layer over Zip
Il y a un problème dans cette description : les couches sont entendues au sens strict, c'est à dire comme le seul moyen d'accès à ce qui est en dessous.

Si Zip est une couche au dessus de Zip_Streams, alors UnZip ne peut pas l'être aussi.

Je n'ai pas implémenté de vérification de la sémantique des rules, mais c'est à ce niveau qu'il devrait y avoir un warning.

Pour l'instant on peut décrire :

+------------------------+
| A |
+------------------------+
+------------------------+
| B |
+------------------------+
+------------------------+
| C |
+------------------------+

Mais pas :

+----------++------------+
| A || B |
+----------++------------+
+------------------------+
| C |
+------------------------+

et encore moins d'autres architectures plus complexes.

...
Post by g***@hotmail.com
1) J'ai une série de "Warning : Unknown Ada Unit" pour
...
Post by g***@hotmail.com
qui sont procédures ou bien génériques ou privées; je devine que ce n'est pas encore reconnu par archicheck ?
Oui, c'est sur ma todo, je ne traite que les packages pour l'instant.
Post by g***@hotmail.com
2) Y a-t-il moyen d'ignorer certains Ada.* (Exemple: "Warning : Zip.Create (in Zip layer) uses Ada.Exceptions") ? Ou alors on met des "X is a layer over Ada" ?
Pas encore implémenté, mais c'est aussi sur ma todo, absolument indispensable!
Post by g***@hotmail.com
Warning : UnZip is neither in Zip or Zip_Streams layer, and so shall not directly use Zip_Streams in the Zip_Streams layer
C'est une conséquence du premier point, le modèle stricte de couche : si A est une couche au dessus de B, alors tout package qui utilise B ou un de ses fils est forcément soit dans B, soit dans A.
Illustration graphique ici : http://lionel.draghi.free.fr/Archicheck/files3/05_Layer_Rule/testrec-txt.html, voir le test qui s'appelle "Layer bridging test".

Pour l'instant, j'ignore les flopées de warnings inutiles résultants des 2) et 3) en utilisant -q, mais ce n'est qu'un palliatif.

Merci beaucoup pour ce retour, je vais traiter ces points avant d'aller plus avant sur la prise en compte de Java.
--
-- Lionel
Lionel Draghi
2017-12-30 21:18:08 UTC
Permalink
Hello,

je pense avoir traité tous les points dans la version courante (v0.5) :
- prise en compte de tous les types de compilation unit Ada;
- ajout d'une syntaxe pour autoriser certaines unités : Ada.Exceptions is
allowed;
- ajout d'une syntaxe moins contraignante que "layer" pour dire qu'un composant
est au-dessus d'un autre : Zip may use Zip_Streams

On peut donc maintenant décrire :
+----------++------------+
| A || B |
+----------++------------+
+------------------------+
| C |
+------------------------+
Avec :
A may use C
B may use C

Ou bien, si aucun autre composant que A et B n'est censé utiliser C, avec :
My_Layer contains A and B
My_Layer is a layer over C


Lionel

Continuer la lecture sur narkive:
Loading...