swprintf → swprintf_sに移行したらメモリ破壊した

VC6のプロジェクトをVS2010にする作業をしているのですが、

warning C4996: ‘sprintf’: This function or variable may be unsafe.

みたいな警告が出まくるんですよね。
これは「sprintfとか古くてセキュリティ的にヤバイからsprintf_s使え」みたいな意味で、別にそのままでも使えないことはないけど、
「_s付きのに移行せよ」
って指示を受けたのでせっせこ移行作業してるんですよ。

どうせならVS2015とかにしてくれてもいいのい。

で、_s付きのって大抵、

char buff[20];
int val = 10;
sprintf_s(buff, sizeof(buff), "%d", val);

みたいな感じで第一引数のバッファのサイズを第二引数に渡すだけなんだけど、swprintfを同じようにswprintf_sにしてみたらメモリ破壊してくれた。

wchar_t buff[20];
int val = 10;
swprintf_s(buff, sizeof(buff), "%d", val);

これでメモリ破壊が起る。

コレ、正解は

swprintf_s(buff, 20, "%d", val);

sprintf_s系の第二引数はバッファサイズじゃなくて文字数なんですね。
MSDNには

sizeOfBuffer
  格納する最大文字数。

MSDN

って書いてある。引数名が罠。
VS2010で関数にカーソル当てると出てくるチップでは「size_t _SizeInWords」って書いてあった。こっちならまだ解ったのに。

これ案外引っかかりやすそうな罠だと思うんだけど、ググっても出てこないんだよね。
みんな引っかからないのかな。
私がヘボいだけなのか。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

認証のために問題を解いて下さい * Time limit is exhausted. Please reload CAPTCHA.