呼び出し元の上位レベルでガード句によって保護されていないコードを検出しようとしています。cppdependにかなり近づくことができると思いますが、問題を正確に特定できるかどうかはわかりません。
ロック保護が必要なコードがたくさんあるので、最も内側の関数にアサーションがあります。
assert(eventQueue.IsCurrentEventGuarded());
eventQueue
は type の静的インスタンスであることに注意してくださいEventQueue
。
そのアサーションを含む関数が呼び出され、呼び出し元チェーンのある時点でガード オブジェクトのインスタンスがないすべての場所を検出したいと考えています。
したがって、呼び出し元チェーンのある時点で次の式があっても問題ありません。
GSEventGuard guard;
ただし、その上のどこかIsCurrentEventGuarded
にその保護インスタンスがない状態でへの呼び出しが発生した場合は、検出されるべき問題があります。
節を使用してガードを作成する上位レベルのGuarding メソッド(つまり、無視できる優れたメソッド) を見つけることができます。
SELECT METHODS WHERE IsDirectlyUsing "GSEventGuard" AND
IsUsing "EventQueue.IsCurrentEventGuarded()"
理想的には、これらのメソッドの上と下のすべてを無視できるはずです。
より興味深い節では、メソッドの 2 つのセットが見つかります。ガードメソッドの下(ガードとテストの間) と、必要な呼び出しチェーン内にあり、保護されていないメソッドです。
SELECT METHODS WHERE
DepthOfIsUsing "EventQueue.IsCurrentEventGuarded()" > 1
AND !(IsUsing "GSEventGuard.try_lock()" OR IsUsing "GSEventGuard.lock()")
ORDER BY DepthOfIsUsing DESC
ロックより下の呼び出しチェーンまたはより高い位置にあり、保護されていない 65 個のメソッドを検索します