CERT C++: SIG34-C

Не делайте позывного () из прерываемых обработчиков сигнала

Описание

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

Не делайте позывного () из прерываемого сигнала handlers.[1]

Реализация Polyspace

Это средство проверки проверяет на вызов Сигнала из обработчика сигнала.

Примеры

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

Проблема

Вызов сигнала из обработчика сигнала происходит, когда вы вызываете signal() от обработчика сигнала на платформах Windows®.

Проблема обнаруживается, только если вы задаете компилятор Visual Studio. Смотрите Compiler (-compiler).

Риск

Функциональный signal() сопоставляет сигнал с функцией-обработчиком сигнала. На платформах, таких как Windows, который удаляет эту ассоциацию после получения сигнала, вы можете вызвать функциональный signal() снова в обработчике сигнала, чтобы восстановить ассоциацию.

Однако эта попытка сделать обработчик сигнала персистентным подвержена условиям состязания. На платформах Windows со времени обработчик сигнала начинает выполнение к когда signal функция вызвана снова, это - обработка сигнала по умолчанию, SIG_DFL, это активно. Если второй сигнал получен в этом окне времени, вы видите обработку сигнала по умолчанию а не пользовательский обработчик сигнала, но вы можете ожидать в противном случае.

Фиксация

Не вызывайте signal() от обработчика сигнала на платформах Windows.

Пример - signal() Названный от обработчика сигнала
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>



volatile sig_atomic_t e_flag = 0;

void sig_handler(int signum)
{
    int s0 = signum;
    e_flag = 1;
	
	/* Call signal() to reestablish sig_handler 
	upon receiving SIG_ERR. */
   
    if (signal(s0, sig_handler) == SIG_ERR) 
    {
        /* Handle error */       
    }
}

void func(void)
{
        if (signal(SIGINT, sig_handler) == SIG_ERR)
        {
            /* Handle error */
            
        }
  /* more code */
}        
      

В этом примере, определении sig_handler() включает вызов signal() когда обработчик отлавливает SIG_ERR. На платформах Windows обработчики сигнала являются нестойкими. Этот код может привести к состоянию состязания.

Проблема обнаруживается, только если вы задаете компилятор, такой как visual15.x для анализа.

Коррекция — не вызывает signal() от обработчика сигнала

Постарайтесь не пытаться сделать обработчик сигнала персистентным на Windows. Если ваш код требует использования персистентного обработчика сигнала на платформе Windows, используйте персистентный обработчик сигнала после выполнения полного анализа рисков.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>



volatile sig_atomic_t e_flag = 0;


void sig_handler(int signum)
{
    int s0 = signum;
    e_flag = 1;
    /* No call to signal() */
}

int main(void)
{
    
        if (signal(SIGINT, sig_handler) == SIG_ERR)
        {
            /* Handle error */
            
        }
}
 

Проверяйте информацию

Группа: 49. Разное (MSC)
Введенный в 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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