バッファオーバーフローを防げ
前に、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; }
何がどうなるかというと、bufの大きさを無視してガッツリとメモリを書き換えちゃうところが大問題。
実行結果
0123456789abcde
こういうときは、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; }
手元のcygwinで動いたので、よーし、Win32で、と思ったらVC++だと使えなかった。。
実行結果
012345678
調べてみると_snprintf
というのはあるんだが、nullでの終端が保障されないみたい。惜しい。