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