StringCchLength はいらない子?

文字列の長さを算出する関数といえば

  • strlen, wcslen, _mbslen …つか _tcslen
  • lstrlen

がありますが、VC7.0 (?) から導入された strsafe.h では新たに [http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/resources/strings/stringreference/stringfunctions/stringcchlength.asp?frame=true:title=StringCchLength] なるものが追加されています。 安全な文字列操作をするために、この strsafe.h が追加され、姉妹である StringCchPrintf 等は、必ず書き込むバッファの大きさを引数に取り、バッファオーバーフローさせないような仕組みになっています。 コレ自体は納得できます。

が、

StringCchLength も第2引数に、バッファの量を引数にとります。 …これから文字列の長さを測ろうとするのに、バッファの量を引数にとるわけですよ。 なので、こんなコードはアウトということに。

int StringOpFunc(LPCTSTR szString)
{
  size_t nStrLength;
  ::StringCchLength(szString, /*どーすんの?*/, &nStrLen);

    :
    :
}

長さ取得するためで一切書き込まないのに、何でこんな仕様にになってるのかなぁ… とかちょっと困ってみますが、たぶんコレ \0で終わってない文字列が来たときの為 なんだろうなぁー と勝手に思ってます。 安全な文字列操作なわけですから、変なメモリ空間を参照して、落ちてもらっては困りますからね。

…ただ、こうするんであれば、文字列クラス (basic_string とか CString)とかで文字列をやりとしたほうが、より安全なんじゃないかとも同時思ってみたりします。(ぉ
…でも、文字列クラスを関数の引数としてやり取りするってのが好きじゃないんだよなぁ……

さて、どうすっかー。