我试图在一些Git源代码中进行一些攻击(如Git的源代码,而不仅仅是由Git管理的一些随机代码)。我正在看的那个位于Perl,我无法理解正在发生的事情。
我对Perl的经验很少(而且几年前);我曾经问过几个有更多经验的朋友,但是他们什么也没找到。
代码的相关位于v1.8.1.5 source code,其中git-svn.perl
的cmd_fetch
函数包含以下行:
$_fetch_all ? $gs->fetch_all : $gs->fetch;
我最好的解读是,它会调用fetch
或fetch_all
函数(我无法看到它是如何做其他事情的,当然)。
在SVN.pm中,我们发现fetch
function,它以以下行开头:
my ($self, $min_rev, $max_rev, @parents) = @_;
我认识到收集函数参数,但(最后,我的问题):这些参数在哪里传递?
答案 0 :(得分:4)
使用箭头表示法调用的函数称为方法。方法的第一个参数是调用其方法的对象。因此$self
将设置为$gs
。其余参数为空,因此为undef
。
答案 1 :(得分:2)
首先,我真的希望你引用的代码左边有一个赋值。使用条件运算符进行控制流是危害人类罪。也就是说,您对发生的事情的直觉是正确的:根据$_fetch_all
的值,调用$gs->fetch
或$gs->fetch_all
。现在,关于论证问题。
Perl方法通过将调用者前置到参数列表来调用传递参数,因此调用
$gs->fetch
导致参数($gs)
作为@_
传递给方法。参数赋值行
my ($self, $min_rev, $max_rev, @parents) = @_;
然后列出分配
my ($self, $min_rev, $max_rev, @parents) = ($gs);
列表分配分配相应的元素,直到左侧的数组或散列吃掉所有参数或者受让人列表用完为止,根据需要用undef
填充列表。因此$self
获取$gs
,$min_rev
和$max_rev
获取undef
,@parents
获取空列表。事实证明,这些都是有效的值,因此不会发生任何不幸事件。
如果您想影响$min_rev
等人的值,您可以将呼叫站点更改为
$gs->fetch(5, 9)
(事实证明@parents
被忽略了,所以我不知道它的法律价值是什么。)