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

Version 1.19 - Date 00/02/16 15:11:34
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.



Back to the VASY Home Page