[Bug ada/42073] [4.4 regression] Infinite loop when parsing a project file, alpha only

ludovic at ludovic-brenta dot org gcc-bugzilla@gcc.gnu.org
Tue Nov 17 19:56:00 GMT 2009



------- Comment #3 from ludovic at ludovic-brenta dot org  2009-11-17 19:56 -------
Even an empty project file triggers the bug:

$ cat > p.gpr <<EOF
project p is
end p;
EOF
$ gdb gnatmake
(gdb) run -vP2 -Pp
Starting program: /usr/bin/gnatmake -vP2 -Pp
GPR_PROJECT_PATH=".:/usr/share/ada/adainclude/"
Project_Path_Name_Of ("p", "/home/lbrenta/");
   Trying /home/lbrenta//p.gpr
Project_Name_From ("/home/lbrenta/p.gpr")
^C
Program received signal SIGINT, Interrupt.
0x000002000086f344 in prj__tree__tree_private_part__projects_htable__get_next
() from /usr/lib/libgnatprj.so.4.4
(gdb) bt
#0  0x000002000086f344 in
prj__tree__tree_private_part__projects_htable__get_next () from
/usr/lib/libgnatprj.so.4.4
#1  0x0000020000853dd8 in ?? () from /usr/lib/libgnatprj.so.4.4
#2  0x0000020000856abc in prj__part__parse () from /usr/lib/libgnatprj.so.4.4
#3  0x000002000084df7c in prj__pars__parse () from /usr/lib/libgnatprj.so.4.4
#4  0x00000001200635d4 in ?? ()
#5  0x00000001200450c4 in ?? ()
#6  0x000000012000cf60 in ?? ()
#7  0x00000001200ad114 in ?? ()
#8  0x0000020000bd650c in __libc_start_main (main=<value optimized out>,
argc=<value optimized out>, ubp_av=<value optimized out>,
    init=0x1200ad190, fini=<value optimized out>, rtld_fini=<value optimized
out>, stack_end=0x11fcbd730) at libc-start.c:222
#9  0x000000012000b958 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)

Note: this gnatmake is built with -O2 and without -g.

