У меня есть шаблонный класс SafeInt<T>
(От Microsoft).
Этот класс в теории может использоваться вместо целочисленного типа POD и может обнаруживать любые целочисленные переполнения во время арифметических операций.
Для этого класса я написал несколько пользовательских шаблонизированных перегруженных арифметических операторов (+, -, *, /), чьи оба аргумента являются объектами SafeInt<T>
,
Я typedef’d все мои целочисленные типы к типу класса SafeInt.
Я хочу найти в моей кодовой базе экземпляры указанных бинарных операторов, где оба операнда имеют тип SafeInt.
Некоторые из способов, которыми я мог думать о
Поиск строк с использованием регулярных выражений и прополка по коду для обнаружения случаев использования оператора, где оба операнда являются объектами SafeInt.
Напишите инструмент лязга и обработайте AST, чтобы выполнить этот поиск (мне еще предстоит научиться писать такой инструмент.)
Каким-то образом добавьте счетчик, чтобы посчитать, сколько раз был создан пользовательский перегруженный оператор. Я потратил много времени, пытаясь это сделать, но, похоже, не работает.
Кто-нибудь может предложить лучший способ?
Пожалуйста, дайте мне знать, если мне нужно что-то уточнить.
Благодарю.
Чтобы сделать это правильно, вам необходимо иметь возможность идентифицировать индивидуальное использование оператора, которое перегружается до определенного определения оператора. По сути, вам нужно то, что делает внешний интерфейс компилятора C ++: анализ и разрешение имен (включая перегрузки).
Очевидно, что GCC и Clang имеют эту базовую возможность. Но вы хотите отслеживать / отображать все виды использования конкретного оператора. Вероятно, вы можете согнуть Clang (или GCC, сильнее), чтобы предоставить вам эту информацию для каждого файла отдельно.
наш DMS Software Reengineering Toolkit с этими C ++ Front End можно использовать и для этого тоже.
DMS предоставляет общий механизм разбора и поддержки таблиц символов; интерфейс C ++ специализируется на DMS для обработки C ++ с полным и точным разрешением имен, включая перегрузки, как для GCC5, так и для MSVS2015. Его таблица символов фактически собирает для каждой декларации в области видимости точку декларации и список использований этой декларации с точки зрения точных исходных позиций. Области символов включают в себя запись для каждого (перегруженного) оператора, действительного в области видимости. Вы могли бы просто
перейдите к нужной записи таблицы символов и перечислите / сосчитайте список ссылок, чтобы получить необработанный счет. Для этого есть стандартные API, доступные через DMS.
Тот же вид символов области действия / определения / использования используется нашими Java Source Browser создать основанный на HTML JavaDoc-подобный дисплей с полными HTML-связями между объявлениями символов и их использованием. Таким образом, для любого объявления символа вы можете легко увидеть использование.
Внешний интерфейс C ++ имеет похожий HTMLizer, который работает с исходным кодом C ++. Он не такой зрелый / красивый, но он крепкий. В настоящее время он не показывает все случаи использования объявленного символа, но это было бы довольно простым изменением. (У меня нет публично видимого экземпляра этого. Свяжитесь со мной через мою биографию, и я могу выслать вам образец).
Других решений пока нет …