3

呼び出し元の上位レベルでガード句によって保護されていないコードを検出しようとしています。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 個のメソッドを検索します

4

0 に答える 0