可以"尝试释放未引用的标量"错误被安全忽略?

时间:2014-07-07 19:22:28

标签: perl

我还没弄清楚导致它的原因,但我想知道是否会对错误(警告?)消息产生任何影响“尝试释放未引用的标量:SV 0x825b790在全局销毁期间”。对于未经训练的人来说,似乎由于编译器不愿意检测到问题,因此它没有继续并重新删除未引用的内存。

这只是告诉我,我的编程很草率吗?或者是否存在我应该关注的真正问题?

背景:这不是我的代码,我没有时间去追捕这个问题,我应该注意到它正在程序结束时发生。

1 个答案:

答案 0 :(得分:8)

这是XS模块或Perl本身的错误。这意味着已经请求释放已经解除分配的标量。

这表明某些代码持有一个它认为有效的指针,但不是。这可能导致代码写入内存,代码不应该修改,这可能导致数据完整性问题,段错误等。

程序退出时检测到,但问题可能随时发生。从释放错误到发出错误之前,您会遇到问题。

例如,

use Inline C => <<'__EOI__';

void buggy(SV* sv) {
   SvREFCNT_dec(sv);
}

__EOI__

my $x;
buggy($x);
# $x is no longer allocated here, but I could still try to use it.

输出:

Attempt to free unreferenced scalar: SV 0xc43fc0, Perl interpreter: 0xc22690.