まつもと ゆきひろです

In message "[ruby-dev:19984] Re: ""*n"
    on 03/04/10, Tadayoshi Funaba <tadf / rc5.so-net.ne.jp> writes:

|>      if (len < 0) {
|>  	rb_raise(rb_eArgError, "negative argument");
|>      }
|>      if (LONG_MAX/len <  RSTRING(str)->len) {
|>  	rb_raise(rb_eArgError, "argument too big");
|>      }
|> 
|> のコストはほとんどゼロだと思うんですが。
|
|いや、それは違います。無駄に感じるのは、その後にループがあるからです。

それを含めても

1    str2 = rb_str_new5(str,0, RSTRING(str)->len*len);
2    for (i=0; i<len; i++) {
3	memcpy(RSTRING(str2)->ptr+(i*RSTRING(str)->len),
4	       RSTRING(str)->ptr, RSTRING(str)->len);
5    }
6    RSTRING(str2)->ptr[RSTRING(str2)->len] = '\0';
7
8    OBJ_INFECT(str2, str);
9
10   return str2;

1でstrのdereference
2でi<lenの比較1回(loopの中身は実行しない)
6でdereferenceが2回、代入が1回
8でフラグのコピー

ですから、差は無視できるのではないかと思います。むしろ、負の
数を通しちゃったりするほうがまずいように思えるのですが。
taintの伝搬は長さ0なんだから気にしなくてもよいと思いますが。

                                まつもと ゆきひろ /:|)