メインコンテンツ

ISO/IEC TS 17961 [sigcall]

中断可能な信号ハンドラーからの信号の呼び出し

説明

ルール定義

中断可能な信号ハンドラーからの信号の呼び出し。1

Polyspace 実装

このチェッカーは、信号ハンドラー内からの信号呼び出しをチェックします。

すべて展開する

問題

信号ハンドラー内からの信号呼び出しは、Windows® プラットフォームで非永続的な信号ハンドラーから signal() を呼び出す場合に発生します。

リスク

非永続的な信号ハンドラーは、信号をキャッチした後にリセットされます。ハンドラーは、signal() を呼び出してハンドラーを再度確立しない限り、後続の信号をキャッチしません。Windows プラットフォームの非永続的な信号ハンドラーは、SIG_DFL にリセットされます。別の信号によってハンドラーの実行が中断する場合、その信号によって SIG_DFL と既存の信号ハンドラーの間に競合状態が発生する可能性があります。signal() の呼び出しによって、ハンドラー内に無限ループが発生する可能性もあります。

修正方法

Windows プラットフォームでは信号ハンドラーから signal() を呼び出さないようにします。

例 - 信号ハンドラーからの 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() の定義にハンドラーが SIG_ERR をキャッチした際の signal() の呼び出しが含まれています。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 Extracts from the standard "ISO/IEC TS 17961 Technical Specification - 2013-11-15" are reproduced with the agreement of AFNOR. Only the original and complete text of the standard, as published by AFNOR Editions - accessible via the website www.boutique.afnor.org - has normative value.