LISTE DES BOGUES DANS l'OUTIL FNC2
Mihaela Sighireanu Xavier Bouchoux Claude Chaudet Christophe Discours Hubert Garavel Marc Herbert Mark Jorgensen Bruno Vivien INRIA Rhone-Alpes / VASY 655, avenue de l'Europe 38330 MONTBONNOT SAINT MARTIN FRANCE
Number: [VASY-FNC2-22] Date: Wed, 12 Aug 1998 21:12:04 +0200 Report: Mihaela Sighireanu Tool: fnc2 (v1.18) Status: ADMITTED by Didier Parigot
(voir aussi 2.10 dans FAQ)
Core dump genere par l'analyse syntaxique d'une grammaire attribue. J'ai controle la syntaxe de ma grammaire a l'oeil libre, mais je n'ai pas trouve une erreur.
dbx sur fnc2 donne le resultat suivant :
(dbx) run -H ../incl_fnc2/ -C ../src_fnc2/ ../spec/ag_lotosnt_flat_check.olga > Running: fnc2 -H ../incl_fnc2/ -C ../src_fnc2/ ../spec/ag_lotosnt_flat_check.olga (process id 27242) Release 1.16 of (98/01/22 14:30:07) ../spec/ag_lotosnt_flat_check.olga: Scanner & Parser & Abstract Treesignal SEGV (no mapping at the fault address) in find_source at 0x24f8f0 0x0024f8f0: find_source+0x0008: ldsb [%o0], %o0 (dbx) where =>[1] find_source(0xefffefb0, 0x2aacbc, 0x1, 0x2db480, 0x0, 0x2dc3dd), at 0x24f8f0 [2] sxput_error(0x2dc3a8, 0x268cc0, 0x266f19, 0x268cc8, 0x268c00, 0x3f5), at 0x24fb3c [3] F___gobble__sem__rules__expr(0x2dc3a8, 0x2bdacc, 0x2bda80, 0x2dc368, 0x2bda80, 0x2bda80), at 0x1e4b74 [4] case_116(0x2a2b80, 0x1d0, 0x2a29b0, 0x4, 0x40000, 0x0), at 0x1f1490 [5] action(0x74, 0x241ce0, 0x241c00, 0xbb, 0xe, 0x2ad98c), at 0x241c14 [6] f2atc(0xfffffffb, 0x74, 0x2ae2ec, 0x2b6d68, 0x29aac0, 0x2abb00), at 0x241db4 [7] execute_actions(0x2aab88, 0x2ab064, 0x1, 0x2, 0x2af8f2, 0x2a8301), at 0x254804 [8] sxparse_it(0x2ab05c, 0x2aaa54, 0x2aaa50, 0x2aaa4c, 0x2aaa48, 0x2aa800), at 0x254ad4 [9] sxparser(0xfffffffb, 0x2aab92, 0x2aaa50, 0x2aaa4c, 0x2aa800, 0x0), at 0x255280 [10] sxsyntax(0x29e770, 0x29e76c, 0x29e400, 0x2a8544, 0x21, 0x21), at 0x257844 [11] olga_run(0xeffff628, 0xeffff4ac, 0x2aacbc, 0x322f0000, 0x3f8, 0x1), at 0x51390 [12] main(0x6, 0xeffff4ac, 0xeffff4c8, 0x2a8654, 0x1, 0x0), at 0x525fc
IL s'agit en fait du code genere pour le programme Olga suivant :
... where op-flat-gate-match-list -> ph-flat-gate-match * declare value DOMAINE : TYPE_DOMAINE := case arity is 0 : DOMAINE_VIDE; other : $s.DOMAINE (ph-flat-gate-match.last); end case; IS_EXHAUSTIVE : bool := if !empty (DOMAINE) then message-lotosnt (LOTOSNT_NOT_EXHAUSTIVE_PATTERNS, MODE_DEBUG, "Gate match list:", $scx) elsif (EXISTS_GUARD & !EXISTS_ANY) then message-lotosnt (LOTOSNT_MAYBE_NOT_EXHAUSTIVE_PATTERNS, MODE_DEBUG, "Gate match list:", $scx) else true end if; use $CORRECT_PH1 := IS_EXHAUSTIVE; ...
En fait, on ne peut pas utiliser un "case arity" dans les attributs definis
dans locaux "declare value".
Il faut ecrire directement dans la partie "use".
Il faut interdire cette construction au moment de la compilation.
Number: [VASY-FNC2-27] Date: Wed, 09 Sep 1998 15:02:24 +0200 Report: Mihaela Sighireanu Tool: fnc2 (v1.17) Status: ADMITTED by Didier Parigot
Le probleme apparait a la construction d'un nouveau arbre (grammaire ag_lotosnt_flat.olga) dans la fonction CREATE_ENUM_C1_Cn. Cette fonction fait un filtrage sur l'arbre d'entree en utilisant les operateur classiques sur les listes (-pre).
function CREATE_ENUM_C1_Cn (ID1_IDn : ph-def-identifier-list; DCM : token; N_DCM : int; SCX : source-index) : ph-flat-def-constructor-list is case ID1_IDn is op-def-identifier-list-pre (ID1, tail_ID1_IDn) : op-flat-def-constructor-list-pre ( op-flat-def-constructor (...), CREATE_ENUM_C1_Cn (tail_ID1_IDn, DCM, N_DCM, SCX)) with $scx := SCX end with; other : { op-def-identifier-list-empty () } op-flat-def-constructor-list () with $scx := SCX end with; end case end function;
La compilation se passe tres bien, mais l'executable produit fait un core-dump au moment de l'appel de cette fonction, sur l'appel de f2___match_pre.
o-o-o-o-o-o-o
Reponse Didier Parigot :
On ne peut pas manipuler des arbres d'entree autrement que par la construction
"where -> ...". Donc dans ces fonctions il ne faut utiliser que les arbres
de sortie.
Il faut introduire un message d'erreur a la compilation afin d'empecher cette
construction.
Number: [VASY-FNC2-38] Date: Tue, 08 Sep 1998 13:49:43 +0200 Report: Xavier Bouchoux Tool: ppat (v1.17)
Il est impossible d'utiliser le me^me fichier pour plusieurs appel de ppat. On est oblige a l'appel (dans XXXX_smp) de donner de noms differents, car le ppat ecrase l'ancien fichier.
Number: [VASY-FNC2-49] Date: 99/02/02 Report: Mihaela Sighireanu Tool: fnc2 (v1.18)
les fonctions string et int ne sont pas definie pour les types enumeres
Number: [VASY-FNC2-50] Date: 99/02/02 Report: Mihaela Sighireanu Tool: fnc2 (v1.18)
cons (L, E) donne le meme resultat que cons (E, L)
Number: [VASY-FNC2-51] Date: 99/02/02 Report: Mihaela Sighireanu Tool: fnc2 (v1.18)
si (dans bug_25_*) on change le nom d'un module ppat, alors mkfnc2 genere (parfois) une declaration de module ppat-predef qui n'existe pas !!
Construction ? reply (n|m|e|y|s|a|u|t|help) ---------------------------------------------------------------------- u mv traian.MKFNC2 traian.mkfnc2 Release 1.17 of (98/09/01 10:55:41) traian.mkfnc2: Scanner & Parser & Abstract Tree DC ppat-predef ? ^ traian.mkfnc2, line 9: column 5: Error: Unknown Declaration Module. traian.mkfnc2, line 35: column 5: Error: Unknown Asx Module. traian.mkfnc2, line 97: column 5: Error: Unknown Asx Module. traian.mkfnc2, line 146: column 5: Error: Unknown Declaration Module. traian.mkfnc2, line 147: column 5: Error: Unknown Asx Module. traian-makefile:371: warning: overriding commands for target `/local_home/users/sighirea/Parallelisme/Traian/Code/lib/sun5/lotosnt__flat__passe5_b.o' traian-makefile:184: warning: ignoring old commands for target `/local_home/users/sighirea/Parallelisme/Traian/Code/lib/sun5/lotosnt__flat__passe5_b.o' traian-makefile:526: warning: overriding commands for target `/local_home/users/sighirea/Parallelisme/Traian/Code/lib/sun5/lotosnt__flat__passe5_auto.o' traian-makefile:188: warning: ignoring old commands for target `/local_home/users/sighirea/Parallelisme/Traian/Code/lib/sun5/lotosnt__flat__passe5_auto.o' traian-makefile:535: warning: overriding commands for target `/local_home/users/sighirea/Parallelisme/Traian/Code/lib/sun5/lotosnt__flat__passe5_regles.o' traian-makefile:196: warning: ignoring old commands for target `/local_home/users/sighirea/Parallelisme/Traian/Code/lib/sun5/lotosnt__flat__passe5_regles.o' gmake: *** No rule to make target `/local_home/users/sighirea/Parallelisme/Traian/Code/spec/dec_lotosnt-flat-passe5.olga', needed by `construc'. Stop. In file included from traian_smp.c:26: /local_home/users/sighirea/Parallelisme/Traian/Code/incl_fnc2/traian.h:60: lotosnt_type_checking_b.h: No such file or directory
Reponse : C'est un probleme de l'outil makefnc2 qui oublie de supprimer un fichier f2aux entre deux constructions.
Number: [VASY-FNC2-52] Date: 99/02/02 Report: Hubert Garavel, Claude Chaudet Tool: fnc2 (v1.18)
sous linux, FNC2 genere des fichiers parasites ".ex" dans le repertoire racine. (ag_graphSVL.ex par exemple). Ces fichiers devraient , je pense, se trouver dans tmp.
Par exemple, l'un d'eux contient :
RESULTATS DE L'EXECUTION POUR LA GRAMMAIRE : ag_graph of svl_core pile 1 : 38 pile 2 : 38 pile 3 : 5 Nombre de noeuds : 383 Nombre de cellules locales :476 Nombre de cellules de travail :0 Nombre de cellules exportees :0 Nombre de cellules totales :476 Nombre de cellule utilisees : 561 Nombre moyen de cellule par noeud : 1.465 Nombre moyen de cellule par noeud (version non-optimiser) : 2.436 Gain en place : 1.663 (383)
From Hubert Garavel:
J'ai regle ce probleme en recompilant les bibliotheques libf2.a et
ppatruntime.a avec l'option -DF2EV
Number: [VASY-FNC2-54] Date: 99/02/02 Report: Claude Chaudet Tool: fnc2 (v1.18)
Sous sun4 (et seulement sous sun4) il y a un probleme probleme avec le test 5 :
mv LVS.MKFNC2 LVS.mkfnc2 Release 1.18 of (98/12/17 15:54:28) LVS.mkfnc2: Scanner & Parser & Abstract Tree LVS.mkfnc2: Error: atc:Uncondmatch or No default-case in rule: 12. Error: Forget LVS.c
Number: [VASY-FNC2-55] Date: 99/05/06 Report: Claude Chaudet Tool: fnc2 (v1.18)
quand on a une suite de structures "if then else" dont le resultat est booleen, il est parfois impossible de les traiter comme des expressions booleenes. Par exemple :
function truc (...) : bool is ... (expression booleene) and if (...) then ... (expression booleene) else ... (expression booleene) end if and ... (expression booleene) end function
La construction se passe bien.
En revanche le code C genere est incorrect, puisqu'il ne compile pas.
En fait, il manque des { } dans le code;
Voir l'exemple ci-dessous :
function GENERATE_C_PREDEFINED_COMPARISON_F1_Fn (S : TYPE_SORT; F1_Fn : TYPE_OPERATION_LIST; ENV : TYPE_ENVIRONMENT; FUNC_CMP : string; IS_EQ :bool) : bool is empty (F1_Fn) or let F1 := head (F1_Fn) in OUTPUT_STRING ("case TRAIAN_ADT_CASE_" + OPERATION_IMPLEMENTATION_WITHOUT_COMMENT(F1)) and OUTPUT_STRING (" :\n") and if empty (F1.BINDING.ARGUMENT_V1_Vn) then OUTPUT_STRING ("return " + if IS_EQ then "1" else "0" end if + ";\n") else OUTPUT_STRING ("return ") and GENERATE_C_PREDEFINED_COMPARISON_V1_Vn (S, F1.BINDING.ARGUMENT_V1_Vn, F1, ENV, FUNC_CMP) end if and GENERATE_C_PREDEFINED_COMPARISON_F1_Fn (S, tail (F1_Fn),ENV, FUNC_CMP, IS_EQ) end function;
donne le code C suivant :
static BOOLEAN GENERATE_C_PREDEFINED_COMPARISON_F1_Fn(S,F1_Fn,ENV,FUNC_CMP,IS_EQ) struct TYPE_SORT *S; struct f2___list *F1_Fn; struct TYPE_ENVIRONMENT *ENV; char *FUNC_CMP; BOOLEAN IS_EQ; { if (empty (F1_Fn)) return true; else { BOOLEAN vl_4; { struct TYPE_OPERATION *F1; F1 = ((struct TYPE_OPERATION *)head ("GENERATE_C_PREDEFINED_COMPARISON_F1_Fn",(F1_Fn))); if (OUTPUT_STRING(plus___string("case TRAIAN_ADT_CASE_", OPERATION_IMPLEMENTATION_WITHOUT_COMMENT(F1)))) { BOOLEAN vl_5; if (OUTPUT_STRING(" :\n")) <-----------------------------------ICI UN { if (empty (F1->BINDING->ARGUMENT_V1_Vn)) { char *vl_8; char *vl_7; char *vl_6; if (IS_EQ) vl_8 = "1"; else vl_8 = "0"; vl_5 = OUTPUT_STRING(plus___string(plus___string("return ",vl_8),";\n")); } else vl_5 = OUTPUT_STRING("return ") && GENERATE_C_PREDEFINED_COMPARISON_V1_Vn( S,F1->BINDING->ARGUMENT_V1_Vn,F1,ENV,FUNC_CMP); vl_5 = (vl_5 && GENERATE_C_PREDEFINED_COMPARISON_F1_Fn(S,tail (F1_Fn),ENV,FUNC_CMP,IS_EQ)); <------------------------------------ ET ICI un } else <-------- Sinon ce else n'a pas de if (...)
Le probleme ne se produit pas si on utilise la petite astuce pour contourner l'ancien bug 40 a savoir si on fait
... let t : bool := if ... then ... else ... end if in t and ...
Number: [VASY-FNC2-56] Date: 99/06/17 Report: Mihaela Sighireanu Tool: atc (v1.18)
A la recuperation d'erreur en SYNTAX/ATC, dans certains cas, un core dump est genere. Dbx sur ce core on obtient :
program terminated by signal SEGV (no mapping at the fault address) Current function is traian_run 222 syntax (ACTION, &lotosnt_tables); (dbx) where [1] f2___arbre_scx(0x0, 0x538008, 0x1, 0xefffec78, 0x0, 0xef795564), at 0x358bf4 [2] f2___arbre_scx(0x538008, 0x534310, 0x1, 0xefffecf8, 0x0, 0x532450), at 0x358ea0 [3] f2___arbre_scx(0x534310, 0x534348, 0x4, 0xefffed78, 0xef79556c, 0x1a40), at 0x358ea0 [4] f2___arbre_scx(0x534348, 0x532338, 0x1, 0xefffedf8, 0x1a40, 0x534030), at 0x358ea0 [5] f2___arbre_scx(0x532338, 0x534380, 0x1, 0xefffee78, 0x5343f8, 0x5343f0), at 0x358d90 [6] f2___arbre_scx(0x534380, 0x5343b8, 0x1, 0xefffeef8, 0x4dd9d0, 0x523c20), at 0x358ea0 [7] f2___arbre_scx(0x5343b8, 0x0, 0x0, 0xefffef78, 0x523aa2, 0x51c491), at 0x358ea0 [8] atc_finalize(0x359ec0, 0x359e24, 0x359c00, 0x51c264, 0x51c260, 0x51c000), at 0x359af4 [9] f2atc(0xfffffff8, 0x4dd370, 0x51c268, 0x51c264, 0x51c000, 0x0), at 0x359ec0 [10] sxsyntax(0x4dd374, 0x4dd370, 0x4cd2f5, 0xeffff373, 0xeffff0c4, 0x51c87a), at 0x3622a8 =>[11] traian_run(pathname = 0xeffff373 "LotosNT/syntax:009.lotnt"), line 222 in "traian_main.c" [12] main(argc = 2, argv = 0xeffff23c), line 313 in "traian_main.c"
Number: [VASY-FNC2-57] Date: Tue Nov 30 14:47:02 MET 1999 Report: Marc Herbert Tool: atc (v ?.?? ) Status: PENDING
Il s'agit d'une limitation.
L'instruction "message" est tres limitee en ATC. Contrairement aux indications de la doc, il n'est pas possible de concatener des chaines avec "+", ni de recupérer des "tokens" du source : rejet dès l'analyse syntaxique.
Number: [VASY-FNC2-58] Date: Tue Nov 30 14:47:02 MET 1999 Report: Marc Herbert Tool: atc (v ?.?? ) Status: PENDING (can be fixed by patching olga_predfinit.h as explained below)
ATC fait un coredump, avec un message
"program terminated by signal BUS (invalid address alignment)"
Il manque (au moins) deux prototypes de fonctions utilisées par ATC dans le fichier incl/olga_predefinit.h :
extern struct sxsource_coord scx_stack (); extern BOOLEAN egal___st___atc_node ();
Le compilateur C suppose donc silencieusement qu'elle renvoient un "int". Cela provoque un coredump lors de l'appel de scx_stack () (appel dans le fichier généré src_fnc2/lotosnt-in_atc.c via l'appel de la fonction : sxerr_mngr.c:sxput_error (scx_stack (f2top - 2),...)
Pour la fonction egal___st___atc_node(), d\151finie dans f2atc.c (fichier source en double...) et utilis\151e sous forme d'une macro f2___diff___st___atc_node(), il n'y a pas de core dump, mais le prototype est neanmoins incorrect (en l'absence de declaration, la fonction est suppos\151e renvoyer un int alors que BOOLEAN est un "char") et devrait etre corrige'.
Pour corriger ce bug, ajouter simplement les 2 déclarations qui manquent dans un fichier olga_predefinit.h
-> a la ligne 206 extern struct sxsource_coord scx_stack (); -> a la ligne 235 extern BOOLEAN egal___st___atc_node ();
Note: dans l'installation de VASY, il y a trois (!) fichiers olga_predefinit.h identiques dans la hiérarchie /common/Fnc2/
./incl/olga_predefinit.h ./SRC_LIBF2/olga_predefinit.h ./SRC_PPATRUNTIME/olga_predefinit.h
Note bis: BOOLEAN est défini de façon redondante en plusieurs endroits de Syntax:
Syntax/incl/sxunix.h:#define BOOLEAN SXBOOLEAN
Fnc2/incl/sxbitstr.h:# define SXBOOLEAN char Fnc2/incl/sxbitstr.h:# define SXFALSE (SXBOOLEAN) 0 Fnc2/incl/sxbitstr.h:# define SXTRUE (SXBOOLEAN) 1 /* (!SXFALSE) */ Syntax/incl/sxu2.h:#define SXBOOLEAN char Syntax/incl/sxu2.h:#define SXFALSE (SXBOOLEAN) 0 Syntax/incl/sxu2.h:#define SXTRUE (SXBOOLEAN) 1 /* (!SXFALSE) */
Number: [VASY-FNC2-59] Date: Mon Jan 24 12:36:17 MET 2000 Report: Marc Herbert Tool: fnc2 Status: PENDING
Le code olga suivant (errone' certes, mais quand meme) fait un SEGV :
attribute grammar lotosnt_type_checking (lotosnt_bind_mod in ph-lotosnt-axiom ; lotosnt_type_checking out ph-lotosnt-axiom) : ($CORRECT_TYPING : bool) is use where op-null-value-expression -> use $TYPE := if true then $h.T1_Tn else $h.T1_Tn {end if} ; $s.READ_V1_Vn := TYPE_VARIABLE_LIST (); end where ;
program terminated by signal SEGV (no mapping at the fault address)
(dbx) where =>[1] f2___match(0xeffff2e8, 0x2c1f68, 0x2, 0x2adc00, 0x0, 0x0), at 0x2424c0 [2] case_228(0x2a5228, 0x390, 0x2a4e98, 0x3, 0x30000, 0x4), at 0x1f6694 [3] action(0xe4, 0x243b28, 0x243800, 0x2aaa34, 0x2aaa38, 0xa), at 0x243a48 [4] f2atc(0xfffffffb, 0xe4, 0x2b0704, 0x2b21d8, 0x29d4d0, 0x2adf50), at 0x243bfc [5] execute_actions(0x2acf80, 0x2ad45c, 0x1, 0x2, 0x2b1cd2, 0x2aa801), at 0x25649c [6] sxparse_it(0x2ad454, 0x2ace54, 0x2ace50, 0x2ace4c, 0x2ace48, 0x2acc00), at 0x25676c [7] sxparser(0xfffffffb, 0x2acf8a, 0x2ace50, 0x2ace4c, 0x2acc00, 0x0), at 0x256f18 [8] sxsyntax(0x2a0c68, 0x2a0c64, 0x2a0c00, 0x2acffc, 0x0, 0x2aaa50), at 0x2594dc [9] olga_run(0xeffff84d, 0xeffff6ec, 0x2ad0b4, 0x1, 0x1, 0x1), at 0x51218 [10] main(0x2, 0xeffff6ec, 0xeffff6f8, 0x2aab54, 0x1, 0x0), at 0x52450
A noter que la fonction f2___match () prend trois arguments en principe.