バッファオーバーフローを防げ

前に、wsprintfやsprintfは、バッファオーバーフローを防げなくて参った、と、思ってたら、
snprintfという関数があった(というのを最近知った)。
たとえばこういうソースを書くと、とんでもない事になる。

#include <stdio.h>

int main(int argc, char **argv)
{
   char buf[10];
   memset(&buf, 0, sizeof(buf));
   sprintf(buf, "%15s", "0123456789abcde");
   printf("実行結果");
   printf(buf);
   return 0;
}


実行結果
0123456789abcde
何がどうなるかというと、bufの大きさを無視してガッツリとメモリを書き換えちゃうところが大問題。
こういうときは、snprintfという関数を使うとこうなるらしい。

#include <stdio.h>

int main(int argc, char **argv)
{
   char buf[10];
   memset(&buf, 0, sizeof(buf));
   snprintf(buf, sizeof(buf), "%15s", "0123456789abcde");
   printf("実行結果");
   printf(buf);
   return 0;
}


実行結果
012345678
手元のcygwinで動いたので、よーし、Win32で、と思ったらVC++だと使えなかった。。
調べてみると_snprintf
というのはあるんだが、nullでの終端が保障されないみたい。惜しい。