Функция блокировки без функции разблокировки
Этот дефект возникает, когда:
Задача вызывает функцию блокировки.
Задача заканчивается без вызова функции разблокировки.
В многозадачном коде функция блокировки начинает критический раздел кода и функция разблокировки прекращает его. Когда задача, 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)