perl

Jakub Bogusz qboosh w pld.org.pl
Pon, 4 Mar 2002, 20:31:14 CET


On Mon, Mar 04, 2002 at 09:25:53AM +0100, Andrzej Dereszowski wrote:
> On Mon, Mar 04, 2002 at 08:39:11AM +0100, Arkadiusz Miskiewicz wrote:
> > hubert depesz lubaczewski <depesz w depesz.pl> writes:
> > 
> > > On Sun, Mar 03, 2002 at 04:59:21PM +0100, Tomasz Witek wrote:
> > > > > > [deresz w deresz deresz]$ perl -e '($a,b) = 0'
> > > 
> > > $ perl -e '($a, $b) = 0'
> > > 
> > > (depesz w polpot[tty6]) 08:25:03 [~]
> > > $ perl -v
> > 
> > perl -e '($a, $b) = 0' - działa
> > perl -e '($a,b) = 0' - segfault
> No właśnie o to chodzi.
> Powinien chyba zareagować w taki sposób:
> 
> [deresz w deresz deresz]$ perl -e 'a = 0'
> Undefined subroutine &main::a called at -e line 1.
> 
> Ten segfault wyskakuje przy fazie parsowania składni, to chyba nie dobrze :-)

Ktoś chce się pobawić?
Albo forwardnąć to na stosowny adres do bug reportów :)

(gdb) bt
#0  0x401f4f3b in strlen () from /lib/libc.so.6
#1  0x400b710a in Perl_sv_vcatpvfn (sv=0x8054ed8, pat=0x4011872a "Can't modify %s in %s",
    patlen=21, args=0xbffff978, svargs=0x0, svmax=0, maybe_tainted=0x0) at sv.c:6238
#2  0x400b65f0 in Perl_sv_vsetpvfn (sv=0x8054ed8, pat=0x4011872a "Can't modify %s in %s",
    patlen=21, args=0xbffff978, svargs=0x0, svmax=0, maybe_tainted=0x0) at sv.c:5954
#3  0x400897e8 in Perl_vform (pat=0x4011872a "Can't modify %s in %s", args=0xbffff978)
    at util.c:1489
#4  0x40089784 in Perl_form (pat=0x4011872a "Can't modify %s in %s") at util.c:1480
#5  0x40061967 in Perl_mod (o=0x4029d200, type=37) at op.c:1501
#6  0x40061e28 in Perl_mod (o=0x8057dc0, type=37) at op.c:1657
#7  0x4006732e in Perl_newASSIGNOP (flags=64, left=0x8057dc0, optype=0, right=0x8057e08)
    at op.c:3400
#8  0x4005c3af in Perl_yyparse () at perly.y:479
#9  0x400329dc in S_parse_body (env=0x0, xsinit=0x8049570 <xs_init>) at perl.c:1320
#10 0x40031a70 in perl_parse (my_perl=0x804bf48, xsinit=0x8049570 <xs_init>, argc=3,
    argv=0xbffffca4, env=0x0) at perl.c:898
#11 0x08049504 in main (argc=3, argv=0xbffffca4, env=0xbffffcb4) at perlmain.c:50
#12 0x40197a31 in __libc_start_main () from /lib/libc.so.6

(gdb) f 5
#5  0x40061967 in Perl_mod (o=0x4029d200, type=37) at op.c:1501
1501            yyerror(Perl_form(aTHX_ "Can't modify %s in %s",

[zawartość op.c:1501-1507:
        yyerror(Perl_form(aTHX_ "Can't modify %s in %s",
                     (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL)
                      ? "do block"
                      : (o->op_type == OP_ENTERSUB
                        ? "non-lvalue subroutine call"
                        : PL_op_desc[o->op_type])),
                     type ? PL_op_desc[type] : "local"));
]

(gdb) p o->op_type
$26 = 53768
(gdb) p o->op_flags
$27 = 8 '\b'
(gdb) p type
$28 = 37
(gdb) p PL_op_desc[type]
$29 = 0x401222c9 "list assignment"
(gdb) p PL_op_desc[o->op_type]
$30 = 0xcbd9d855 <Address 0xcbd9d855 out of bounds>  <-- i to jest to co powoduje błąd

[wcześniej:]
(gdb) f 6
#6  0x40061e28 in Perl_mod (o=0x8057dc0, type=37) at op.c:1657
1657                mod(kid, type);
(gdb) p kid[0]
$31 = {op_next = 0x4029d1f8, op_sibling = 0x4029d1f8, op_ppaddr = 0x4029d200 <__morecore+64>,
  op_targ = 1076482560, op_type = 53768, op_seq = 16425, op_flags = 8 '\b', op_private = 210 'Ň'}
                                  ^^^^^

Największy dopuszczalny op_type to 350 (są określone w opnames.h).

Skąd ta lista się bierze to nie wiem i nie chce mi się już szukać.
Na szybko ten segfault można wyeliminować przez sprawdzanie op_type
w tym yyerror, ale to tylko workaround - błędem jest to, że taki op_type
w ogóle się tu znalazł.


-- 
Jakub Bogusz    http://prioris.mini.pw.edu.pl/~qboosh/



Więcej informacji o liście dyskusyjnej pld-devel-pl