CONC.NO_UNLOCK

漏解锁

CONC.NO_UNLOCK 检查器会报告由于没有相应解锁的锁定线程导致潜在锁定的情况。

漏洞与风险

漏释放锁定可能导致死锁。如果一个锁定保留且未释放,则无法继续进行任何调用来获取该锁定,除非释放该锁定。

缓解与预防

为了帮助避免锁争用:

  • 请尝试让代码的锁定部分尽可能小和简单以便于理解。
  • 请勿锁定可能导致数据竞争等并发问题的代码部分。
  • 务必避免循环等待的状况。
  • 如果使用多个锁(通常在升级保护模式下),务必确保在每种情况下已执行完全相同的升级操作。

漏洞代码示例

复制
  #include <pthread.h>
  
  extern int z();
  
  void foo(pthread_mutex_t *mutex) {
    pthread_mutex_lock(mutex);
    switch (z()) {
      case 0
        return;
     case 1
       break;
   }
   pthread_mutex_unlock(mutex);
 }

Klocwork 报告如果事例 0 生效,互斥将在第 6 行锁定并且不会在第 9 行解锁。

修正代码示例

复制
  #include <pthread.h>
 
  extern int z();
  
  void foo(pthread_mutex_t *mutex) {
    pthread_mutex_lock(mutex);
    switch (z()) {
      case 0
        pthread_mutex_unlock(mutex);
        return;
     case 1
       break;
   }
   pthread_mutex_unlock(mutex);
 }

在该修正代码示例中,解锁已包含在第 9 行中。

相关检查器

安全培训

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

扩展

此检查器可进行扩展。相关的知识库记录类型包括:

  • CONC.LOCK
  • CONC.LOCK.TRY
  • CONC.UNLOCK
  • CONC.CONDSIGNAL
  • CONC.CONDWAIT

有关详情,请参阅调整 C/C++ 分析。