On Tue, Sep 06, 2005 at 07:01:06PM -0700, Chris Heath wrote:

> Throwing an exception inside a grep sometimes causes Perl
> to emit an internal warning.
> 
> $ perl -e 'for ("foo") { grep(die, "bar") }'
> Died at -e line 1.
> Attempt to free unreferenced scalar: SV 0x96c61dc, Perl interpreter: 
> 0x96ae008.

The unreferenced scalar seems to be "bar" as this will still generate an error

$ perl -e 'grep {die} "bar" for undef'
Died at -e line 1.
Attempt to free unreferenced scalar: SV 0x800dd0.

(undef has special reference counting semantics)

Replacing grep with map produces the same error.

> Does this warning indicate possible internal corruption?  I have seen
> some Perl corruption in a production system at my work recently, as well
> as this warning, so I wondered if they could be related.

Well, it's a double "free", in as much as one part of the interpreter has a
pointer to a block of memory that will be recycled as a new scalar at some
point. I'm not sure quite what route, or what manipulation of $@ could create
actual corruption though.

Nicholas Clark

Reply via email to