Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для C.
Объекты типа cnd_t
, mtx_t
, thrd_t
и tss_t
из Concurrency support library не должны иметь automatic или thread-local storage duration.
Доступ к объектам синхронизации обычно происходит из разных потоков. В таких случаях, при использовании automatic или thread-local storage duration программист рискует обратиться к объекту, у которого уже закончилось время жизни. Это приведёт к неопределённому поведению и неконтролируемому исполнению потоков. Данное диагностическое правило призвано уменьшить вероятность ошибки и исключить зависимость потоков от времени жизни объектов синхронизации.
Пример некорректного кода:
int Task1(void *mtx)
{
mtx_lock((mtx_t*)mtx); // can be dangling pointer
// do stuff
mtx_unlock((mtx_t*)mtx); // can be dangling pointer
return 0;
}
void RunTask()
{
thrd_t thread1;
mtx_t mtx;
mtx_init(&mtx, mtx_plain);
thrd_create(&thread1, Task1, &mtx);
}
В приведённом выше синтетическом примере время жизни объекта mtx
может закончиться раньше, чем произойдёт его блокировка/разблокировка в дочернем потоке.
Корректный код:
thrd_t thread1;
mtx_t mtx;
int Task1(void *mtx)
{
mtx_lock((mtx_t*)mtx);
// do stuff
mtx_unlock((mtx_t*)mtx);
return 0;
}
void RunTask()
{
mtx_init(&mtx, mtx_plain);
thrd_create(&thread1, Task1, &mtx);
}
Данная диагностика классифицируется как:
|