CERT C: Rule POS33-C

Не используйте vfork ()

Описание

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

Не используйте vfork ().[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Функция 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);
}

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

Группа: Правило 50. POSIX (POS)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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