Use of dangerous standard function

Опасные функции вызывают возможное переполнение буфера в целевом буфере

Описание

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

В следующей таблице перечислены опасные стандартные функции, риски использования каждой функции, и что функция использовать вместо этого. Флаги средства проверки:

  • Любое использование по сути опасной функции.

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

Опасная функцияРискните уровнемБолее безопасная функция
getsПо сути опасный — Вы не можете управлять длиной входа от консоли.fgets
cinПо сути опасный — Вы не можете управлять длиной входа от консоли.Избегайте или вызовы предисловий cin с cin.width.
strcpyВозможно опасный — Если исходная длина больше места назначения, переполнение буфера может произойти.strncpy
stpcpyВозможно опасный — Если исходная длина больше места назначения, переполнение буфера может произойти.stpncpy
lstrcpy или StrCpyВозможно опасный — Если исходная длина больше места назначения, переполнение буфера может произойти.StringCbCopy, StringCchCopy, strncpy, strcpy_s, или strlcpy
strcatВозможно опасный — Если конкатенированный результат больше места назначения, переполнение буфера может произойти.strncat, strlcat, или strcat_s
lstrcat или StrCatВозможно опасный — Если конкатенированный результат больше места назначения, переполнение буфера может произойти.StringCbCat, StringCchCat, strncay, strcat_s, или strlcat
wcpcpyВозможно опасный — Если исходная длина больше места назначения, переполнение буфера может произойти.wcpncpy
wcscatВозможно опасный — Если конкатенированный результат больше места назначения, переполнение буфера может произойти.wcsncat, wcslcat, или wcncat_s
wcscpyВозможно опасный — Если исходная длина больше места назначения, переполнение буфера может произойти.wcsncpy
sprintfВозможно опасный — Если продолжительность выхода зависит от неизвестных длин или значений, переполнение буфера может произойти.snprintf
vsprintfВозможно опасный — Если продолжительность выхода зависит от неизвестных длин или значений, переполнение буфера может произойти.vsnprintf

Риск

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

Фиксация

Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Bug Finder в Пользовательском интерфейсе Рабочего стола Polyspace.

Смотрите примеры мер ниже.

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

Примеры

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

#include <stdio.h>
#include <string.h>
#include <iostream>

#define BUFF_SIZE 128


int dangerous_func(char *str)
{
    char dst[BUFF_SIZE];
    int r = 0;

    if (sprintf(dst, "%s", str) == 1)
    {
        r += 1;
        dst[BUFF_SIZE-1] = '\0';
    }
    
    return r;
}

Эта функция, взятая в качестве примера, использует sprintf скопировать строку str к dst. Однако, если str больше, чем буфер, sprintf может вызвать переполнение буфера.

Коррекция — использует snprintf с Buffer Size

Одна возможная коррекция должна использовать snprintf вместо этого и задайте buffer size.

#include <stdio.h>
#include <string.h>
#include <iostream>

#define BUFF_SIZE 128


int dangerous_func(char *str)
{
    char dst[BUFF_SIZE];
    int r = 0;

    if (snprintf(dst, sizeof(dst), "%s", str) == 1)
    {
        r += 1;
        dst[BUFF_SIZE-1] = '\0';
    }
    
    return r;
}

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

Группа: безопасность
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: DANGEROUS_STD_FUNC
Удар: низко
ID CWE: 242, 676
Введенный в R2015b