LINUX.ORG.RU

Инструмент для выявления различий в SDK

 , , , ,


0

1

Кратко:

Есть десяток SDK в которых сишные хедеры с разными сущностями в виде функций, структур, макросов, переменных и др. которые делали разные разработчики. Нужно аккуратно сравнить их между собой. Сравнить грамотно, то есть пропуская разное именование аргументов функций и разный стиль кодирования разработчиков. И на основе этих разниц сделать всеобъемлющий SDK, включающий в себя наработки всех этих десяти SDK. Есть ли какие-нибудь инструменты для решения подобных задач?

TL;DR:

В середине нулевых было сообщество по реверсу прошивок под некоторые железки. Сообщество пилило приложения на C/C++, но как это и было ожидаемо от тех лет, разработчики из этого сообщества были рассредоточены в превалирующем большинстве на Windows. Отсюда вытекают проблемы разработки тех лет: Win-1251 вместо Unicode, RAR-архивы вместо использования VCS, обмазанность BAT-скриптами с адовой логикой вида запишем результат в файлик чтобы прочитать его и отправить в следующую утилиту, регистронезависимость в именах хедеров и прочее подобное, те кто сталкивался с этим, тот знает.

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

Собственно я решил в качестве хобби для сообщества ROM-хакеров объединить эти древние разрозненные SDK и сделать инструментарий кросс-платформенным, доступным и для Linux.

И вот столкнулся с интересной задачей по сравнению SDK. Я конечно ручками и git diff перенёс и всё более-менее полно и работает, но хочется проверить как себя, так и просто подумать над частичной автоматизацией подобной задачи.

То есть, к примеру, сделать такой инструмент, которому я бы кормил директорию SDK, он бы проходил по каждому .h-файлику в нём, собирал информацию о сущностях в этих файлах не смотря на стиль кодирования, названия аргументов и прочие незначительные вещи и выдавал сортированный листинг используемых сущностей. Сравнивая подобные листинги между собой, мне было бы очень просто выявить различия и на их основе собрать всеобъемлющий SDK, который бы охватывал изменения всех разработчиков и я ничего бы не потерял.

Нутром чую что без всяких clang-tidy, clang-format и прочих тут видимо не обойтись, если ставить задачу именно по сравнению AST и приведённого к единому стилю кода. Может кто-то когда-то создал уже похожий инструмент для подобного сравнения или сталкивался с похожей задачей? Интересно было бы услышать ваши варианты решения подобного.

★★★★★

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

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

То есть, к примеру, сделать такой инструмент, которому я бы кормил директорию SDK,

ИМХО Вы как раз и являетесь лучшим из всех «инструментов».

Что касаемо предлагаемой разработки, то скорее всего «каляки маляки» не сравнимы.

Forum0888
()

Обойти все хедеры с помощью Libclang (пример), clang --dump-ast или tree-sitter и построить множество AST (на каждый файл в библиотеке).

Затем по AST построить CPG и сложить всё в графовую БД (по одной базе на SDK).

Затем, строя те или иные запросы к БД, уже искать различия между SDK.

Bass ★★★★★
()
Последнее исправление: Bass (всего исправлений: 1)

Для одноразовой задачи автоматизация и её отладка займёт больше времени, чем ручная работа. Проект нишевый, маловероятно, что эта автоматищация пригодится где-то ещё.

ox55ff ★★★★★
()

Как-то разработал код (JavaScript, PHP, XML), который прошёлся по всем страницам MSDN и сгенерировал биндинги для использования API всех подсистем Microsoft.
При этом определения функций с страниц HTML программно сравнивал с определениями в *.h файлах (в комментариях к каждой функции было название h файла).
Результат генерации: *.cpp, *.h и *.idl.
Штук пятнадцать нестыковок было.

Скорее всего можно программно и эти SDK сравнить если они не «каша малаша».

Forum0888
()

Помню, когда LSB ещё развивали, там был http://linuxtesting.org/abi-compliance-checker или что-то в этом роде. Тулза для сертификации дистрибутива «LSB-compatible» как я понимаю. Может быть тебе подойдёт? ИСП РАС её пилили, кстати.

https://lvc.github.io/abi-compliance-checker/

snizovtsev ★★★★★
()
Последнее исправление: snizovtsev (всего исправлений: 2)

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

https://libclang.readthedocs.io/en/latest/

snizovtsev ★★★★★
()