Я пытаюсь обнаружить код, который не защищен пунктом защиты на более высоком уровне в вызывающих.Я думаю, что могу довольно близко подойти к cppdepend , но не уверен, смогу ли я точно определить проблемы.
У меня есть куча кода, где требуется защита блокировки, поэтому у нас есть утверждение внутриfunctions:
assert(eventQueue.IsCurrentEventGuarded());
Обратите внимание, что eventQueue
является статическим экземпляром типа EventQueue
.
Я хочу обнаружить все места, где функции, содержащие это утверждение, вызываются и есть не экземпляр объекта охраны в некотором пункте в их цепочке вызывающих абонентов.
Итак, все в порядке, если в какой-то момент в цепочке вызывающих абонентов есть выражение:
GSEventGuard guard;
Однако, если вызов IsCurrentEventGuarded
происходит без этого защитного экземпляра где-то над ним, у нас возникает проблема, которая должна быть обнаружена.
Я могунайдите верхний уровень Методы защиты , которые создают охрану (то есть: хороших, которых мы можем игнорировать) с предложением:
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 методов, которые находятся либо в цепочке вызовов ниже блокировки, либо выше и без охраны