# V1020. Function exited without performing epilogue actions. It is possible that there is an error.

Анализатор обнаружил в теле функции путь выполнения, начинающийся и заканчивающийся вызовом функций, имена которых содержат слова-антагонисты. При этом, между вызовами есть условие, которое приводит к возврату из анализируемой функции без вызова функции-эпилога.

Рассмотрим пример:

    int pthread_cond_destroy(pthread_cond_t * cond)
    {
      EnterCriticalSection(&ptw32_cond_list_lock);
      /* ... */
      if (sem_wait (&(cv->semBlockLock)) != 0)
      {
        return errno; // <= V1020 Warning
      }
      /* ... */
      LeaveCriticalSection(&ptw32_cond_list_lock);
      return 0;
    }

В данном случае, в начале и конце функции присутствуют вызовы 'EnterCriticalSection' и 'LeaveCriticalSection' с соответствующими словами - антагонистами 'Enter' и 'Leave'. Между вызовами есть возврат из функции, перед которым по ошибке пропущен вызов 'LeaveCriticalSection'. Корректный код будет выглядеть следующим образом:

    int pthread_cond_destroy(pthread_cond_t * cond)
    {
      EnterCriticalSection(&ptw32_cond_list_lock);
      /* ... */
      if (sem_wait (&(cv->semBlockLock)) != 0)
      {
        LeaveCriticalSection(&ptw32_cond_list_lock);
        return errno;
      }
      /* ... */
      LeaveCriticalSection(&ptw32_cond_list_lock);
      return 0;
    }

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений [* см. примечание касательно языков C#, Java].

Данная диагностика классифицируется как:

CWE-772

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V1020.