CERT C: Rule 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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