CONC.DBL_UNLOCK

多次解锁关键资源

CONC.DBL_UNLOCK 检查器会标记代码尝试解锁资源的次数超过锁定次数的情况。

漏洞与风险

如果代码尝试解锁资源的次数超过资源的锁定次数,则可能会导致意外的行为。

缓解与预防

如果已解锁,请勿再次解锁资源。

漏洞代码示例

复制
  #include<pthread.h>
  void lock_unlock_wrapper(pthread_mutex_t *mutex)
  {
      pthread_mutex_lock(mutex);
      pthread_mutex_unlock(mutex);
      pthread_mutex_unlock(mutex);
      return;
  }

在此不符合要求的示例中,当代码尝试沿同一线程解锁同一互斥(即 *mutex)两次时,Klocwork 会在第 6 行报告 CONC.DBL_UNLOCK 缺陷。

修正代码示例

复制
  #include<pthread.h>
  void lock_unlock_wrapper(pthread_mutex_t *mutex)
  {
      pthread_mutex_lock(mutex);
      pthread_mutex_unlock(mutex);
      return;
  }

在此修正代码示例中,代码沿给定线程锁定互斥,然后解锁互斥一次。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。