ロックチェッカーからこれを取得しました:
Error:(52, 30) java: [method.guarantee.violated] @ReleasesNoLocks method proc() calls method unfree() with a weaker @MayReleaseLocks side effect guarantee
コードを投稿できますが、問題ありません。副作用メソッドの呼び出しに関するドキュメントがわかりません。
ロックチェッカーからこれを取得しました:
Error:(52, 30) java: [method.guarantee.violated] @ReleasesNoLocks method proc() calls method unfree() with a weaker @MayReleaseLocks side effect guarantee
コードを投稿できますが、問題ありません。副作用メソッドの呼び出しに関するドキュメントがわかりません。
コードは次のようになります。
@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 のメッセージが (簡潔に) 言っていることです。
実行時の動作には、次の 3 つの可能性があります。
unfree
本当にロックを解除します。この場合、コードにバグがあり、ロック チェッカーがそのことを知らせています! の注釈@ReleasesNoLocks
はproc
false です。その注釈を削除するunfree
か、ロックを解放しないように変更する必要があります。unfree
ロックを解放することはありません。この場合、 として注釈を付ける必要がありunfree
ます@ReleasesNoLocks
。その時点で、ロック チェッカーはproc
の実装がその仕様を満たしていることを確認できるため、警告は発行されなくなります。unfree
ロックを解除する場合と解除しない場合があります。の本体内の特定の呼び出しがproc
ロックを解除しないことはわかっています。この場合、@SuppressWarnings("method.guarantee.violated")
ソース コードの 52 行目に注釈を記述する必要があります。キー「method.guarantee.violated」がエラー メッセージに表示されます。@SuppressWarnings
この事実をどのように知っているかを説明するコメントを追加することをお勧めします。これにより、将来、注釈を書いた理由がわかるようになります。