CERT C: Rule 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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