我正在尝试检测其呼叫者中较高级别的保护条款不受保护的代码。我想我可以与cppdepend非常接近,但不确定我是否可以准确地发现问题。
我有一堆代码需要锁定保护,所以我们在最里面的函数有一个断言:
assert(eventQueue.IsCurrentEventGuarded());
请注意,eventQueue
是EventQueue
类型的静态实例。
我想检测调用包含该断言的函数的所有位置,并且不在其调用者链中某个点处的保护对象的实例。< / p>
所以,如果在调用者链中的某个点有一个表达式,那就没关系了:
GSEventGuard guard;
但是,如果对IsCurrentEventGuarded
的调用在其上方没有某处的保护实例的情况下发生,则我们会遇到应该检测到的问题。
我可以通过一个子句找到上层 Guarding Methods 来创建守卫(即:我们可以忽略的好):
SELECT METHODS WHERE IsDirectlyUsing "GSEventGuard" AND
IsUsing "EventQueue.IsCurrentEventGuarded()"
理想情况下,我应该能够忽略这些方法之上和之下的所有内容。
一个更有意思的子句找到两组方法 - 下面的 保护方法(在一个保护和测试之间)和那些在我们想要的调用链中的方法,没有保护。
SELECT METHODS WHERE
DepthOfIsUsing "EventQueue.IsCurrentEventGuarded()" > 1
AND !(IsUsing "GSEventGuard.try_lock()" OR IsUsing "GSEventGuard.lock()")
ORDER BY DepthOfIsUsing DESC
找到65个方法,这些方法位于锁定下方的调用链中或更高位且无人看守