strxxx 関係のセキュリティ強化

strxxx 関係のセキュリティが強化された関数の説明です。

前田稔(Maeda Minoru)の超初心者のプログラム入門

文字列操作

  1. 今まで文字列操作は strcpy や lstrcpy 等を使っていましたが、これらはいとも簡単に確保したバッファ以上の領域に文字列を書き込んでしまいます。
    最近ではこれらの関数を使うと warning(警告)が発せられます。
    そこでオーバーランをしないよう考慮した関数が strsafe.h で提供されています。
    詳細は <strsafe.h> で追加された文字列操作関数について を参照して下さい。
  2. strsafe.h を使った簡単なプログラム例を紹介します。
    Shift_JIS で定義した文字列 sou を des にコピーする場合です。
    des は \0 を含めて12バイト必要です。
    領域が不足するとエラーになります。
    // strsafe Program File
    #include <windows.h>    //LPSTR
    #include <strsafe.h>
    
    void  main()
    {
        LPSTR  sou = "LPSTR 12345";
        char   des[12];
    
        if (StringCbCopy(des, 12, sou) != 0)
                MessageBox(NULL,"Cb Copy Error","Error",MB_OK);
        else    MessageBox(NULL,des,"Copy",MB_OK);
    }
    
  3. もう一本、文字列を連結するプログラムを紹介しましょう。
    des に文字列 "abc\r\n" を連結します。
    des は改行コードを含めて20バイト(des:14, "abc\r\n":5, \0) 以上必要です。
    領域が不足するとエラーになります。
    // strsafe Program Sample
    #include <windows.h>    //MessageBox
    #include <strsafe.h>
    
    void  main()
    {
        char   des[40] = "char[] 12345\r\n";
    
        if (StringCbCat(des, 40, "abc\r\n") != 0)
            MessageBox(NULL,"CbCat Error","Error",MB_OK);
        else
            MessageBox(NULL,des,"CbCat",MB_OK);
    }
    
  4. strsafe は Shift_JIS だけでなく Unicode にも対応しています。
    説明と例題は Program Guid などに掲載しています。

超初心者のプログラム入門(C/C++)