logo Adalog
code Ada logo AdaControl

AdaControl

Version 1.18r9 du 10/11/2016

AdaControl est un outil libre (GMGPL) qui détecte la présence de toutes sortes de constructions dans les programmes Ada. Son but premier est de contrôler l'application de règles de style ou de programmation, mais il peut être aussi utilisé comme un puissant outil pour rechercher l'utilisation (ou la non-utilisation) de nombreuses formes ou modèles de programmation. Les éléments recherchés peuvent être très simples, comme l'occurrence de certaines entités, déclarations ou instructions, ou très sophistiqués, comme la vérification du respect de véritables "design patterns".

Les éléments à rechercher sont définis par des règles; le tableau ci-dessous résume brièvement les règles actuellement vérifiées par AdaControl. Le chiffre entre parenthèses indique que cette règle comporte un certain nombre de sous-règles. Compte tenu de celles-ci, il y a en fait 532 tests qui peuvent être aujourd'hui réalisés par AdaControl!

Abnormal_Function_Return Contôle un "design pattern" qui garantit qu'une fonction retourne toujours un résultat
Allocators Contrôle les occurrences d'allocateurs, soit tous, soit ceux portant sur les types spécifiés
Array_Declarations (x6) Contrôle plusieurs métriques dans les tableaux et les types utilisés comme index
Aspects Contrôle les spécifications d'aspects (Ada 2012)
Assignments (x3) Contrôle différents points liés à l'affectation, comme les glissements de tableaux, les affectations multiples à une même variable, ou les affectation à des composants d'une structure qui pourraient être remplacées par une affectation d'agrégat..
Barrier_Expressions Contrôle les éléments autorisés dans les barrières d'entrées protégées
Case_Statement (x5) Contrôle plusieurs métriques dans les instruction case.
Characters (x4) Contrôle l'occurrence de caractères de contrôles (comme les tabulations) dans le source.
Comments (x4) Contrôle le contenu ou le placement des commentaires.
Declarations (x164) Contrôle les occurrences de certaines déclarations Ada
Default_Parameter Contrôle les appels de sous-programmes et les instantiations de génériques qui utilisent (ou non) la valeur par défaut pour un paramètre donné
Dependencies (x7) Contrôle les dépendences sémantiques selon un ensemble d'unités indiquées, ou d'après leur nombre.
Derivations Contrôle les dérivations de types selon le type ancètre, ou la catégorie de l'ancètre.
Directly_Accessed_Globals Contrôle le respect d'un "design pattern" qui garantit que toute variable globale n'est accédée que par des sous-programmes dédiés.
Duplicate_Initialization_Calls Contrôle le respect de "design patterns" qui évitent la double initialisation de paquetages ou de variables.
Entities Contrôle les occurrences de n'importe quelle entité Ada.
Entity_Inside_Exception Contrôle les occurrences d'une entité à l'intérieur d'un traite-exception.
Exception_Propagation (x5) Contrôle que certaines sortes de sous-programmes (ou des tâches) ne peuvent pas propager d'exceptions, qu'aucune élaboration ne peut propager d'exception, ou qu'un exception ne peut se propager en dehors de sa portée de déclaration.
Expressions (x58) Contrôle l'utilisation de certaines formes d'expressions
Generic_Aliasing (x5)
Contrôle les instantiations où un même élément correspond à plusieurs paramètres formels
Global_References (x5)
Contrôle les accès non synchronisés à des variables globales.
Header_Comments (x2) Contrôle la présence de commentaires en tête de chaque module.
Improper_Initialization (x3) Contrôle un "design pattern" qui garantit que toute variable est initialisée avant d'être utilisée, et n'est pas initialisée à tort.
Instantiations Contrôle les instantiations de génériques, soit toutes, soit celles effectuées avec les entités donnée.
Insufficient_Parameters Contrôle la présence de paramètres en notation positionnelle dont les valeurs ne permettent pas de comprendre le rôle.
Local_Access (x6)
Contrôle l'utilisation de valeurs accès désignant des entités non globales.
Local_Hiding (x2) Contrôle les déclarations d'identificateurs qui en cachent un identique plus externe.
Max_Blank_Lines Contrôle la présence de plus d'un nombre donné de lignes vides.
Max_Call_Depth Contrôle la profondeur d'appel de sous-programmes
Max_Line_Length Contrôle la longueur de ligne maximale.
Max_Nesting (x4)
Contrôle les portées imbriquées au delà d'une limite donnée.
Max_Size (x20) Contrôles la taille maximale des instructions composées et des unités de compilation
Max_Statement_Nesting (x5) Contrôles les instructions composées imbriquées au delà d'une limite donnée
Movable_Accept_Statements Contrôle la présence d'instructions qui pourraient être sorties d'une instruction accept.
Naming_Convention Contrôle la forme des noms autorisés (ou interdits) dans les déclarations.
No_Operator_Usage
Contrôle les types entiers dont aucun opérateur, ou seulement les opérateurs logiques, sont utilisés.
Non_Static (x6) Contrôle les expressions non statiques dans les contraintes d'index ou de discriminants, ou dans les instantiations.
Not_Elaboration_Calls Contrôle les appels de sous-programmes qui apparaîssent ailleurs que dans l'élaboration d'un paquetage de bibliothèque.
Not_Selected_Name Contrôle que certaines entités sont toujours utilisées sous forme préfixée.
Object_Declarations (x4) Contrôle certains paramètres des déclarations d'objets (constantes et variables).
Parameter_Aliasing Contrôle les appels de sous-programmes ou d'entrées où une même variable est fournie dans plus d'un paramètre [in] out.
Parameter_Declarations (x9) Contrôle les caractéristiques des paramètres des entités appelables (procédures, fonctions et entrées)
Positional_Associations (x3)
Contrôle les associations positionnelles (par opposition aux associations nommées).
Potentially_Blocking_Operations Contrôle l'utilisation d'opérations potentiellement bloquantes dans les opérations protégées.
Pragmas Contrôle l'utilisation de pragmas spécifiques.
Record_Declarations Contrôle différents aspects des composants d'un type article.
Reduceable_Scope (x9) Contrôle les déclarations qui pourraient être faites dans des portées plus internes.
Representation_Clauses (x12) Contrôle les occurrences des clauses de representation.
Return_Type (x8) Contrôle la présence de certaines formes de types comme types de retour de fonctions.
Side_Effect_Parameters Contrôle les appels de sous-programmes ou les instantiations de génériques qui appellent des fonctions à effet de bord, et dont l'effet peut dépendre de l'ordre d'évaluation.
Silent_Exceptions Contrôle lest traite-exceptions qui ne relèvent pas d'exception ni n'appellent de procédure de trace.
Simplifiable_Expressions (x7) Contrôle les occurrences de diverses formes d'expressions qui peuvent être simplifiées.
Simplifiable_Statements (x10) Contrôle les occurrences de diverses formes d'instructions qui peuvent être simplifiées.
Statements (x69) Contrôle les occurrences d'instructions Ada.
Style (x14) Contrôle diverses formes de constructions généralement recommandées dans les règles de style.
Terminating_Tasks Contrôle un "design pattern" qui garantit que les tâches ne se terminent jamais.
Type_Initial_Values Contrôle qu'une constant d'initialisation est déclarée avec chaque type.
Type_Usage (x2)
Contrôle l'utilisation de types ou de catégories de types à divers endroits.
Uncheckable (x3) Contrôle les constructions qui ne sont pas vérifiables statiquement par les autres règles
Unit_Pattern (x4)
Contrôle des modèles d'usage des unités de programme et des éléments qui y sont déclarés .
Units (x2) Contrôle que toutes les unités nécessaires sont analysées, et seulement celles-là.
Unnecessary_Use_Clause (x5) Contrôle les clauses use de paquetages dont aucun élément n'est référencé dans la portée de la clause use.
Unsafe_Elaboration Contrôle les paquetages susceptibles d'être sujet de dépendence abusive à l'ordre d'élaboration.
Unsafe_Paired_Calls Contrôle un "design pattern" qui garantit que certains appels sont toujours appariés (comme des procédures P et V).
Unsafe_Unchecked_Conversion Contrôles les instantiations de Unchecked_Conversion entre types de tailles différentes ou non spécifiées.
Usage (x11) Contrôle l'usage d'objets dans certaines conditions (dans des spécifications de paquetages, lus, écrits, modifiés).
Use_Clauses (x6) Contrôle les occurrences de clauses use portant sur tout paquetage autre que ceux passés en paramètre.
With_Clauses (x3) Contrôle la bonne utilisation de clauses with.

