exponenta event banner

CERT C: Rec. MSC24-C

Не использовать устаревшие и устаревшие функции

Описание

Определение правила

Не используйте устаревшие или устаревшие функции. [1 ]

Внедрение Polyspace

Эта проверка проверяет использование устаревшей стандартной функции.

Примеры

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

Проблема

Использование устаревшей стандартной функции обнаруживает вызовы стандартных процедур функций, которые считаются устаревшими, удаленными, устаревшими или устаревшими стандартами кодирования 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.
getdtablesizeФункция API BSD не включена в POSIX.1-2001Проблемы переносимости.sysconf( _SC_OPEN_MAX )
gethostbyaddrУдален в POSIX.1-2008Не въезжаетgetaddrinfo
gethostbynameУдален в POSIX.1-2008Не въезжаетgetnameinfo
getpagesizeФункция API 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_compФункция API BSDПроблемы переносимостиregcomp
re_exesФункция API 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 Desktop.

См. примеры исправлений ниже.

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

Пример - Время выхода на печать
#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 вместо этого, поскольку эта функция использует установленный размер буфера.

#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 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.