exponenta event banner

CERT C++: SIG34-C

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

Описание

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

Не вызывайте сигнал () из прерывистых обработчиков сигналов. [ 1]

Внедрение Polyspace

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

Примеры

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

Проблема

Вызов сигнала из обработчика сигнала происходит при вызове 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 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.