如何调用副作用较弱的方法?

时间:2016-09-19 19:24:26

标签: checker-framework

我从Lock checker那里得到了这个:

-exec cat {} \;

我可以发布代码,但没关系。我只是不了解有关调用副作用方法的文档。

1 个答案:

答案 0 :(得分:0)

您的代码如下所示:

@ReleasesNoLocks
void proc() {
  ...
  unfree();  // line 52
  ...
}

void unfree() {
  // arbitrary code that might include someLock.unlock();
}

的文档 @ReleasesNoLocks说:

  

该方法及其调用的所有方法都保持严格不减少的锁定保持计数

方法@ReleasesNoLocks上的proc注释承诺方法proc不会释放任何锁。但是,方法unfree可能会释放一些锁(因为它没有注释为@ReleasesNoLocks)。如果unfree释放锁定,则proc会违反其规范。那就是Lock Checker的消息所说的(以简洁的方式)。

运行时发生的事情有三种可能性:

  1. unfree确实释放锁定。在这种情况下,你的代码是错误的,Lock Checker已经告诉过你了! @ReleasesNoLocks上的注释proc为false。您需要删除该注释或将unfree更改为不释放任何锁定。
  2. unfree永远不会释放任何锁定。在这种情况下,您应该将unfree注释为@ReleasesNoLocks。此时,Lock Checker将能够验证proc的实施是否满足其规范,因此它将不再发出警告。
  3. unfree有时会释放锁定,有时不释放锁定。您知道proc正文中的特定呼叫不会释放锁定。在这种情况下,您应该在源代码的第52行写一个@SuppressWarnings("method.guarantee.violated")注释。关键" method.guarantee.violated"出现在错误消息中。我建议添加一条评论,解释您如何了解这一事实,以便将来知道您编写@SuppressWarnings注释的原因。