Вызов последовательности для блокировки функций заставляет две задачи блокировать друг друга
Этот дефект возникает, когда несколько задач застревают в их критических разделах (CS), потому что:
Каждая CS ожидает окончания работы другой CS.
Критические участки (CS) образуют замкнутый цикл. Для примера:
CS # 1 ожидает окончания CS # 2, а CS # 2 - окончания CS # 1.
CS # 1 ожидает окончания CS # 2, CS # 2 ожидает окончания CS # 3, и CS # 3 ожидает окончания CS # 1.
Polyspace® ожидает, что критические разделы кода будут соответствовать определенному формату. Критический раздел находится между вызовом функции блокировки и вызовом функции разблокировки. Когда задача my_task
вызывает функцию блокировки my_lock
, другие задачи, вызывающие my_lock
необходимо подождать до my_task
вызывает соответствующую функцию разблокировки. Функции блокировки и разблокировки должны иметь форму void func(void)
.
Чтобы найти этот дефект, перед анализом необходимо задать опции многозадачности. Чтобы задать эти опции, на панели Configuration выберите Multitasking.
Каждая задача ожидает завершения критического раздела в другой задаче и не может продолжить. Программа может замерзнуть на неопределенный срок.
Исправление зависит от первопричины дефекта. Можно попытаться разбить циклический порядок между задачами одним из следующих способов:
Запишите все критические разделы, вовлеченные в тупик, в определенной последовательности. Всякий раз, когда вы вызываете функции блокировки критических разделов в задаче, уважайте порядок в этой последовательности. См. пример ниже.
Если одна из критических секций, участвующих в взаимоблокировке, происходит в прерывании, попробуйте отключить все прерывания во время критических секций во всех задачах. См. Disabling all interrupts (-routine-disable-interrupts -routine-enable-interrupts)
.
Просмотр этого дефекта является возможностью проверить, все ли операции в вашем критическом разделе действительно предназначены для выполнения в качестве атомарного блока. Рекомендуется держать критические сечения на минимальном уровне.
Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.
Группа: Параллелизм |
Язык: C | C++ |
По умолчанию: On |
Синтаксис командной строки: DEADLOCK |
Влияние: Высокий |
ИДЕНТИФИКАТОР CWE: 833 |
Configure multitasking manually
| Critical section details (-critical-section-begin -critical-section-end)
| Data race
| Data race including atomic operations
| Data race through standard library function call
| Destruction of locked mutex
| Double lock
| Double unlock
| Find defects (-checkers)
| Missing lock
| Missing unlock
| Tasks (-entry-points)
| Temporally exclusive tasks (-temporal-exclusions-file)