Анализ С++ для внесения некоторых изменений в код

Я хотел бы написать небольшой инструмент, который принимает программу на С++ (один .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, и может восстанавливать компилируемый исходный код с оригинальными комментариями.