CERT C: Rec. PRE09-C

Не заменяйте безопасные функции на или устаревающие функции устаревшие

Описание

Управляйте определением

Не заменяйте безопасные функции на или устаревающие функции устаревшие. [1]

Примеры

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

Описание

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

Опасная функцияРискните уровнемБолее безопасная функция
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;
}

Проверяйте информацию

Группа: Rec. 01. Препроцессор (PRE)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.