K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>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節はなかったりするので、そのために何も起きないんじゃ >ないでしょうか。
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!