LINUX.ORG.RU

просмотровщик кода для C/C++

 , code browser,


3

6

Ищется open source просмотровщик кода, который встраивается в процесс сборки (так, как это делает статический анализатор) и по её результатам способен показать код собранной программы на Си/Си++ с учётом макросов и расположений директорий. В нём должен работать переход к определению. Редактирование не нужно. Есть такой в природе?

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

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

Статическому анализатору в теории пофиг на систему сборки. Он перехватывает компиляторы и записывает все ходы, т.е. командные строки запуска компилятора и файлы, к которым компилятор обращается. Вот нужно что-то в этом роде.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Статический анализатор используется аналогично компилятору, только вместо компиляции он анализирует. Никаких перехватов и записей ходов он не делает. Так что задача по сути непонятна. Может быть вам нужно посмотреть код после препроцессора?

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

Контрпример к твоим словам: https://fbinfer.com/docs/infer-workflow.html

конкретно вот эта фраза,

What happens is that the files get compiled as usual, and they also get translated by Infer to be analyzed in the second phase.

но ты можешь прочитать документ целиком и убедиться.

Он именно перехватывает компилятор, например, вместо gcc будет какой-нибудь (условно) infer-gcc, который И компилирует файл (вызывает обычный gcc), И захватывает инфу о процессе компиляции, чтобы потом скормить её собственно машине анализа.

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

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 3)
Ответ на: комментарий от den73

конкретно вот эта фраза,
но ты можешь прочитать документ целиком и убедиться.

Ну ты просто неправильный термин используешь. Нет никакого перехвата. Статический анализатор как и компилятор имеет фронтэнд, который разбирает исходный код и строит абстрактное синтаксическое дерево (АСТ) и бекэнд, который пробегается по АСТ и анализирует его, выдавая диагностические сообщения (компилятор выдает машинный код). При этом анализатор часто имеет тот же самый фронтэнд что и компилятор, что разумно и логично. Но никакого перехвата здесь нет.

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

Я не соглашусь, что мой термин неправильный, и что перехвата нет. В clang анализатор, как я понял, является режимом работы компилятора или каким-то плагином. В infer это более сложно. Некоторые другие средства именно переопределяют компилятор, например, с помощью переменной CC. Но смысл не в том, как это назвать. Смысл в том, чтобы просмотровщик кода получал свою информацию во время настоящей сборки.

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

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

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

А можешь описать проблему, которую ты хочешь решить? Пока я склоняюсь, что тебе нужен выхлоп препроцессора, но с таким описанием трудно это утверждать.

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

Ccls не подходит?

Возможно, добавил в список.

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

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

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

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

Сценарий использования такой:

1. Дан код и инструкция по сборке

2. Я разворачиваю код, но вместо ./configure и make выполняю «code-browser ./configure» и «code-browser make». Если проект собирается другой системой сборки, то инструкция меняется, но должно быть так, что я не лезу в начинку всяческих makefile.in, cmakelists и прочего ужаса, а именно выполняю сборку под контролем искомой тулзы, которая, прости господи, перехватывает управление процессом сборки и в качестве побочного эффекта генерирует некую базу данных, содержащую информацию о проекте (места определений функций, определения макросов, расположения инклюдов при каждой конкретной компиляции и т.п.)

3. Делаю «code-browser-browse». Открывается некий гуй с исходником функции main и кнопкой «перейти к определению».

Этот сценарий придумал не я. Так работают статические анализаторы, практически дословно.

Единственное, может быть, что современные среды разработки с этим справляются. Но по моему опыто они с этим _не_ справляются для C/C++. Может быть, дело в моей криворукости - я точно не знаю.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Ну ты описал штатную функциональность IDE для С/С++. Раз вопрос возник, значит имеющиеся у тебя не справляются IDE по причине сложности кода. Значит либо нужно искать более продвинутую IDE, либо вручную решать проблему. Фактически как я и подозревал тебе нужно получить выхлоп препроцессора и навигацию по нему. Я делал вручную это, например, когда отлаживал макросы. Тот же cmake имеет специальные target чтобы выдать выхлоп препроцессора для каждого файла.

В общем если хочешь автоматически, то нужно искать продвинутую IDE (говорят что от jet brain'а самая продвинутая, но не утверждаю). Однако если у тебя там какой-то сложный пайплайн сборки, то IDE тебе скорее всего не поможет и тогда остается руками. Но чтобы подсказать, тут уже нужны детали.

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

Т.е. я правильно понимаю, что IDE действительно не справляются с навигацией по коду, напичканному макросами, даже если сборка происходит под контролем IDE через понятный ей файл проекта? Или это скорее в случае, когда собираем каким-нибудь make-ом, а потом IDE открывает этот код и пытается его понять в меру свого разумения?

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от den73

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

А ctags пробовали? Эта утилита парсит код и создает индексы. Потом можно их использовать для навигации, многие редакторы их поддерживают. Правда я давно им пользовался.

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

может быть, что современные среды разработки с этим справляются. Но по моему опыто они с этим _не_ справляются для C/C++

Если речь про опен-сорс, то возможно. А вообще - справляются.

anonymous
()

Я не понял, почему нечто, что

перехватывает компиляторы и записывает все ходы, т.е. командные строки запуска компилятора и файлы, к которым компилятор обращается

называется статический анализатор, но, похоже, тебе нужно что-то, что генерирует compilation database. Если используется cmake, то достаточно сказать ему опцию CMAKE_EXPORT_COMPILE_COMMANDS. Если используется make, то можно обернуть его в compiledb. Прочую экзотику должен ловить bear, он работает через LD_PRELOAD. Также есть вариант сделать обёртки непосредственно над компилятором, которые будут логировать всё, что нужно, раньше так работал rtags, сейчас не знаю.

Ну а для перехода к определению и прочих прелестей используется уже инструмент, который с этой базой умеет работать - ccls, cquery или clangd.

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

Всем спасибо! Верю, что тема раскрыта.

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

называется статический анализатор

я не так сказал. Я сказал, что статический анализатор так делает.

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

Статический анализатор так:

перехватывает компиляторы и записывает все ходы

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

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

«Баобабом не помрет» /шутка/.

Владимир

anonymous
()

Рассекреть пожалуйста спецификацию ЯР /вообщем файлик с планом развития проекта, не реализованных идей, .../.
У тебя там был просто «клоадец» отличных идей /что-то на твоих страницах не нахожу/.

Владимир

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

Рассекреть пожалуйста спецификацию ЯР

Извините, но не буду. Да там ничего особо ценного :)

Ты же вроде работу на Go искал, что случилось?

Работу я, в принципе, нашёл. Детали сообщать не стоит, наверное.

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

Ну давай не будем спорить об этом. Какая разница, в конце концов?

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

Онегин, я тогда моложе, я лучше качеством была.

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