下面的代码已被Fortify标记为违规(锁的“未释放资源”)

try {
  if (lock.tryLock(1, TimeUnit.SECONDS)) {
    try {
      //do something
    }
    finally {
       lock.unlock();
   }
}
catch (InterruptedException e) {
  // something
}

你能解释为什么吗?应该为InterruptedException try/catch提供finally语句吗?我认为内部尝试也可以处理这种情况。

最佳答案

Fortify文档将unreleased resource bug描述为:



对于您的示例而言,这是不正确的。如果tryLock返回false或引发异常,则没有获得锁,没有输入try块,也没有要释放的内容(因此,外部try块中不需要finally块)。如果tryLock返回true,则进入内部try块,并最终释放锁。

您所拥有的似乎与API documentation建议您执行的操作相同:

  Lock lock = ...;
  if (lock.tryLock()) {
      try {
          // manipulate protected state
      } finally {
          lock.unlock();
      }
  } else {
      // perform alternative actions
  }

唯一的区别是您的示例使用了tryLock的覆盖,该覆盖超时,在这种情况下它将返回false。因此,从发布的内容来看,这似乎还可以。

09-28 11:43