До конца раздачи бесплатных лицензий осталось 00:59:58. Забрать!
Диагностическое правило основано на руководстве 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);
}
Данная диагностика классифицируется как:
|
Была ли полезна эта страница документации?
Мы ответим вам на:
Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок: