Abnormal termination of exit handler

Функция Exit handler прерывает нормальное выполнение программы

Описание

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

  • Обработчики выхода являются функциями, предназначенными для выполнения, когда программа заканчивается. Эти функции сначала регистрируются с определенными функциями, такими как atexit, (WinAPI) _onexit, или at_quick_exit().

  • Некоторые функции, которые могут вызвать ненормальные выходы exit, abort, longjmp, или (WinAPI) _onexit.

Риск

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

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

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

Примеры

расширить все

#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;
}

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

Группа: Программирование
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: EXIT_ABNORMAL_HANDLER
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 705
Введенный в R2016b