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