このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
文字列操作で格納先バッファーがオーバーフローしています
関数がバッファー サイズより大きいオフセットでバッファーに書き込む
説明
この欠陥は、特定の文字列操作関数によって、その格納先バッファー引数にバッファー サイズを超えるオフセットで書き込まれた場合に発生します。
たとえば、関数 sprintf(char* buffer, const char* format)
を呼び出す際に、buffer
より大きいサイズの定数文字列 format
を使用する場合などです。
リスク
バッファー オーバーフローにより、メモリ破損やシステム停止といった予期しない動作を引き起こす可能性があります。また、バッファー オーバーフローは、コード インジェクションのリスクにもつながります。
修正方法
1 つの解決策として、代替となる関数を使用して、書き込まれる文字の数を制限します。次に例を示します。
書式設定されたデータを文字列に書き込むのに
sprintf
を使用している場合は、代わりにsnprintf
、_snprintf
またはsprintf_s
を使用して長さを制御します。あるいは、asprintf
を使用して、格納先バッファーに必要なメモリを自動で割り当てます。書式設定されたデータを可変引数リストから文字列に書き込むのに
vsprintf
を使用している場合は、代わりにvsnprintf
またはvsprintf_s
を使用して長さを制御します。ワイド文字列をコピーするのに
wcscpy
を使用している場合は、代わりにwcsncpy
、wcslcpy
またはwcscpy_s
を使用して長さを制御します。
別の解決策として、バッファー サイズを増やします。
例
結果情報
グループ: 静的メモリ |
言語: C | C++ |
既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: STRLIB_BUFFER_OVERFLOW |
影響度: High |
バージョン履歴
R2015b で導入