(gdb) disassemble
Dump of assembler code for function
prj__tree__tree_private_part__projects_htable__tab__get_next:
0x000002000086f290
<prj__tree__tree_private_part__projects_htable__tab__get_next+0>:    ldah   
gp,6(t12)
0x000002000086f294
<prj__tree__tree_private_part__projects_htable__tab__get_next+4>:    lda    
gp,-12016(gp)
0x000002000086f298
<prj__tree__tree_private_part__projects_htable__tab__get_next+8>:    lda    
sp,-32(sp)
0x000002000086f29c
<prj__tree__tree_private_part__projects_htable__tab__get_next+12>:   stq    
s0,8(sp)
0x000002000086f2a0
<prj__tree__tree_private_part__projects_htable__tab__get_next+16>:   mov    
a0,s0
0x000002000086f2a4
<prj__tree__tree_private_part__projects_htable__tab__get_next+20>:   stq    
ra,0(sp)
0x000002000086f2a8
<prj__tree__tree_private_part__projects_htable__tab__get_next+24>:   stq    
s1,16(sp)
0x000002000086f2ac
<prj__tree__tree_private_part__projects_htable__tab__get_next+28>:   bne    
a0,0x2000086f2d0
<prj__tree__tree_private_part__projects_htable__tab__get_next+64>
0x000002000086f2b0
<prj__tree__tree_private_part__projects_htable__tab__get_next+32>:   clr     v0
0x000002000086f2b4
<prj__tree__tree_private_part__projects_htable__tab__get_next+36>:   ldq    
ra,0(sp)
0x000002000086f2b8
<prj__tree__tree_private_part__projects_htable__tab__get_next+40>:   ldq    
s0,8(sp)
0x000002000086f2bc
<prj__tree__tree_private_part__projects_htable__tab__get_next+44>:   ldq    
s1,16(sp)
0x000002000086f2c0
<prj__tree__tree_private_part__projects_htable__tab__get_next+48>:   lda    
sp,32(sp)
0x000002000086f2c4
<prj__tree__tree_private_part__projects_htable__tab__get_next+52>:   ret
0x000002000086f2c8
<prj__tree__tree_private_part__projects_htable__tab__get_next+56>:   nop
0x000002000086f2cc
<prj__tree__tree_private_part__projects_htable__tab__get_next+60>:   unop
0x000002000086f2d0
<prj__tree__tree_private_part__projects_htable__tab__get_next+64>:   ldah   
s1,1(a0)
0x000002000086f2d4
<prj__tree__tree_private_part__projects_htable__tab__get_next+68>:   ldl    
t0,-16312(s1)
0x000002000086f2d8
<prj__tree__tree_private_part__projects_htable__tab__get_next+72>:   and    
t0,0xff,t0
0x000002000086f2dc
<prj__tree__tree_private_part__projects_htable__tab__get_next+76>:   beq    
t0,0x2000086f2b0
<prj__tree__tree_private_part__projects_htable__tab__get_next+32>
0x000002000086f2e0
<prj__tree__tree_private_part__projects_htable__tab__get_next+80>:   ldq    
a0,-16320(s1)
0x000002000086f2e4
<prj__tree__tree_private_part__projects_htable__tab__get_next+84>:   ldq    
t12,-32248(gp)
0x000002000086f2e8
<prj__tree__tree_private_part__projects_htable__tab__get_next+88>:   jsr    
ra,(t12),0x2000086f2ec
<prj__tree__tree_private_part__projects_htable__tab__get_next+92>
0x000002000086f2ec
<prj__tree__tree_private_part__projects_htable__tab__get_next+92>:   ldah   
gp,6(ra)
0x000002000086f2f0
<prj__tree__tree_private_part__projects_htable__tab__get_next+96>:   mov    
s0,a0
0x000002000086f2f4
<prj__tree__tree_private_part__projects_htable__tab__get_next+100>:  lda    
gp,-12108(gp)
0x000002000086f2f8
<prj__tree__tree_private_part__projects_htable__tab__get_next+104>:  stq    
v0,-16320(s1)
0x000002000086f2fc
<prj__tree__tree_private_part__projects_htable__tab__get_next+108>:  ldq    
t12,-28536(gp)
0x000002000086f300
<prj__tree__tree_private_part__projects_htable__tab__get_next+112>:  jsr    
ra,(t12),0x2000086f304
<prj__tree__tree_private_part__projects_htable__tab__get_next+116>
0x000002000086f304
<prj__tree__tree_private_part__projects_htable__tab__get_next+116>:  ldah   
gp,6(ra)
0x000002000086f308
<prj__tree__tree_private_part__projects_htable__tab__get_next+120>:  lda    
gp,-12132(gp)
0x000002000086f30c
<prj__tree__tree_private_part__projects_htable__tab__get_next+124>:  ldq    
ra,0(sp)
0x000002000086f310
<prj__tree__tree_private_part__projects_htable__tab__get_next+128>:  ldq    
s0,8(sp)
0x000002000086f314
<prj__tree__tree_private_part__projects_htable__tab__get_next+132>:  ldq    
s1,16(sp)
0x000002000086f318
<prj__tree__tree_private_part__projects_htable__tab__get_next+136>:  lda    
sp,32(sp)
0x000002000086f31c
<prj__tree__tree_private_part__projects_htable__tab__get_next+140>:  ret
End of assembler dump.

The sources corresponding to this procedure is:

      function Get_Next (T : Instance) return Element is
         Tmp : constant Elmt_Ptr := Tab.Get_Next (Tab.Instance (T));
      begin
         if Tmp = null then
            return No_Element;
         else
            return Tmp.E;
         end if;
      end Get_Next;

Is this sufficient for debugging?


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42073



More information about the Gcc-bugs mailing list