VC8(VisualStudio2005)では CRTのセキュリティ強化 と称して今までの関数に
_sつけた方がいいってなってる。たとえば、strcpy(a,"bbbb")だと、バッファオーバフロー
する事があるから strcpy_s(a,sizeof(a),"bbbb")にしなさいよって話し。
こいつはすごく便利で、 sprintfとかもサイズ指定できて、
コード上の潜在的な危険性はかなり消えたと思う。
で、この_s付きの関数の中で何も変わってなさそうにみえるのが sscanf_s関数。
sscanf関数は
char* a = "a 1 b c";
char aa[10];
int b;
char cc[10];
char dd[10];
sscanf(a,"%s %d %s %s",aa,&b,cc,dd);
とする関数。
んで、新しいCRTの強化バージョンの sscanf_s関数を見ると
int sscanf_s( const char *buffer, const char *format, ... );
となっているので何も変わっていないかのように見える。
ところが、上の関数の sscanfのところを sscanf_sにして実行してみると
しばらく止まったあと、実行エラーとなる。
この関数は実は、%s,%S,%c,%Cの場合、Argment引数にサイズを指定する必要がある。
こうするのが正解。
sscanf_s(a,"%s %d %s %s",aa,sizeof(aa),&b,cc,sizeof(cc),dd,sizeof(dd));
scanf_sも同様。
気をつけよう。