Описание
Использование опасной проверки стандартной функции подсвечивает использование функций, которые являются по сути опасными или потенциально опасными данными определенными обстоятельствами. В следующей таблице перечислены возможно опасные функции, риски использования каждой функции, и что функция использовать вместо этого.
Опасная функция | Рискните уровнем | Более безопасная функция |
---|
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 |
Риск
Эти функции могут вызвать переполнение буфера, которое атакующие могут использовать, чтобы пропитать вашу программу.
Фиксация
Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Polyspace Bug Finder.
Смотрите примеры мер ниже.
Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Комментарии.
Пример - Используя sprintf
#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;
}