exponenta event banner

CERT C: ENV32-C правил

Все обработчики выхода должны возвращаться в нормальном режиме

Описание

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

Все обработчики выхода должны нормально возвращаться. [1 ]

Внедрение Polyspace

Эта проверка проверяет ненормальное завершение обработчика выхода.

Примеры

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

Проблема

При аномальном завершении обработчика выхода выполняется поиск зарегистрированных обработчиков выхода. Обработчики выхода регистрируются с определенными функциями, такими как atexit, (WinAPI) _onexit, или at_quick_exit(). Если обработчик выхода вызывает функцию, которая прерывает ожидаемую последовательность завершения программы, Polyspace вызывает дефект. Некоторые функции, которые могут вызвать аномальные выходы: exit, abort, longjmp, или (WinAPI) _onexit.

Риск

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

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

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

Пример - Выход обработчика с вызовом exit
#include <stdlib.h>

volatile int some_condition = 1;
void demo_exit1(void)
{
    /* ... Cleanup code ... */
    return;
}
void exitabnormalhandler(void)
{
    if (some_condition)
    {
        /* Clean up */
        exit(0);
    }
    return;
}

int demo_install_exitabnormalhandler(void)
{

    if (atexit(demo_exit1) != 0) /* demo_exit1() performs additional cleanup */
    {
        /* Handle error */
    }
    if (atexit(exitabnormalhandler) != 0)
    {
        /* Handle error */
    }
    /* ... Program code ... */
    return 0;
}

В этом примере: demo_install_exitabnormalhandler регистрирует два обработчика выхода, demo_exit1 и exitabnormalhandler. Обработчики выхода вызываются в обратном порядке, в котором они зарегистрированы. Когда программа заканчивается, exitabnormalhandler прогоны, затем demo_exit1. Однако exitabnormalhandler требования exit прерывание процесса завершения программы. Имея это exit внутри обработчика выхода вызывает неопределенное поведение, так как программа не завершена безопасно.

Исправление - Удалить exit из обработчика выхода

Одной из возможных корректировок является нормальное завершение работы обработчиков выхода. Для этого примера: exit удаляется из exitabnormalhandler, позволяя завершить процесс завершения выхода, как и ожидалось.

#include <stdlib.h>

volatile int some_condition = 1;
void demo_exit1(void)
{
    /* ... Cleanup code ... */
    return;
}
void exitabnormalhandler(void)
{
    if (some_condition)
    {
        /* Clean up */
        /* Return normally */
    }
    return;
}

int demo_install_exitabnormalhandler(void)
{

    if (atexit(demo_exit1) != 0) /* demo_exit1() continues clean up */
    {
        /* Handle error */
    }
    if (atexit(exitabnormalhandler) != 0) 
    {
        /* Handle error */
    }
    /* ... Program code ... */
    return 0;
}

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

Группа: Правило 10. Окружающая среда (ENV)
Представлен в R2019a

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

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

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