exponenta event banner

Переполнение буфера назначения при обработке строк

Функция записывает в буфер с отрицательным смещением от начала буфера

Описание

Этот дефект возникает, когда определенные функции обработки строк записывают в аргумент целевого буфера с отрицательным смещением от начала буфера.

Например, для функции sprintf(char* buffer, const char* format), вы получаете buffer из операции buffer = (char*)arr; ... buffer += offset;. arr является массивом и offset является отрицательным значением.

Риск

Переполнение буфера может вызвать непредвиденное поведение, например повреждение памяти или остановку системы. Недостаточный поток буфера также создает риск введения кода.

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

Если аргумент буфера назначения является результатом арифметики указателя, проверьте, не уменьшается ли указатель. Исправьте уменьшение указателя, изменив либо исходное значение перед уменьшением, либо значение уменьшения.

Примеры

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

#include <stdio.h>
#define offset -2

void func(void) {
    char buffer[20];
    char *fmt_string ="Text";

    sprintf(&buffer[offset], fmt_string);     
}

В этом примере: &buffer[offset] имеет отрицательное смещение от памяти, выделенной buffer.

Коррекция - Изменение декрементного указателя

Одной из возможных корректировок является изменение значения offset.

#include <stdio.h>
#define offset 2

void func(void) {
    char buffer[20];
    char *fmt_string ="Text";

    sprintf(&buffer[offset], fmt_string);     
}

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

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