Missing or double initialization of thread attribute

Дублированная инициализация потока приписывает или неинициализированный атрибут потока, используемый в функциях, которые ожидают инициализированные атрибуты

Описание

Этот дефект происходит во время одной из этих ситуаций:

  • Вы инициализируете атрибут потока дважды функцией, такой как pthread_attr_init без промежуточного вызова функции, такой как pthread_attr_destroy.

    Функциональный pthread_attr_destroy уничтожает объект атрибута потока и позволяет системе исправить ресурсы, сопоставленные с объектом.

  • Вы используете неинициализированный атрибут потока в функции, такой как pthread_create, который ожидает инициализированный атрибут. Атрибут потока может быть не инициализирован, потому что он никогда не инициализировался ранее или уничтожался с pthread_attr_destroy функция.

    Неинициализированные атрибуты потока обнаруживаются для всех функций в стандарте POSIX®.

Панель Result Details описывает, инициализируется ли атрибут вдвойне или не инициализируется и также показывает предыдущие связанные события.

Обратите внимание на то, что атрибут потока рассматривается инициализированным только если вызов pthread_attr_init успешно. Например, атрибут потока не инициализируется в if перейдите здесь:

pthread_attr_t attr;
int thread_success;

thread_success = pthread_attr_init(&attr);
if(thread_success != 0) {
   /* Thread attribute considered noninitialized */
}
Проблема также отмечается, если вы не проверяете возвращаемое значение от вызова до pthread_attr_init.

Риск

Инициализация атрибута потока, не уничтожая ранее инициализированный атрибут или с помощью неинициализированных атрибутов потока приводит к неопределенному поведению.

Фиксация

Перед использованием атрибута потока инициализируйте атрибут при помощи pthread_attr_init функция.

pthread_attr_t attr;
int thread_success;

/* Initialize attribute */
thread_success = pthread_attr_init(&attr);
if(thread_success != 0) {
   /* Handle initialization error */
}
...
/* Use attribute */
thread_sucess = pthread_create(&thr, &attr, &thread_start, NULL);
После инициализации уничтожьте атрибут потока при помощи pthread_attr_destroy прежде, чем инициализировать снова:
pthread_attr_t attr;
int thread_success;

/* Destroy attribute */
thread_success = pthread_attr_destroy(&attr);
if(thread_success != 0) {
   /* Handle destruction error */
}
...
/* Reinitialize attribute */
thread_success = pthread_attr_init(&attr);

Примеры

развернуть все

#include <stddef.h>
#include <pthread.h>
#define thread_success 0

extern void *thread_func(void *arg);


int main() {
    pthread_t id;
    pthread_attr_t attr;
    
    if(thread_success == pthread_create(&id, &attr, thread_func, NULL)) {
    }

    return 0;    
}

В этом примере, атрибут attr не инициализируется перед его использованием в pthread_create вызвать.

Коррекция – инициализирует атрибут потока перед использованием

Перед использованием потока приписывают в pthread_create функционируйте, инициализируйте атрибут pthread_attr_init функция.

#include <stddef.h>
#include <pthread.h>
#define thread_success 0

extern void *thread_func(void *arg);

int main() {
    pthread_t id;
    pthread_attr_t attr;
    
    if(thread_success != pthread_attr_init(&attr)) {
        return 0;
    }
   
    if(thread_success == pthread_create(&id, &attr, thread_func, NULL)) {
    }
    
    return 0;    
}
#include <stddef.h>
#include <pthread.h>
#define thread_success 0

extern void *thread_func(void *arg);

int main() {
    pthread_t id;
    pthread_attr_t attr;
    
    pthread_attr_init(&attr);
   
    if(thread_success == pthread_create(&id, &attr, thread_func, NULL)) {
    }
    
    return 0;    
}

В этом примере, возвращаемом значении pthread_attr_init не проверяется. Если инициализация атрибута потока перестала работать, ошибка не становится обработанной. Возможно неопределенный атрибут потока позже используется в pthread_create функция.

Коррекция – обрабатывает ошибки от инициализации атрибута потока

Одна возможная коррекция должна использовать атрибут потока только если возвращаемое значение от pthread_attr_init указывает на успешную инициализацию.

#include <stddef.h>
#include <pthread.h>
#define thread_success 0

extern void *thread_func(void *arg);

int main() {
    pthread_t id;
    pthread_attr_t attr;
    
    if(thread_success != pthread_attr_init(&attr)) {
        return 0;
    }
   
    if(thread_success == pthread_create(&id, &attr, thread_func, NULL)) {
    }
    
    return 0;    
}

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

Группа: параллелизм
Язык: C
Значение по умолчанию: Off
Синтаксис командной строки: BAD_THREAD_ATTRIBUTE
Удар: носитель
Введенный в R2019b