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 */
            
        }
}
 

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

Группа: Правило 11. Сигналы (SIG)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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