Анализ С++ для внесения некоторых изменений в код
Я хотел бы написать небольшой инструмент, который принимает программу на С++ (один .cpp файл), находит "главную" функцию и добавляет к ней 2 вызова функций: один в начале и один в конце.
Как это можно сделать? Могу ли я использовать gs-синтаксический механизм (или любой другой парсер)?
Ответы
Ответ 1
Как было предложено некоторыми комментаторами, позвольте мне изложить мою идею как ответ:
В принципе, идея такова:
... original .cpp file ...
#include <yourHeader>
namespace {
SpecialClass specialClassInstance;
}
Где SpecialClass
есть что-то вроде:
class SpecialClass {
public:
SpecialClass() {
firstFunction();
}
~SpecialClass() {
secondFunction();
}
}
Таким образом, вам не нужно разбирать файл С++. Поскольку вы объявляете глобальный, его конструктор будет запускаться до запуска main
, а его деструктор будет запущен после возврата main
.
Недостатком является то, что вы не узнаете относительный порядок, когда ваш глобальный объект построен по сравнению с другими. Поэтому, если вам нужно гарантировать, что вызов firstFunction
перед любым другим конструктором в другом месте всей программы вам не повезло.
Ответ 2
Если вы хотите сделать его прочным, используйте clang libraries.
Ответ 3
Я слышал, что синтаксический анализатор GCC трудно использовать и даже сложнее получить без использования всей инструментальной цепочки. Я бы попробовал анализатор Cang C/С++ (libparse) и учебники, связанные с этот вопрос.
Ответ 4
Добавление функции в начале main()
и в конце main()
- плохая идея. Что, если кто-то называет return
посередине?
Лучше всего создать экземпляр класса в начале main()
и позволить этому деструктору класса вызвать функцию вызова, которую вы хотите вызвать в конце. Это обеспечило бы, чтобы эта функция всегда вызывалась.
Ответ 5
Если у вас есть контроль над вашей основной программой, вы можете взломать script, чтобы сделать это, и это, безусловно, простой способ. Просто убедитесь, что точки вставки очевиден (нечетные комментарии, требуемое размещение токенов, вы выбираете) и уникальные (в том числе запрещающие общие правила кодирования, если вам нужно, чтобы обеспечить уникальность, в которой вы нуждаетесь, реально). Затем инструмент для взлома немой строки, чтобы прочитать источник, найти уникальные маркеры и вставить нужные вам вызовы, будет работать нормально.
Если суп основной программы поступает из других источников, и у вас нет контроля, то для этого вам нужен полный механизм преобразования программ на С++. Вы не хотите строить это самостоятельно, так как просто сингл С++ - это огромное усилие, чтобы получить право. Другие здесь упомянули Clang и GCC в качестве ответов.
Альтернативой является наш DMS Software Reengineering Toolkit с его интерфейсом С++. DMS, используя свой С++ front end, может анализировать код (для множества диалектов С++), создавать AST, выполнять полное имя/тип разрешения, чтобы определить значение/определение/использование всех символов. Он предоставляет процессуальные преобразования и преобразования источника в источник, чтобы включить изменения в AST, и может восстанавливать компилируемый исходный код с оригинальными комментариями.