メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CERT C: Rule SIG35-C

計算例外の信号ハンドラーから値を返さない

説明

ルール定義

計算例外の信号ハンドラーから値を返さないようにします。1

Polyspace 実装

ルール チェッカーは、"計算例外の信号ハンドラーからの戻り値" をチェックします。

すべて展開する

問題

計算例外の信号ハンドラーからの戻り値は、計算例外の信号 SIGFPESIGILL、または SIGSEGV をキャッチした後に信号ハンドラーが値を返す場合に発生します。

リスク

計算例外から通常どおり値を返す信号ハンドラーは未定義の動作です。信号をトリガーしたエラーの修正をハンドラーで試みる場合でも、プログラムは予期せぬ動作をする可能性があります。

修正方法

計算の前に変数の値の有効性をチェックして、信号ハンドラーを使用した例外のキャッチを回避します。ハンドラーによる計算例外の信号のキャッチを避けられない場合は、ハンドラー内で abort()quick_exit()、または _Exit() を呼び出してプログラムを停止します。

例 - ゼロ除算からの信号ハンドラーの戻り値
#include <errno.h>
#include <limits.h>
#include <signal.h>
#include <stdlib.h>

static volatile sig_atomic_t denom;
/* Declare signal handler to catch division by zero 
computation error. */
void sig_handler(int s)
{
    int s0 = s;
    if (denom == 0)
    {
        denom = 1;
    }
	/* Normal return from computation exception
	signal */
    return;  //Noncompliant
}


long func(int v)
{
    denom = (sig_atomic_t)v;
       
        if (signal(SIGFPE, sig_handler) == SIG_ERR)
        {
            /* Handle error */
        }
		
	long result = 100 / (long)denom;
    return result;
}
        
      

この例では、sig_handler がゼロ除算計算エラーを処理するように宣言されています。ハンドラーでは denom の値がゼロの場合は値を変更して返します。これは未定義の動作です。

修正 — abort() を呼び出してプログラムを停止

計算例外をキャッチした後、sig_handler から abort() を呼び出してプログラムを終了し、さらにエラーが発生しないようにします。

#include <errno.h>
#include <limits.h>
#include <signal.h>
#include <stdlib.h>

static volatile sig_atomic_t denom;
/* Declare signal handler to catch division by zero 
computation error. */

void sig_handler(int s)
{
    int s0 = s;
	/* call to abort() to exit the program */
    abort(); 
}

long func(int v)
{
    denom = (sig_atomic_t)v;
       
        if (signal(SIGFPE, sig_handler) == SIG_ERR)
        {
            /* Handle error */
        }
		
	long result = 100 / (long)denom;
    return result;
} 

チェック情報

グループ: Rule 11.信号 (SIG)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.