[234] Re:インタプリタとコンパイラ
投稿者:(ぱ)
2007/02/20 02:13:25
Perlに詳しいわけではありませんが、故あって最近Perlのソースを眺めたりも
してるので、ちょっと調べてみました。
>perlの場合、関数の引数は全て配列(@_)として扱われます。なので、この場合は、
>一つ目の%sには$_[0]が、二つ目の%sには$_[1]が、三つ目の%sには$_[2]が入ります。
Perlで記述された関数についてはその通りでしょうが、今回のケースのsprintfは
Perl組み込みの関数ですから、Cで書かれた実装部分に引数の数が渡っているかどうかが
問題では?
で、5.8.6のソースから探したところ、どうもsv.cのPerl_sv_vcatpvfnが
sprintfの実装のように見えます(1000行近い巨大関数。sprintfじゃあ
しょうがないですが)。
void
Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen,
va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
doop.cのPerl_do_printf()から追跡すると、このsvmaxが、引数の数のように見えます。
printfかましてminiperlを再構築し、確認しましたが、実際に引数の数が渡って
きているようです。
が、この関数の中でsvmaxをどう使っているか見てみると、
if (svix < svmax) {
というように「svmaxを超えてないか?」というチェックは何箇所かでしてますが、
上記の箇所でもelse節はなかったりするので、そのために何も起きないんじゃ
ないでしょうか。