CERT C: Rec. MSC24-C

Не используйте удержанные от использования или устаревающие функции

Описание

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

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

Примеры

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

Описание

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

Устаревшая функцияСтандартыРискЗаменяющая функция
asctimeУдержанный от использования в POSIX.1-2008Не ориентированный на многопотоковое исполнение.strftime или asctime_s
asctime_rУдержанный от использования в POSIX.1-2008Реализация на основе небезопасного функционального sprintf.strftime или asctime_s
bcmp

Удержанный от использования в 4.3BSD

Отмеченный как наследие в POSIX.1-2001.

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

Удержанный от использования в 4.3BSD

Отмеченный как наследие в POSIX.1-2001.

Возвращается из функции после нахождения первого отличающегося байта, делая его уязвимым для атак временным анализом. memcpy или memmove
brk и sbrkОтмеченный как наследие в SUSv2 и POSIX.1-2001. malloc
bsd_signalУдаленный в POSIX.1-2008 sigaction
bzeroОтмеченный как наследие в POSIX.1-2001. Удаленный в POSIX.1-2008. memset
ctimeУдержанный от использования в POSIX.1-2008Не ориентированный на многопотоковое исполнение.strftime или asctime_s
ctime_rУдержанный от использования в POSIX.1-2008Реализация на основе небезопасного функционального sprintf.strftime или asctime_s
cuseridУдаленный в POSIX.1-2001.Не повторно используемый. Точная функциональность не стандартизированные проблемы мобильности порождения.getpwuid
ecvt и fcvtОтмеченный как наследие в POSIX.1-2001. Удаленный в POSIX.1-2008Не повторно используемыйsnprintf
ecvt_r и fcvt_rОтмеченный как наследие в POSIX.1-2001. Удаленный в POSIX.1-2008 snprintf
ftimeУдаленный в POSIX.1-2008 time, gettimeofday, clock_gettime
gamma, gammaf, gammalФункция, не заданная в любом стандарте из-за исторических измененийПроблемы мобильности.tgamma, lgamma
gcvtОтмеченный как наследие в POSIX.1-2001. Удаленный в POSIX.1-2008. snprintf
getcontextУдаленный в POSIX.1-2008.Проблемы мобильности. Используйте поток POSIX вместо этого.
getdtablesizeAPI-функция BSD, не включенная в POSIX.1-2001Проблемы мобильности.sysconf( _SC_OPEN_MAX )
gethostbyaddrУдаленный в POSIX.1-2008Не повторно используемыйgetaddrinfo
gethostbynameУдаленный в POSIX.1-2008Не повторно используемыйgetnameinfo
getpagesizeAPI-функция BSD, не включенная в POSIX.1-2001Проблемы мобильности.sysconf( _SC_PAGESIZE )
getpassУдаленный в POSIX.1-2001.Не повторно используемый.getpwuid
getwНе существующий в POSIX.1-2001. fread
getwdОтмеченное наследие в POSIX.1-2001. Удаленный в POSIX.1-2008. getcwd
indexОтмеченный как наследие в POSIX.1-2001. Удаленный в POSIX.1-2008. strchr
makecontextУдаленный в POSIX.1-2008.Проблемы мобильности. Используйте поток POSIX вместо этого.
memalignПоявляется в SunOS 4.1.3. Не в 4.4 BSD или POSIX.1-2001 posix_memalign
mktempУдаленный в POSIX.1-2008.Сгенерированные имена предсказуемы и могут вызвать состояние состязания.mkstemp удаляет риск гонки
pthread_attr_getstackaddr и pthread_attr_setstackaddr Неоднозначности в спецификации stackaddr припишите проблемы мобильности причиныpthread_attr_getstack и pthread_attr_setstack
putwНе существующий в POSIX.1-2001.Проблемы мобильности.fwrite
qecvt и qfcvtОтмеченный как наследие в POSIX.1-2001, удаленном в POSIX.1-2008 snprintf
qecvt_r и qfcvt_rОтмеченный как наследие в POSIX.1-2001, удаленном в POSIX.1-2008 snprintf
rand_rОтмеченный как устаревший в POSIX.1-2008  
re_compAPI-функция BSDПроблемы мобильностиregcomp
re_exesAPI-функция BSDПроблемы мобильностиregexec
rindexОтмеченный как наследие в POSIX.1-2001. Удаленный в POSIX.1-2008. strrchr
scalbУдаленный в POSIX.1-2008 scalbln, scalblnf, или scalblnl
sigblock4.3BSD сигнализируют о API, источник которого неясен sigprocmask
sigmask4.3BSD сигнализируют о API, источник которого неясен sigprocmask
sigsetmask4.3BSD сигнализируют о API, источник которого неясен sigprocmask
sigstackИнтерфейс является устаревшим и не реализованный на большинстве платформ.Проблемы мобильности.sigaltstack
sigvec4.3BSD сигнализируют о API, источник которого неясен sigaction
swapcontextУдаленный в POSIX.1-2008Проблемы мобильности. Используйте потоки POSIX.
tmpnam и tmpnam_rОтмеченный как устаревший в POSIX.1-2008.Эта функция генерирует различную строку каждый раз, когда она называется до времен TMP_MAX. Если это называется больше, чем времена TMP_MAX, поведение задано реализацией. mkstemp, tmpfile
ttyslotУдаленный в POSIX.1-2001.  
ualarmОтмеченный как наследие в POSIX.1-2001. Удаленный в POSIX.1-2008.Ошибки под-заданнымsetitimer или POSIX timer_create
usleepУдаленный в POSIX.1-2008. nanosleep
utimeSVr4, POSIX.1-2001. POSIX.1-2008 отмечает как устаревший.  
valloc

Отмеченный как устаревший в 4.3BSD.

Отмеченный как наследие в SUSv2.

Удаленный из POSIX.1-2001

 posix_memalign
vfork

Удаленный из POSIX.1-2008

Под-заданным в предыдущих стандартах.fork
wcswcsЭта функция не была включена в итоговый ISO/IEC 9899:1990/Amendment 1:1995 (E).  wcsstr
WinExecWinAPI обеспечивает эту функцию только для 16-битной совместимости Windows. CreateProcess
LoadModuleWinAPI обеспечивает эту функцию только для 16-битной совместимости Windows. CreateProcess

Фиксация

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

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

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

Пример - распечатывание времени

#include <stdio.h>
#include <time.h> 

void timecheck_bad(int argc, char *argv[])
{
    time_t ticks; 

    ticks = time(NULL);
    printf("%.24s\r\n", ctime(&ticks));
}

В этом примере, функциональном ctime форматирует текущее время и распечатывает его. Однако ctime был удален после C99, потому что он не работает над многопоточными программами.

Коррекция — различная функция времени

Одна возможная коррекция должна использовать strftime вместо этого, потому что эта функция использует buffer size набора.

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

void timecheck_good(int argc, char *argv[])
{
    char outBuff[1025];
    time_t ticks; 
    struct tm * timeinfo;
    
    memset(outBuff, 0, sizeof(outBuff)); 
    
    ticks = time(NULL);
    timeinfo = localtime(&ticks);
    strftime(outBuff,sizeof(outBuff),"%I:%M%p.",timeinfo);
    fprintf(stdout, outBuff);
}

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

Группа: Rec. 48. Разное (MSC)

Введенный в 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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