Функция блокировки вызвана дважды в задаче без промежуточного вызова, чтобы разблокировать функцию
Двойной замок происходит когда:
Задача вызывает функцию блокировки 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++ |
Значение по умолчанию: на |
Синтаксис командной строки: DOUBLE_LOCK |
Удар: высоко |
ID 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)