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