V2670. MISRA. Thread objects, thread synchronization objects, and thread-specific storage pointers should only be accessed by the appropriate Standard Library functions.
Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Правило актуально только для языка С.
Доступ к объектам потока исполнения (thrd_t), мьютексам (mtx_t), условным переменным (cnd_t) и специфичным для потоков хранилищам (tss_t) должен осуществляться исключительно через специальные функции, предоставляемые стандартной библиотекой:
- для
thrd_t:thrd_create,thrd_detach,thrd_join,thrd_equal,thrd_current,thrd_sleep,thrd_yield,thrd_exit; - для
mtx_t:mtx_init,mtx_lock,mtx_trylock,mtx_timedlock,mtx_unlock,mtx_destroy; - для
cnd_t:cnd_init,cnd_signal,cnd_broadcast,cnd_wait,cnd_timedwait,cnd_destroy; - для
tss_t:tss_create,tss_get,tss_set,tss_delete.
Прямой доступ к членам структур, их копирование, модификация или сравнение любыми другими способами приводят к неопределённому поведению.
Рассмотрим пример:
thrd_t thread1, thread2;
int threads_equal(const thrd_t *t1, const thrd_t *t2)
{
return memcmp(t1, t2, sizeof(thrd_t));
}
Функция memcmp выполняет побайтовое сравнение двух объектов типа thrd_t. Однако программист может не знать, каким именно образом поток исполнения будет реализован в той или иной стандартной библиотеке C. Это может привести к тому, что два одинаковых потока могут считаться различными, например, из-за байтов выравнивания.
Для корректного сравнения объектов типа thrd_t и написания переносимого кода следует использовать функцию thrd_equal:
int threads_equal(const thrd_t *t1, const thrd_t *t2)
{
return thrd_equal(t1, t2);
}
Данная диагностика классифицируется как:
|