как определить используемый код
От: sergey2b ЮАР  
Дата: 10.04.20 14:27
Оценка:
мне надо мигрировать приложение с win на linux
примерно несколько сот тыс строк
состоит из N самописных библиотек (те исходный код доступен) которые в итоге собираються в юинарник

уже понятно что часть кода реально не используеться
есть ли какая либо возможность определить какой код реально используеться в приложении
Re: как определить используемый код
От: flаt  
Дата: 10.04.20 14:32
Оценка: 4 (1)
Натравить тулзы с code coverage и прогнать софт под как можно большим количеством юзкейсов. Либо тщательно проанализировать код самому. Либо понадеяться, что линкер выкинет лишнее.
Re: как определить используемый код
От: kov_serg Россия  
Дата: 10.04.20 14:34
Оценка: 4 (1) +1
Здравствуйте, sergey2b, Вы писали:

S>мне надо мигрировать приложение с win на linux

S>примерно несколько сот тыс строк
S>состоит из N самописных библиотек (те исходный код доступен) которые в итоге собираються в юинарник

S>уже понятно что часть кода реально не используеться

S>есть ли какая либо возможность определить какой код реально используеться в приложении
1. Собираете всё в статические либы.
2. Потом компилируете целевые исполняемые файлы, генерируя при этом map файл
3. Затем парсите его и выделеяте то что используются
4. ...
5. PROFIT
Re[2]: как определить используемый код
От: sergey2b ЮАР  
Дата: 10.04.20 14:35
Оценка:
Здравствуйте, flаt, Вы писали:

F>Натравить тулзы с code coverage и прогнать софт под как можно большим количеством юзкейсов. Либо тщательно проанализировать код самому. Либо понадеяться, что линкер выкинет лишнее.


а можно название 1-2 таких утилит для примера
я сейчас анализирую но кода овер дофига (хотя некоторые стратегии я придумал)

линкер не вариант тк конечная цель сэкономить время на переноси исходного кода
Re: как определить используемый код
От: Zhendos  
Дата: 10.04.20 14:41
Оценка: 4 (1)
Здравствуйте, sergey2b, Вы писали:

S>мне надо мигрировать приложение с win на linux

S>примерно несколько сот тыс строк
S>состоит из N самописных библиотек (те исходный код доступен) которые в итоге собираються в юинарник

S>уже понятно что часть кода реально не используеться

S>есть ли какая либо возможность определить какой код реально используеться в приложении

clion вроде умеет, но я давно его не использовал
поэтому "вроде".
Re[3]: как определить используемый код
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.04.20 14:59
Оценка: 4 (1)
Здравствуйте, sergey2b, Вы писали:

S>линкер не вариант тк конечная цель сэкономить время на переноси исходного кода


Почему не вариант?
Ты просто решил, что надо на целевом линуксе смотреть, что выкинулось, а что нет. А надо смотреть виндовый вариант, что в нем используется, и от этого плясать.
Маньяк Робокряк колесит по городу
Re: парсинг map file
От: sergey2b ЮАР  
Дата: 10.04.20 15:32
Оценка:
Здравствуйте, sergey2b, Вы писали:

одна из утилит парсинга http://www.sikorskiy.net/prj/amap/index.html
позволяет сделать примитивный анализ (мне пока хватило для начала)
Re[3]: как определить используемый код
От: watchmaker  
Дата: 10.04.20 15:55
Оценка: 4 (1)
Здравствуйте, sergey2b, Вы писали:

S>Здравствуйте, flаt, Вы писали:


F>>Натравить тулзы с code coverage и прогнать софт под как можно большим количеством юзкейсов. Либо тщательно проанализировать код самому. Либо понадеяться, что линкер выкинет лишнее.


S>а можно название 1-2 таких утилит для примера


clang же: https://clang.llvm.org/docs/SourceBasedCodeCoverage.html
Ну или gcov.

S>линкер не вариант


Линкер — норм. Если он выкинул что-то, то это явно не нужно.

Другое дело, что линкер и прочие map-файлы не смогут обнаружить, например, что реально функция fn в таком фрагменте не вызывается: if (sinf(x) > 2.0f) { fn(); }

