メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

不正確な文字列形式指定子によるバッファー オーバーフロー

文字列形式指定子により標準ライブラリ関数のバッファー引数でオーバーフローが発生

説明

この欠陥は、sscanf などの関数の形式指定子引数が、メモリ バッファー引数でのオーバーフローまたはアンダーフローにつながる場合に発生します。

リスク

形式指定子で指定した精度がメモリ バッファー サイズより大きいと、オーバーフローが発生します。オーバーフローは、メモリ破損のような予期しない動作を引き起こす可能性があります。

修正方法

メモリ バッファー サイズに適合する形式指定子を使用します。

すべて展開する

#include <stdio.h>

void func (char *str[]) {
    char buf[32];
    sscanf(str[1], "%33c", buf);
}

この例では、bufchar 要素を 32 個格納できます。したがって、形式指定子 %33c はバッファー オーバーフローの原因となります。

修正 — より低い精度を形式指定子に使用

考えられる修正の 1 つは、バッファーに読み込む要素の数を減らすことです。

#include <stdio.h>

void func (char *str[]) {
    char buf[32];
    sscanf(str[1], "%32c", buf);
}

結果情報

グループ: 静的メモリ
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: STR_FORMAT_BUFFER_OVERFLOW
影響度: High

バージョン履歴

R2015b で導入