3. Problèmes liés au fortran#
Les sources fortran sont ceux qui posent le plus de problèmes aux utilisateurs de l’agla. La raison en est la multiplicité des outils qui leurs sont appliqués :
script de contrôle du fortran
compilateur(s)
outil de vérification de la norme ANSI77 (CRS)
outil d’intercompilation (CRP)
édition de liens
Nous allons illustrer le listing de ces outils.
3.1. Script de contrôle du fortran#
Ce script est exécuté au début de l’outil. Son listing se trouve dans la partie <VERIF_2>. Plusieurs vérifications sont effectuées :
que le source ressemble à du fortran
que le source ne contient pas de caractères interdits (ou déconseillés) ou de lignes trop longues
que le source provient bien de la dernière version officielle (vérification de la carte “C MODIF” )
que l’utilisateur n’a pas modifié les cartes “C TOLE” (on comprendra cette phrase après avoir lu le paragraphe concernant l’outil CRS)
--- Vérification que le source est de type FORTRAN
/tmp/519797/aster/eda/vabhhts/identifi/fortran contient du source FORTRAN
--- Vérification que le source ne contient pas
--- de caractères génants
17/-:C WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTAB
17/+:ILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU GENERAL PUBLIC LICENSE FOR MORE DETAILS.
(A/U-014): Les lignes précédentes (du fichier /tmp/519797/aster/eda/vabhhts/identifi/fortran)
: sont précédées de leur numéro dans le fichier et d'un diagnostic :
num_ligne/-: les 72 premiers caractères d'une ligne (ERREUR FATALE)
num_ligne/+: la suite de la ligne précédente (ERREUR FATALE)
num_ligne/!: contient des caractères déconseillés (ALERTE)
num_ligne/?: contient des caractères INTERDITS (ERREUR FATALE)
(F/U-014): Le fichier /tmp/519797/aster/eda/vabhhts/identifi/fortran contient :
: des caractères INTERDITS
: et/ou des lignes TROP LONGUES
--- Vérification de cohérence avec la version de référence (NEW7)
(A/U-222): calcul : Modification de la carte TOLE
Les erreurs précédées d'un A ont été ajoutes dans la carte
Les erreurs précédées d'un S ont été supprimées de la carte
A CRP_20 CALCUL
3.2. Compilateur(s)#
Seules les erreurs fatales du compilateur sont à prendre en compte. Les éventuels “warnings” ne sont pas interceptés par l’agla. Sur la machine actuellement utilisée par l’agla (en Août 2003 : l’alphaserver), on compile 2 fois les sources à l’aide de 2 compilateurs différents f90 (<VERIF_8>) et g77 (<VERIF_9>).
extrait de <VERIF_8> :
================================================================
=== Compilation des sources FORTRAN en majobj ===
================================================================
(F/U-090): ERROR(S) et WARNING(S) FORTRAN :
+ f90 -v -c -fast -i8 -r8 -omp /tmp/519797/tmp_asverif/bibfor/calculel/ ...
f90: Warning: /tmp/519797/tmp_asverif/bibfor/calculel/calcul.f, line 268:
Variable IACHIX is used before its value has been defined
EXICH = ((IPARIN.GT.0) .AND. ZL(IACHIX-1+IPARIN))
--------------------------------------------^
Remarque :
asverifs’appuie sur le code retour de la commande de lancement de l’outil de compilation pour émettre le message d’erreur ((F/U-090) : ERROR(S)et WARNING(S) FORTRAN). Il faut donc ensuite consulter les messages émis par l’outil de compilation.
3.3. Outil de vérification de la norme ANSI77 (CRS)#
L’outil CRS a été récupéré dans le domaine public (il s’agit en réalité d’une version à peine modifiée de l’outil ftncheck). L’exécutable de cet outil produit un listing (dans <VERIF_8>) pouvant contenir un grand nombre de types d’erreurs ou de warnings. Chaque type de message est précédé d’un label de la forme CRS_nnn ; par exemple :
CRS_206 routine CALCUL "/tmp/519808/tmp_asverif/bibfor/calculel/calcul.f" ,
line 93 col 15: Warning: non standard:(declaration hors norme: REAL*8,...)
CRS_513 routine CALCUL : Warning:Variables used before set: IACHIX
Le “piège” de cet outil est que dans les messages imprimés (en anglais), il utilise les mots “error” et “warning” alors que pour les outils de l’agla ces mots ne sont pas forcément synonymes d’erreur fatale ou d’alarme.
Il y a des “Warnings” CRS qui entraînent des erreurs fatales de l’agla et des “errors” CRS sans importance !!!
Le principe de l’utilisation de CRS dans l’agla est le suivant :
On exécute le programme CRS et on récupère son listing : l1
On regarde si dans le listing l1, il existe des lignes commençant par des labels “CRS_nnn” recherchés par l’agla (remarque : certains messages CRS_nnn sont totalement ignorés ; par exemple ceux concernant les types hors norme REAL*8 ou COMPLEX*16).
Dans les lignes retenues, on retire les erreurs CRS_nnn qui sont tolérées (mécanisme du “C TOLE CRS_nnn” décrit ci-dessous).
S’il reste des lignes, on imprime le texte suivant :
==⇒ Compilation refusée pour le Code_Aster a cause des erreurs FORTRAN CRS suivantes (sans carte ‘C TOLE’) :
CRS_513 CALCUL
Puis on imprime le listing brut l1
3.3.1. Mécanisme du « C TOLE CRS_nnn »#
L’agla considère que certaines “erreurs” de CRS peuvent souffrir d’exceptions. Par exemple, l’interdiction de l’équivalence entre variables numériques et de type CHARACTER rend impossible l’usage de JEVEUX. Pour qu’une exception soit admise par l’outil, l’utilisateur doit indiquer dans son source qu’il viole délibérément la règle de programmation. Pour cela, il écrira par exemple dans une de ses routines : “C TOLE CRS_513”
3.3.2. Résumé#
Pour exploiter le résultat de l’outil CRS, il faut rechercher la chaîne “==⇒ Compilation refusée … « Si elle est présente, il ne faut regarder que les messages CRS_nnn qui sont indiqués au dessous.
3.4. Outil d’inter-compilation (CRP)#
L’outil CRP fonctionne de la même manière que l’outil CRS. Il accepte également des exceptions gérées par les cartes “C TOLE CRP_nnn”.
La spécificité de cet outil est de vérifier l’inter-compilation des sources fortran. C’est-à-dire par exemple:
vérifier que le nombre et le type des arguments lors d’un appel à une procédure sont les mêmes que ceux définis lors de la définition de la procédure,
vérifier la cohérence des différentes occurrences d’un COMMON,
…
Exemple de listing de CRP (<VERIF_10>) :
================================================================
=== Vérification des sources FORTRAN avec CRP ===
================================================================
(F/U-222): Erreur(s) détectée(s) par crp :
===> Erreurs crp et inter-compilation :
CRP_150 CALCUL
CRP_3 CALCUL