文字列操作関数はやっぱりヤヴァイよ

Winny脆弱性が話題になってますが、こちら に、こんなことが書いてありました。

この脆弱性は、strcpy() で発生します。


やっちまったよ47氏!(涙


かなり前から strcpy や sprintf などは、バッファオーバーランする可能性が強いから使うなとか言われていましたが…………コードに書きなれている(と思う)人でも、やっちまうんですなぁ…

なんつーか、やっぱり既存のC言語の文字列操作関数は、"言語レベルで" 廃止したほうが今後の為になるような…。 せめて、#define で USE_OLD_STRING_FUNCTION 見たいなのが定義されていないと利用できないようにしたほうが良いような気がしてなりません。(ただ、少なからず VS2005 からは警告が出るような気がしましたがー。)


ちなみに私は、できるだけ std::basic_string*1 を利用するようにしてます。 どうしてもメモリ直でいじらなくてはならない場合は、strsafe.h で定義されている[http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/resources/strings/stringreference/stringfunctions/stringcchcopy.asp?frame=true:title=StringCchCopy()] 等を利用するようにしています。 バッファの量を引数にとるので安全性が高まりますよ。ホント。*2

で、C99 では 似たような安全に文字列を操作する為の関数って追加されたんでしたっけ…? sprintf_s とかいうのは入ったみたいだけど…ん〜? C99 の情報はあんまり入ってないからなぁ…。^^;

*1:≒std::string

*2:でも、いまだに StringCchLength のうまい使い方が分りません:苦笑