Задача выполняет длительную операцию при удержании блокировки
Этот дефект возникает, когда задача (поток) выполняет потенциально длительную операцию, удерживая блокировку.
Шашка рассматривает вызовы этих функций как потенциально длительные:
Функции, которые получают доступ к сети, такие как recv
Функции системного вызова, такие как fork
, pipe
и system
Функции для операций ввода-вывода, таких как getchar
и scanf
Функции обработки файлов, такие как fopen
, remove
и lstat
Функции манипуляции с директориями, такие как mkdir
и rmdir
Шашка автоматически обнаруживает определенные примитивы, которые удерживают и отпускают блокировку, например pthread_mutex_lock
и pthread_mutex_unlock
. Полный список примитивов, которые автоматически обнаруживаются, см. в разделе «Автоматическое обнаружение создания потоков» и «Критическое сечение» в Polyspace.
Если поток выполняет длительную операцию при удержании блокировки, другие потоки, которые используют блокировку, должны ждать, пока блокировка будет доступна. В результате производительность системы может замедлиться или возникнуть взаимоблокировка.
Перед удержанием замка или после снятия замка выполните операцию блокировки.
Некоторые функции, обнаруженные этой проверкой, могут быть вызваны таким образом, чтобы не сделать их потенциально длинными. Для образца - функция recv
можно вызвать с параметром O_NONBLOCK
что приводит к ошибке вызова, если сообщение не доступно. При вызове с этим параметром recv
не ожидает, когда сообщение станет доступным.
Группа: Параллелизм |
Язык: C | C++ |
По умолчанию: Off |
Синтаксис командной строки
: BLOCKING_WHILE_LOCKED |
Влияние: Низкое |
ИДЕНТИФИКАТОР CWE : 667 |