exponenta event banner

ISO/IEC TS 17961 [sigcall]

Вызов сигнала от обработчиков прерывистого сигнала

Описание

Определение правила

Вызов сигнала от обработчиков прерывистого сигнала. [1 ]

Внедрение Polyspace

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

Примеры

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

Проблема

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

Риск

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

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

Не звонить 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 обработчики сигналов не поддерживаются. Этот код может привести к состоянию гонки.

Исправление - Не звонить signal() от обработчика сигналов

Если код требует использования обработчика постоянного сигнала на платформе 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 */
            
        }
}
 

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

Разрешимость: неразрешимая
Представлен в R2019a

[1] Выдержки из стандарта «ISO/IEC TS 17961 Technical Specification - 2013-11-15» воспроизводятся с согласия AFNOR. Нормативную ценность имеет только оригинальный и полный текст стандарта, опубликованный изданиями AFNOR - доступный через веб-сайт www.boutique.afnor.org.