Use of obsolete standard function

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

Описание

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

Зафиксировать

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

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

Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты 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);
}

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

Группа: Безопасность
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: OBSOLETE_STD_FUNC
Влияние: Низкое
ИДЕНТИФИКАТОР CWE : 474, 477
Теги: # uprecatedFunctions
Введенный в R2015b