Pour plus de détails sur ces règles ou sur l'utilisation d'AdaControl, veuillez consulter le guide utilisateur (en anglais) ci-dessous.

AdaControl est un outil "ligne de commande", mais il a été totalement intégré dans l'environnement GPS d'AdaCore. Depuis GPS, vous pouvez lancer AdaControl, corriger les violations, ou éditer le fichier de règles avec juste quelques clics de souris.

Mais AdaControl est bien plus qu'un simple ensemble de règles de codage: c'est un environnement complet, prévu pour être facilement étendu. Si votre règle préférée n'est pas fournie, vous pouvez la rajouter vous-mêmes! Et bien sûr, nous continuerons à étendre le nombre de règles à l'avenir. Pour avoir une idée de comment cela se passe, consultez le manuel du programmeur AdaControl (en anglais).

Le développement initial d'AdaControl a été financé par Eurocontrol. Certaines règles ont été financées par BelgoControl, Alstom-Transport, Ansaldo-STS (ex CSEE-Transport) et SAGEM-DS. C'est un outil stable qui est utilisé pour vérifier notamment les codes Ada d'Eurocontrol (Bruxelles, plus de 2_000_000 LdC, Maastricht), BelgoControl, Alstom-Transport, Ansaldo-STS, Faiveley, SAGEM-DS (code DO178B/A), Thales... Il a également été testé contre tous les tests exécutables de l'ACATS.

