2010年4月23日 星期五

這段老程式碼實在太 GY 了我忍不住要再來抱怨一次。
明明口頭上答應的介面宣告是:

foo( char * sz );

看 到 char *sz 就知道這會是一句 character array,用 「一個」'\0' 結尾
但是實際上身體的作法卻是把 sz 當作 array of character arrays -

foo( wchar_t * sz)
{
    while (*sz)
    {
        process(*sz);
        sz += wstrlen(sz) + 1;
    }
}
 


也就是說,在實做上先假設 sz 用「兩個」'\0' 結尾。這個前提造成了一個陷阱:如果 caller 傳進去的是 wstring.c_str() -

foo( wstr.c_str() ) ;

Programmer 以為一定妥當的作法,其實並不然,因為 wstring.c_str() 的結尾是「一個」'\0' ,至於結尾後面的,並不保證一定是 '\0' ,萬一不是,這個迴圈就會繼續跑,取出一些垃圾放進process ,然後一直執行到出事為止。

後記:foo 的合約應該要改成 wchar_t sz[][] 比較貼切,想想 wmain 的宣告也是這樣:

wmain( int argc, char argv[][] );

沒有留言:

張貼留言