libclang: как отличить проект и системные включения?

#c #libclang

#c #libclang

Вопрос:

Я использую libclang (привязки Python) для анализа некоторого кода на C . Мне нужно отличать включения, которые разрешаются для системных заголовков, например, #include <algorithm> , от включений, которые разрешаются для локальных заголовков проекта, например, #include "my_header.h" .

Проблема в том, что я не могу найти способ получить эту информацию из AST libclang.

Некоторые мысли / соображения:

  • информация должна быть где-то там, поскольку при запуске clang с -E (только для запуска препроцессора) системные включения помечаются добавлением флага 3 при их включении. Пример:
    # 1 "/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c /9/exception" 1 3
  • конечно, я мог бы сам вызвать препроцессор и сопоставить результаты, но это добавляет накладные расходы и больше потенциальных источников ошибок
  • просто искать <> vs "" в токенах инструкции include не работает, поскольку они просто определяют порядок поиска.
  • проверка начала расширенного пути к включаемому файлу для sth like /usr/lib/... не работает, поскольку он не зависит от платформы, и пользователь может добавлять пользовательские «системные» каталоги через -isystem .

Я надеюсь, что вы сможете мне помочь в этом 🙂

Комментарии:

1. Почему вам нужно различать проект и системные включения?

2. Сильно упрощенный, мне нужно рекурсивно обойти проект включает в себя, но не система включает

3. помогает ли это ?

4. @n.’местоимения’m. На первый взгляд, я думаю, это решило бы мою проблему, но эта функция не отображается в привязках Python: (

5. Ну, тогда добавьте его и отправьте патч…