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

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

Описание

Управляйте определением

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

Примеры

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

Описание

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

Риск

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

Фиксация

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

Пример - выходной обработчик с вызовом 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 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

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