使用git时,我在SVN perl模块中遇到了一个错误:

Bizarre copy of UNKNOWN in subroutine entry at
/usr/lib/perl5/vendor_perl/SVN/Base.pm line 80.


而且我不太确定这是Perl错误还是Subversion错误。这是相关的部分:

# insert the accessor
if (m/(.*)_get$/) {
    my $member = $1;
    *{"${caller}::$1"} = sub {
    &{"SVN::_${pkg}::${prefix}${member}_". # <<<< line 80
          (@_ > 1 ? 'set' : 'get')} (@_)
      }
}


full source

什么是“ Bizarre副本”?那是谁的错?

编辑:软件版本


颠覆1.6.15-1
perl 5.14.0-1




解决:当您使用不兼容的标志进行编译时,会发生这种情况:

https://groups.google.com/d/msg/subversion_users/EOru50ml6sk/5xrbu3luPk4J

最佳答案

该perldoc为您提供了简短的答案,但是简短的STFW会话会产生更多细节。这基本上是Perl中堆栈被破坏的证据。

琐碎的例子:

#!/usr/bin/perl
my @A = 1..5;
sub blowUp {
   undef @A;
   my $throwAway = {};
   print for @_;       # <== line 6
}
blowUp(@A);
__END__
bash$ ./blowitup
Bizarre copy of HASH in print at ./blowitup line 6.


而且,如果没有$ throwAway分配,那么它变得更加有趣,这是一个看不见的错误(尽管在“使用警告”下,它至少仍会告诉您您正在尝试访问未初始化的值)。只是在您进行新作业时,您会看到奇怪的行为。

由于@_本质上是词法范围内的子例程,并且参数是通过引用传递的,因此该小子例程基本上是通过取消定义@_所指向的内容来从自身中抽出地毯(如果更改,则会得到相同的行为作业的undef,fwiw)。我在perl5-porter上发现了许多帖子,这些帖子将其作为以下事实的产物:堆栈中的项目不进行引用计数,因此不能干净地释放。

因此,尽管我没有深入查看完整源代码中的所有代码,但我将继续猜测其中的某些内容与@_上传递的内容混淆了;然后,当再次引用@_时,Perl告诉您丹麦发生了一些腐烂。

眼前的问题是脚本/模块iow中的错误。还存在Perl更深层的问题,即不引用这些项目,但是我怀疑您短期内会更好地修复该模块。 :-)

HTH-
布赖恩

09-07 17:17