Вызов последовательности для блокировки функций заставляет две задачи блокировать друг друга
Этот дефект возникает, когда несколько задач застревают в их критических разделах (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)