Обнаружить незащищенный код с помощью cppdepend для проверки отсутствия внешнего защитного устройства в цепочке вызовов?

Я пытаюсь обнаружить код, который не защищен пунктом охраны на более высоком уровне в вызывающих. Я думаю, что могу довольно близко познакомиться с cppdepend, но не уверен, смогу ли я точно определить проблемы.

У меня есть куча кода, где требуется защита блокировки, поэтому у нас есть утверждение в самых внутренних функциях:

assert(eventQueue.IsCurrentEventGuarded());  

Обратите внимание, что eventQueue является статическим экземпляром типа 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 методов, которые находятся в цепочке вызовов ниже блокировки или выше и не охраняются

0 ответов

Другие вопросы по тегам