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
格納する最大文字数。
って書いてある。引数名が罠。
VS2010で関数にカーソル当てると出てくるチップでは「size_t _SizeInWords」って書いてあった。こっちならまだ解ったのに。
これ案外引っかかりやすそうな罠だと思うんだけど、ググっても出てこないんだよね。
みんな引っかからないのかな。
私がヘボいだけなのか。