Abnormal termination of 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
Удар: носитель
ID CWE: 705

Введенный в R2017b