Функция блокировки без функции разблокировки
Этот дефект возникает в следующих случаях:
Задача вызывает функцию блокировки.
Задача завершается без вызова функции разблокировки.
В многозадачном коде функция блокировки начинает критический раздел кода и функция разблокировки заканчивает его. Когда задача, my_task, вызывает функцию блокировки, my_lock, другие задачи, вызывающие my_lock должен подождать до my_task вызывает соответствующую функцию разблокировки. Polyspace ® требует, чтобы функции блокировки и разблокировки имели формуvoid func(void).
Чтобы найти этот дефект, перед анализом необходимо указать параметры многозадачности. На панели Конфигурация выберите Многозадачность.
Функция разблокировки заканчивает критический раздел, чтобы другие ожидающие задачи могли войти в критический раздел. Отсутствие функции разблокировки может привести к блокировке задач на ненужный период времени.
Определите критический раздел кода, то есть раздел, который требуется выполнить как атомарный блок. В конце этого раздела вызовите функцию разблокировки, соответствующую функции блокировки, используемой в начале раздела.
Могут быть и другие причины и соответствующие исправления дефекта. Возможно, вы назвали неправильную функцию разблокировки. Проверьте пару функций блокировки-разблокировки в конфигурации анализа Polyspace и устраните несоответствие.
См. примеры исправлений ниже. Чтобы избежать проблемы, можно следовать практике вызова функций блокировки и разблокировки в одном модуле на одном уровне абстракции. Например, в этом примере func вызывает функцию блокировки и разблокировки на одном уровне, но func2 не делает.
void func() {
my_lock();
{
...
}
my_unlock();
}
void func2() {
{
my_lock();
...
}
my_unlock();
}Если вы не хотите устранять проблему, добавьте комментарии к результату или коду, чтобы избежать другой проверки. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.
| Группа: Параллелизм |
| Язык: C | C++ |
| По умолчанию: Вкл. |
Синтаксис командной строки: 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)