sscanf_sの注意点

  • デル株式会社
  • 
    
    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も同様。
     気をつけよう。
    
    
    
    
    
    
    
    
    
    

    関連記事

    ページ上部へ戻る