メインコンテンツ

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

CERT C: Rule POS44-C

Do not use signals to terminate threads

説明

ルール定義

スレッドを終了するために信号を使用しないようにします。1

Polyspace 実装

ルール チェッカーは、"スレッドを強制終了するための信号の使用" をチェックします。

すべて展開する

問題

スレッドを強制終了するための信号の使用は、スレッドを強制終了するためにキャッチされていない信号を使用すると発生します。たとえば、スレッドを強制終了するために POSIX® 関数 pthread_kill を使用して信号 SIGTERM を送信します。

リスク

信号を送信すると、強制終了しようとしているスレッドだけでなく、プロセス全体が強制終了します。

たとえば、pthread_kill の仕様によると、信号の処理方法が終了の実行である場合、このアクションはプロセス全体に影響します。

修正方法

特定のスレッドを強制終了することを目的とした他のメカニズムを使用します。

たとえば、POSIX 関数 pthread_cancel を使用して特定のスレッドを終了します。

例 - スレッドを終了するための pthread_kill の使用
#include <signal.h>
#include <pthread.h>

void* func(void *foo) {
  /* Execution of thread */
}
 
int main(void) {
  int result;
  pthread_t thread;
 
  if ((result = pthread_create(&thread, NULL, func, 0)) != 0) {
  }
  if ((result = pthread_kill(thread, SIGTERM)) != 0) { //Noncompliant
  }
 
  /* This point is not reached because the process terminates in pthread_kill() */
 
  return 0;
}

この例では、関数 pthread_kill はスレッドを強制終了するために信号 SIGTERM を送信します。信号により、前に pthread_create を使用して作成したスレッドではなく、プロセス全体が強制終了します。

修正 — pthread_cancel を使用してスレッドを終了

1 つの修正方法として、関数 pthread_cancel を使用します。pthread_cancel は、スレッドのキャンセル タイプに応じて、最初の引数で指定されたスレッドを特定のキャンセル ポイントで終了するか、直ちに終了します。

#include <signal.h>
#include <pthread.h>

void* func(void *foo) {
  /* Execution of thread */
}
 
int main(void) {
  int result;
  pthread_t thread;
 
  if ((result = pthread_create(&thread, NULL, func, 0)) != 0) {
    /* Handle Error */
  }
  if ((result = pthread_cancel(thread)) != 0) {
    /* Handle Error */
  }
 
  /* Continue executing */
 
  return 0;
}

参考:

  • キャンセル タイプの詳細については pthread_cancel を参照。

  • キャンセル ポイントにすることができる関数については Pthreads を参照。

チェック情報

グループ: Rule 50.POSIX (POS)

バージョン履歴

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.