exponenta event banner

Переполнение буфера из неверного спецификатора формата строки

Спецификатор строкового формата вызывает переполнение буферного аргумента стандартных библиотечных функций

Описание

Этот дефект возникает, когда аргумент спецификатора формата для таких функций, как sscanf приводит к переполнению или занижению в аргументе буфера памяти.

Риск

Если спецификатор формата указывает точность, превышающую размер буфера памяти, происходит переполнение. Переполнение может привести к непредвиденному поведению, такому как повреждение памяти.

Зафиксировать

Используйте спецификатор формата, совместимый с размером буфера памяти.

Примеры

развернуть все

#include <stdio.h>

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

В этом примере: buf может содержать 32 char элементы. Поэтому спецификатор формата %33c вызывает переполнение буфера.

Коррекция - использовать меньшую точность в спецификаторе формата

Одной из возможных корректировок является считывание меньшего числа элементов в буфер.

#include <stdio.h>

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

Информация о результатах

Группа: Статическая память
Язык: C | C++
По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода
Синтаксис командной строки: STR_FORMAT_BUFFER_OVERFLOW
Воздействие: Высокое
CWE ID: 124, 125, 126, 127
Представлен в R2015b