А source based code coverage как раз разметит, что при использовании программы условие в этой строке не становилось истинным никогда, и соответственно функция fn не нужна (если она больше нигде не вызывается).
Re[4]: как определить используемый код
От: K13 http://akvis.com
Дата: 10.04.20 16:15
Оценка:
W>Другое дело, что линкер и прочие map-файлы не смогут обнаружить, например, что реально функция fn в таком фрагменте не вызывается: if (sinf(x) > 2.0f) { fn(); }

W>А source based code coverage как раз разметит, что при использовании программы условие в этой строке не становилось истинным никогда, и соответственно функция fn не нужна (если она больше нигде не вызывается).


"В военное время значение синуса может достигать и четырех!"
А вообще -- есть риск "не поймать" обработчики исключительных ситуаций, например таймаут при запросе в БД, исчерпание места на диске и т.п.
Линкер в этом отношении надежнее: то что он не взял -- портировать не нужно.
Re[5]: как определить используемый код
От: watchmaker  
Дата: 10.04.20 16:31
Оценка: +1
Здравствуйте, K13, Вы писали:

K13>А вообще -- есть риск "не поймать" обработчики исключительных ситуаций, например таймаут при запросе в БД, исчерпание места на диске и т.п.


Конечно. Именно поэтому подсчёт покрытия часто используется совместно с тестами и прочим Continuous Integration: смотрим на непокрытые участки кода и либо удаляем их (как потерявшие актуальность), либо добавляем тест, который приведёт к срабатыванию нужной ветки.

Ну и в любом случае, имея детальную карту покрытия можно легко её огрубить до уровня функции, объектника, или библиотеки. А уже потом разбираться с такими крупными блоками — если из всей библиотеки ни одной функции не было вызвано, то на неё надо посмотреть повнимательнее на предмет полезности.
Re: как определить используемый код
От: prog123 Европа  
Дата: 10.04.20 18:01
Оценка: 4 (1)
Здравствуйте, sergey2b, Вы писали:

S>уже понятно что часть кода реально не используеться

S>есть ли какая либо возможность определить какой код реально используеться в приложении

Кроме уже предложенных, можно попробовать профилировщики. Они выдают список всех ф-ций, которые вызывались. Если список можно вывести в текстовый файл, еще лучше. Еще поискать что-то типа call graph profiler.
Вот тут что-то делают https://www.cs.sfu.ca/~wsumner/teaching/886/callgraph-profiler.html
Re: как определить используемый код
От: reversecode google
Дата: 10.04.20 20:04
Оценка: -5
500k loc это даже не о чем
если даже несколько сот многовато, для программиста >5 лет
это проф не пригодность
Re[2]: как определить используемый код
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 11.04.20 08:46
Оценка: 4 (1) -3 :))
Здравствуйте, reversecode, Вы писали:

R>если даже несколько сот многовато, для программиста >5 лет

R>это проф не пригодность

Для программиста, независимо от стажа, способность анализировать чужой код, за пределами самого общего понимания, вообще не является профессиональной необходимостью. Профессиональная функция программиста — создавать код, а не "разматывать" его. То есть, если программист способен создать код в рамках заданных условий (задача, время, стоимость, надежность и т.п.) — он однозначно полностью профпригоден. Умение копаться в чужом коде и переделывать его — сугубо дополнительные способности.
Re[3]: как определить используемый код
От: IID Россия  
Дата: 16.04.20 18:14
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Для программиста, независимо от стажа, способность анализировать чужой код, за пределами самого общего понимания, вообще не является профессиональной необходимостью. Профессиональная функция программиста — создавать код, а не "разматывать" его. То есть, если программист способен создать код в рамках заданных условий (задача, время, стоимость, надежность и т.п.) — он однозначно полностью профпригоден. Умение копаться в чужом коде и переделывать его — сугубо дополнительные способности.


Ничего подобного.
Код он не сферический в вакууме. А взаимодействует с другим кодом (ОС, библиотеками и т.д.).
Даже программисту-одиночке придётся изучать документацию, а часто и реализацию того, с чем он работает.

А в командах необходимость понимать чужой код возрастает многократно.

Иначе программирование превращается в "шаманство". Когда вместо детального выяснения причин делают перебор разных вариантов, подстановку разнообразных затычек и костылей, без полного понимания сути происходящего.

