Аварийное завершение выходного обработчика

Выйдите функция-обработчик прерывает нормальное осуществление программы

Описание

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

Риск

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

Фиксация

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

Примеры

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

#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