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