Функция блокировки без функции разблокировки
Этот дефект возникает, когда:
Задача вызывает функцию блокировки.
Задача заканчивается без вызова функции разблокировки.
В многозадачном коде функция блокировки начинает критический раздел кода и функция разблокировки прекращает его. Когда задача, 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_LOCK |
Влияние: Высокий |
ИДЕНТИФИКАТОР CWE: 667 |
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 lock
| Tasks (-entry-points)
| Temporally exclusive tasks (-temporal-exclusions-file)