3

我正在尝试检测其调用者中不受更高级别保护子句保护的代码。我认为我可以与cppdepend非常接近,但不确定我是否可以准确地识别问题。

我有一堆代码需要锁定保护,所以我们在最里面的函数有一个断言:

assert(eventQueue.IsCurrentEventGuarded());  

请注意,这eventQueue是 type 的静态实例EventQueue

我想检测调用包含该断言的函数的所有位置,并且在它们的调用者链中的某个点没有保护对象的实例。

所以,如果在调用者链中的某个点有一个表达式是可以的:

GSEventGuard guard;

但是,如果调用在其上方IsCurrentEventGuarded没有该保护实例的情况下发生,我们就会发现应该检测到的问题。

我可以找到使用子句创建防护(即:我们可以忽略的好方法)的上层防护方法:

SELECT METHODS WHERE IsDirectlyUsing "GSEventGuard" AND 
   IsUsing "EventQueue.IsCurrentEventGuarded()"

理想情况下,我应该能够忽略这些方法之上和之下的所有内容。

一个更有趣的子句找到了两组方法 - 那些在Guarding Methods之下(在一个守卫和测试之间)和那些在我们想要的调用链中,不受保护的。

SELECT METHODS WHERE
DepthOfIsUsing "EventQueue.IsCurrentEventGuarded()" > 1
AND !(IsUsing "GSEventGuard.try_lock()" OR IsUsing "GSEventGuard.lock()")
ORDER BY DepthOfIsUsing DESC

找到 65 个方法,它们在调用链中低于锁或更高且无人看管

4

0 回答 0