AdaControl est une application ASIS.

AdaControl est un outil libre distribué sous licence GMGPL. Ceci ne l'empêche pas d'être un produit commercial d'Adalog, pour lequel nous offrons un contrat de maintenance. Nous pouvons aussi développer des règles spécifiques en fonction de vos besoins, ou plus généralement fournir une assistance pour la définition et la mise en œuvre de règles de programmation. Pour tout renseignement, merci de contacter info@adalog.fr.

Téléchargement

AdaControl, comme toute application ASIS, ne peut s'exécuter que s'il a été compilé avec exactement la même version du compilateur que celle qu'il utilise lui-même lorsqu'il s'exécute. Il n'est donc fourni sous forme exécutable que pour GNAT GPL/2016 (Windows et Linux). Pour toute autre version de GNAT, il faut télécharger la version source et recompiler (ce qui est très simple à faire, à condition d'avoir installé ASIS). Il n'a été testé qu'avec GNAT, mais devrait pouvoir être porté facilement vers tout autre compilateur fournissant l'interface ASIS.

Les versions ZIP ou TGZ vous permettent d'installer AdaControl à votre goût; sous Windows, les installateurs permettent de tout installer automatiquement - à condition que le répertoire <GNAT>\bin soit sur votre chemin d'exécution.

Distribution source Distribution exécutable
Windows Gnat GPL 2016
Distribution exécutable
Linux Gnat GPL 2016
Fichier ZIP
(2,48Mo)
Fichier TGZ
(2,11Mo)
Installateur Windows
(1,69Mo)
Fichier ZIP
(14,30Mo)
Installateur
(7,49Mo)
Fichier ZIP
(14,60Mo)

ATTENTION: Une incompatibilité a été introduite dans l'interface ASIS pour Ada 2005/2012, nécessaire pour traiter correctement certaines nouvelles fonctionnalités. La distribution source d'AdaControl nécessite au moins GnatPro-7.2.0 ou GnatGPL 2013. Si vous souhaitez utiliser une version antérieure de Gnat, veuillez récupérer une version source depuis SourceForge (cf. ci-dessous), branche "master-old_gnat" pour les versions jusqu'à GnatPro-7.0.x et GnatGPL 2011, et branche "GPL2012" pour GnatPro-7.1.x et GnatGPL2012.

Debian

Utilisateurs Debian: Un paquetage Debian est disponible. Pour l'installer:
apt-get install adacontrol

FreeBSD

Utilisateurs FreeBSD: vous pouvez trouver un portage d'AdaControl sur FreeBSD ici.

SourceForge

La version en cours de développement (non stabilisée) est disponible (sous GIT) depuis SourceForge. Vous y trouverez aussi des versions intermédiaires entre deux releases officielles adaptées à certaines versions de Gnat, et même de fournir votre propre évaluation d'AdaControl.

Vous pouvez soumettre des rapports d'anomalie, suggérer des améliorations, etc. en cliquant sur "Ticket" sur la page SourceForge ou en cliquant sur ce lien direct.

Contrat de maintenance

Si vous utilisez AdaControl dans un cadre professionnel, nous vous conseillons de souscrire le contrat de maintenance qui offre les prestations suivantes:

  • Aide à l'installation et à la mise en œuvre;
  • Explications quant à l'utilisation de l'outil et aide à la transformation de normes de codage en règles AdaControl;
  • Traitement prioritaire des tickets soumis via notre système de suivi;
  • Correction de problèmes rencontrés lors de l'utilisation d'AdaControl. Une version "bèta" est fournie pour chaque problème corrigé.
  • Accès aux nouvelles versions en "bèta"
  • Synchronisation des règles spécifiques de l'utilisateur avec la dernière version d'AdaControl;
  • Réduction sur les tarifs de développement de règles spécifiques;
  • Considération prioritaire des demandes d'amélioration. Les demandes d'amélioration ne sont pas couvertes par le contrat de maintenance; cependant Adalog fait progresser AdaControl en permanence, et les demandes provenant d'utilisateurs supportés bénéficient d'une haute priorité dans notre liste d'améliorations prévues.

Adalog ne peut corriger les problèmes dont l'origine est due à des fautes du compilateur ou de l'implémentation d'ASIS; veuilez contacter votre vendeur de compilateur pour un contrat de support lié à ces aspects. Cependant, en cas de tels problèmes, Adalog aidera autant que possible l'utilisateur à rapporter ces problèmes au vendeur de compilateur, et à trouver des contournements dans l'attente de la correction.

Pour un devis ou toute autre information complémentaire, merci d'écrire à: info@adalog.fr

Publications à propos d'AdaControl

Un certain nombre de papiers (en anglais) sont parus à propos d'AdaControl et de comment il peut être utilisé pour différentes tâches de vérification: