Как подсчитать, сколько раз использовался перегруженный оператор в базе кода с определенным типом операндов

У меня есть шаблонный класс SafeInt<T> (От Microsoft).

Этот класс в теории может использоваться вместо целочисленного типа POD и может обнаруживать любые целочисленные переполнения во время арифметических операций.

Для этого класса я написал несколько пользовательских шаблонизированных перегруженных арифметических операторов (+, -, *, /), чьи оба аргумента являются объектами SafeInt<T>,

Я typedef’d все мои целочисленные типы к типу класса SafeInt.

Я хочу найти в моей кодовой базе экземпляры указанных бинарных операторов, где оба операнда имеют тип SafeInt.

Некоторые из способов, которыми я мог думать о

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

  2. Напишите инструмент лязга и обработайте AST, чтобы выполнить этот поиск (мне еще предстоит научиться писать такой инструмент.)

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

Кто-нибудь может предложить лучший способ?

Пожалуйста, дайте мне знать, если мне нужно что-то уточнить.

Благодарю.

3

Решение

Чтобы сделать это правильно, вам необходимо иметь возможность идентифицировать индивидуальное использование оператора, которое перегружается до определенного определения оператора. По сути, вам нужно то, что делает внешний интерфейс компилятора 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 ++. Он не такой зрелый / красивый, но он крепкий. В настоящее время он не показывает все случаи использования объявленного символа, но это было бы довольно простым изменением. (У меня нет публично видимого экземпляра этого. Свяжитесь со мной через мою биографию, и я могу выслать вам образец).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]