Функция блокировки вызывается дважды в задаче без промежуточного вызова для разблокировки функции
Этот дефект возникает, когда:
Задача вызывает функцию блокировки my_lock
.
Задача вызывает my_lock
снова перед вызовом соответствующей функции разблокировки.
В многозадачном коде функция блокировки начинает критический раздел кода и функция разблокировки прекращает его. Когда задача task1
вызывает функцию блокировки lock
, другие задачи, вызывающие lock
необходимо подождать до task
вызывает соответствующую функцию разблокировки. Polyspace® требует, чтобы функции блокировки и разблокировки имели форму void func(void)
.
Чтобы найти этот дефект, перед анализом необходимо задать опции многозадачности. Чтобы задать эти опции, на панели Configuration выберите Multitasking.
Вызов функции блокировки начинает критический раздел, так что другие задачи должны ждать, чтобы войти в тот же критический раздел. Если та же функция блокировки вызывается снова в критическом разделе, задача блокируется сама.
Исправление зависит от первопричины дефекта. Дефект двойной блокировки часто указывает на ошибку кодирования. Возможно, вы пропустили вызов функции разблокировки, чтобы закончить предыдущий критический раздел и начали следующий критический раздел. Возможно, вы хотели использовать другую функцию блокировки для второго критического раздела.
Идентифицируйте каждый критический раздел кода, то есть раздел, который вы хотите выполнить как атомарный блок. Вызовите функцию блокировки в начале раздела. В критическом разделе убедитесь, что вы не вызываете функцию блокировки снова. В конце раздела вызовите функцию разблокировки, которая соответствует функции блокировки.
См. примеры исправлений ниже. Чтобы избежать проблемы, можно следовать практике вызова функций блокировки и разблокировки в том же модуле на том же уровне абстракции. Например, в этом примере func
вызывает функцию блокировки и разблокировки на том же уровне, но func2
не делает.
void func() { my_lock(); { ... } my_unlock(); } void func2() { { my_lock(); ... } my_unlock(); }
Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.
Группа: Параллелизм |
Язык: C | C++ |
По умолчанию: On |
Синтаксис командной строки: DOUBLE_LOCK |
Влияние: Высокий |
ИДЕНТИФИКАТОР CWE: 764 |
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
| Deadlock
| Destruction of locked mutex
| Double unlock
| Find defects (-checkers)
| Missing lock
| Missing unlock
| Tasks (-entry-points)
| Temporally exclusive tasks (-temporal-exclusions-file)