Причём заметь, даже пресловутое "самое общее понимание" — оно не возникает внезапно изниоткуда. Это тысячи часов опыта. Когда глядя на код ты сразу понимаешь что и зачем. А не пережёвываешь более низкоуровневые конструкции.
kalsarikännit
Re: как определить используемый код
От: IID Россия  
Дата: 16.04.20 18:17
Оценка: 4 (1)
Здравствуйте, sergey2b, Вы писали:

S>есть ли какая либо возможность определить какой код реально используеться в приложении


Возьми код, который ТОЧНО используется (main и далее). И подключай сорцы по сообщениям линкера. Если совсем перфекционист — в подключенном сорце комментируй всё, кроме нужной функции. А потом раскомментируй по мере продвижения.
kalsarikännit
Re[4]: как определить используемый код
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 17.04.20 00:58
Оценка:
Здравствуйте, IID, Вы писали:

IID>Код он не сферический в вакууме. А взаимодействует с другим кодом (ОС, библиотеками и т.д.).

IID>Даже программисту-одиночке придётся изучать документацию, а часто и реализацию того, с чем он работает.

За документацию разговора нет. А вот реализацию приходится изучать исключительно при нехватке документации (если, конечно, не ставится целью сделать "такое же, но с перламутровыми пуговицами").

IID>А в командах необходимость понимать чужой код возрастает многократно.


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

IID>Причём заметь, даже пресловутое "самое общее понимание" — оно не возникает внезапно изниоткуда. Это тысячи часов опыта. Когда глядя на код ты сразу понимаешь что и зачем.


Это не только опыт, но еще и определенным образом устроенные мозги, и определенные склонности. Иначе можно скатиться и до того, что каждый писатель, способный создать качественный роман, должен, лишь глядя на чужое творение (не читая его полностью и вдумчиво), видеть все характеры, сюжетные линии, их возможные нестыковки и т.п.
Re[3]: как определить используемый код
От: rg45 СССР  
Дата: 17.04.20 05:25
Оценка: +3
Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>Для программиста, независимо от стажа, способность анализировать чужой код, за пределами самого общего понимания, вообще не является профессиональной необходимостью. Профессиональная функция программиста — создавать код, а не "разматывать" его. То есть, если программист способен создать код в рамках заданных условий (задача, время, стоимость, надежность и т.п.) — он однозначно полностью профпригоден. Умение копаться в чужом коде и переделывать его — сугубо дополнительные способности.


Тут невольно вспмонилось "чука — не читатель, чукча — писатель..."
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: как определить используемый код
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 17.04.20 05:33
Оценка:
Здравствуйте, rg45, Вы писали:

R>Тут невольно вспмонилось "чука — не читатель, чукча — писатель..."


Если чукча напишет что-нибудь достаточно дельное, то он таки писатель, увы и ах, даже если и не читал ничего.
Re[5]: как определить используемый код
От: rg45 СССР  
Дата: 17.04.20 06:06
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

R>>Тут невольно вспмонилось "чука — не читатель, чукча — писатель..."


ЕМ>Если чукча напишет что-нибудь достаточно дельное, то он таки писатель, увы и ах, даже если и не читал ничего.


А тут невольно вспоминается другой афоризм — про бабушку и бороду.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: как определить используемый код
От: rg45 СССР  
Дата: 17.04.20 06:22
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>мне надо мигрировать приложение с win на linux

S>примерно несколько сот тыс строк
S>состоит из N самописных библиотек (те исходный код доступен) которые в итоге собираються в юинарник

S>уже понятно что часть кода реально не используеться

S>есть ли какая либо возможность определить какой код реально используеться в приложении

Я позволю себе слегка отклониться от прямого ответа на прямой вопрос. Нужно иметь в виду, что тот факт, что какой-либо библиотечный код не используется в каком-либо конкретном приложении, не обязательно означает, что данный код бесполезен. Ведь такова природа бибилиотек — служить хранилищем всякой всячины, более или мене полезной, которая когда-нибудь где-нибудь может пригодиться. Линкер сам разберется, что нужно взять из библиотеки для того или иного приложения. Если библиотека нормально структурирована (разбита на объектные модули), то никаких проблем с избыточным размером бинарей не возникает, как правило.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 17.04.2020 6:25 rg45 . Предыдущая версия . Еще …
Отредактировано 17.04.2020 6:23 rg45 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.