exponenta event banner

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

Устаревшие процедуры могут стать причиной уязвимостей системы безопасности и проблем с переносимостью

Описание

Этот дефект возникает при использовании стандартных процедур функций, которые считаются устаревшими, удаленными, устаревшими или устаревшими стандартами кодирования 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);
}

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

Группа: Безопасность
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: OBSOLETE_STD_FUNC
Воздействие: Низкий
CWE ID: 474, 477
Теги: # устаревшие Функции
Представлен в R2015b