Последовательность вызовов для блокирования функций приводит к блокировке друг друга двумя задачами
Этот дефект возникает, когда несколько задач застряли в своих критических секциях (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).
Чтобы найти этот дефект, перед анализом необходимо указать параметры многозадачности. Чтобы задать эти параметры, на панели Конфигурация выберите Многозадачность.
Каждая задача ожидает завершения критического раздела другой задачи и не может продолжить работу. Программа может заморозить на неопределенный срок.
Исправление зависит от первопричины дефекта. Можно попытаться разорвать циклический порядок между задачами одним из следующих способов:
Запишите все критические разделы, вовлеченные в взаимоблокировку, в определенной последовательности. Всякий раз, когда вы вызываете функции блокировки критических секций в рамках задачи, уважайте порядок в этой последовательности. См. пример ниже.
Если один из критических разделов, участвующих в взаимоблокировке, возникает в прерывании, попробуйте отключить все прерывания в критических разделах во всех задачах. Посмотрите Disabling all interrupts (-routine-disable-interrupts -routine-enable-interrupts).
Анализ этого дефекта дает возможность проверить, действительно ли все операции в вашем критическом разделе должны выполняться как атомарный блок. Рекомендуется сохранять критические участки на минимальном уровне.
Если вы не хотите устранять проблему, добавьте комментарии к результату или коду, чтобы избежать другой проверки. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.
| Группа: Параллелизм |
| Язык: C | C++ |
| По умолчанию: Вкл. |
Синтаксис командной строки: DEADLOCK |
| Воздействие: Высокое |
| CWE ID: 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)