Destination buffer underflow in string manipulation

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

Описание

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

Для образца, для функции 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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: STRLIB_BUFFER_UNDERFLOW
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 124, 786, 787
Введенный в R2015b