exponenta event banner

CERT C: POS44-C правил

Не использовать сигналы для завершения потоков

Описание

Определение правила

Не используйте сигналы для завершения потоков. [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) {
  }
 
  /* This point is not reached because the process terminates in pthread_kill() */
 
  return 0;
}

В этом примере pthread_kill функция посылает сигнал SIGTERM убить нить. Сигнал убивает весь процесс вместо потока, ранее созданного с помощью pthread_create.

Коррекция - использование pthread_cancel для завершения потоков

Одной из возможных корректировок является использование 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 для функций, которые могут быть точками отмены.

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

Группа: Правило 50. POSIX (POS)
Представлен в R2019a

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

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

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