LINUX.ORG.RU

IWYU 0.21

 , iwyu


1

3

Вышел релиз IWYU (или include-what-you-use), программы позволяющей находить избыточные и предлагать недостающие #include в вашем коде на C/C++.

«Включать то, что используешь» означает следующее: для каждого символа (типа, переменной, функции или макроса), используемого в foo.cc, либо foo.cc, либо foo.h должны подключать .h-файл, экспортирующий объявление этого символа. Инструмент include-what-you-use – это программа для анализа #include исходных файлов с целью поиска нарушений этого подхода и выдачи рекомендаций для исправления. Программа использует библиотеки Clang и обычно релиз означает совместимость с новой версией Clang.

Основная цель include-what-you-use - удаление лишних #include. Для этого необходимо выяснить, какие #include не нужны в данном файле (как для .cc, так и для .h), и по возможности заменить #include на предварительное объявление.

Основные изменения

  • Совместимость с Clang 17.
  • Улучшен анализ псевдонимов типов (typedef и using).
  • Улучшен анализ псевдонимов пространств имен (namespace xyz = foobar).
  • Улучшена поддержка развернутых предварительных деклараций (typedef struct Foo Bar;).
  • Улучшить обработку «автокаста» и возвращаемых типов функций, особенно при работе со сложными шаблонными типами.
  • Добавлена новая прагма IWYU: always_keep, позволяющая пометить заголовок, что он всегда должен сохраняться, где бы он ни был включен.
  • Автоматическое использование сопоставлений для builtins libc++, если libc++ является активной стандартной библиотекой.
  • Улучшение сопоставлений для заголовков libc++ и posix.

>>> Подробности



Проверено: hobbit ()

Ответ на: комментарий от hobbit

Наверное есть табличка где список функций, констант и прочих дефайнов, ассоциирован с заголовочным файлом и предлагает его явно подключить. Но это догадки.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Если файл компилируется, значит все что нужно уже подключено. Задача программы – показать что подключено неявно.

Вот пример выхлопа утилиты для пары chamferdialog.h и chamferdialog.cpp:

../../addons/src/chamfer/chamferdialog.h should add these lines:
#include <QString>             // for QString
class QSettings;
class QWidget;

../../addons/src/chamfer/chamferdialog.h should remove these lines:
- #include <QSettings>  // lines 27-27
- #include <QWidget>  // lines 28-28

The full include-list for ../../addons/src/chamfer/chamferdialog.h:
#include <QDialog>             // for QDialog
#include <QObject>             // for slots, Q_OBJECT
#include <QPointer>            // for QPointer
#include <QString>             // for QString
#include "ui_chamferdialog.h"  // for ChamferDialog
class QSettings;
class QWidget;
struct ChamferOptions;  // lines 32-32
---

../../addons/src/chamfer/chamferdialog.cpp should add these lines:
#include <QCheckBox>         // for QCheckBox
#include <QLineEdit>         // for QLineEdit
#include <QPushButton>       // for QPushButton
#include <QVariant>          // for QVariant
#include <Qt>                // for WA_DeleteOnClose, red
class QWidget;

../../addons/src/chamfer/chamferdialog.cpp should remove these lines:
- #include <QDoubleValidator>  // lines 27-27

The full include-list for ../../addons/src/chamfer/chamferdialog.cpp:
#include "chamferdialog.h"
#include <QCheckBox>         // for QCheckBox
#include <QLineEdit>         // for QLineEdit
#include <QLocale>           // for QLocale
#include <QPalette>          // for QPalette
#include <QPoint>            // for QPoint
#include <QPushButton>       // for QPushButton
#include <QRect>             // for QRect
#include <QSettings>         // for QSettings
#include <QSize>             // for QSize
#include <QString>           // for QString
#include <QValidator>        // for QDoubleValidator
#include <QVariant>          // for QVariant
#include <Qt>                // for WA_DeleteOnClose, red
#include <cmath>             // for tan, M_PI, atan
#include "chamferoptions.h"  // for ChamferOptions, ChamferOptions::InOut
class QWidget;

При этом все собирается без ошибок.

NickNotNick
() автор топика
Ответ на: комментарий от NickNotNick

Спасиба, ну думаю полезно, просто прогонять дабы почистить код там или типа того.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Наверное есть табличка где список

Так и есть. Инсталлируются в /usr/share/include-what-you-use (/usr/local/share):

boost-1.64-all.imp
boost-1.64-all-private.imp
boost-1.75-all.imp
boost-1.75-all-private.imp
boost-all.imp
boost-all-private.imp
clang-6.intrinsics.imp
gcc-8.intrinsics.imp
gcc.libc.imp
gcc.stl.headers.imp
gcc.symbols.imp
iwyu.gcc.imp
libcxx.imp
python2.7.imp
python3.8.imp
qt4.imp
qt5_11.imp
qt5_4.imp
stl.c.headers.imp
stl.public.imp
dataman ★★★★★
()
Ответ на: комментарий от gns

Документировано: IWYUMappings.md

IWYU’s default mappings are hard-coded in iwyu_include_picker.cc, and are very GCC-centric. There are both symbol- and include mappings for GNU libstdc++ and libc.

Any mappings outside of the default set can therefore be specified as external mapping files.

dataman ★★★★★
()
Ответ на: комментарий от dataman

еще хуже :) Ну вот сегодняшняя моя диагностика. Пишу мелкую утилиту, не важно про что:

decrypt_pass.c:34:26: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration]
   34 |             if (av[2] && strcmp(av[2], "-n") == 0)
      |                          ^~~~~~
decrypt_pass.c:8:1: note: include ‘<string.h>’ or provide a declaration of ‘strcmp’
    7 | #include <openssl/rc4.h>
  +++ |+#include <string.h>
    8 | 

То есть, про где что определено, gcc знает и так.

gns ★★★★★
()
Ответ на: комментарий от gns

еще хуже :) Ну вот сегодняшняя моя диагностика. Пишу мелкую утилиту, не важно про что:

decrypt_pass.c:34:26: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration]
  34 |             if (av[2] && strcmp(av[2], "-n") == 0)
     |                          ^~~~~~
decrypt_pass.c:8:1: note: include ‘<string.h>’ or provide a declaration of ‘strcmp’
   7 | #include <openssl/rc4.h>
 +++ |+#include <string.h>
   8 | 

То есть, про где что определено, gcc знает и так.

Не знает. Это только со стандартными функциями работает.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

С нестандартными он начинает предполагать, что такого-то метода при инстанцировании темплейта не нашлось, выдает простыню на три экрана и вежливо добавляет, что есть что-то похожее, но там есть где-то const :)

Оно, конечно, иногда помогает, но читать это нет никаких сил :)

gns ★★★★★
()
Ответ на: комментарий от NickNotNick

Заглядывал, конечно.

Там нет всех символов.

Угу.

dataman ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.