[C++] чистка кода

Maurog

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

stm7884696

пойдаляй основные библиотеки, и запрети доступ к педалям из интерфейса... Когда у клиента опять появятся деньки - продашь все...
А полную версию проги можешь пока продать конкурентам...

freezer

а это вроде как оптимизатор делает на стадии линковки... или тебе нужно сам код порезать?

Maurog

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

Maurog

>>и запрети доступ к педалям из интерфейса
сырцы отдаются ;(

Ivan8209

Это к вопросу о стиле программирования.
Модульность придумали более сорока лет тому назад.
---
...Я работаю антинаучным аферистом...

freezer

совсем тривиальным способом в любом случае не получится... вообще, можно было сразу с #ifdef USE_PEDALI писать, а потом просто дать выход препроцессора...

Dasar

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

Marinavo_0507

Недавно для ядра Linux генерировал кто-то графы.
Но там плюсов нет.

Dasar

Основная проблема в том, что для C/C++ из-за сложности синтаксиса языка - нет дешевых качественных parser-ов/front-ендов.

freezer

я так понимаю, человека устроит дорогой, но хакнутый продукт

Maurog

>>#ifdef USE_PEDALI
если этих педалей несколько сотен, то такую хуйню не делают ;(
просто известно, что в проекте принимают участие одни функции..и точно не будут участвовать другие
вот эти другие надо бы вырезать из кода

Marinavo_0507

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

Dasar

> человека устроит дорогой, но хакнутый продукт
Проблема в том, что они на столько дорогие, что фактически ими мало кто пользуется. Соответственно поэтому они и до Warez-а плохо доходят.
ps
Тем более в данном случае, нужен не сам frontend, а надстройка над ним (построитель зависимостей).
Хочешь сказать, что те кто, пишет такие настройки тоже пользуются warez-софтом?

freezer

ну допустим, человек для себя написал, а потом на warez-сайте выложил. По идее, если есть парсер, то такую штуку сделать не особо сложно

Maurog

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

Marinavo_0507

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

bleyman

Проблема в том, что они на столько дорогие, что фактически ими мало кто пользуется.

Есть подозрения, что подобную категорию продуктов можно считать бесценными. То есть есть чуваки, которые могут тебе что-то сделать - проанализить код, почистить его, оптимизнуть, проверить на соответствие спецификациям и ффсе такое. При этом у них есть куча глючных утилиток (точнее, утилитищ) при помощи которых они это делают. Причем утилитищи пишутся прям в процессе, подгоняясь под конкретную задачу. Если чуваки принадлежат к опенсорс комьюнити, то у тебя даже есть шанс поффтыкать на код этих утилитищ, только пользы в этом никакой, потому что пользоваться ими умеют только эти чуваки.
Всё вышеизложенное является целиком и полностью плодом моего воображения и здравого смысла, бтв.
Так вот, а по теме: удаление функций наверное не сможет привести к появлению багов. Хотя тут тоже по разному может быть =) Типа оверлоадинг, неймспейсы и все такое. А если еще и классовая иерархия рассматривается... Тогда стало быть standalone функции комментишь, если компилится - то удаляешь. Очень аккуратно. Получится по минуте на функцию в среднем. Классы лучше удалять целиком или не трогать вообще. Переменные лучше не трогать, ибо никакой пользы чувакам они не принесут.
Перед началом процесса естественно все забэкапить раз наццать на разные компы. Еще очень неплохо все удаления и изменения фиксировать в текстовом файлике - пригодиццо.
А еще учитывай вот что: ты ж прогу суппортить будешь наверное, да? Баги там исправлять, все такое... Ну так вот, когда через годик у чуваков появятся деньги и они захотят свои педали обратно, то прикручивать старые педали к Новой и Улучшенной проге будет весьма непросто.
Так что лучше не пожалеть времени и произвести полноценный рефакторинг (о какое я слово знаю!) и отделить педали от фильмов в лучших традициях ООП. После чего педали заныкать.

Dasar

> Есть подозрения, что подобную категорию продуктов можно считать бесценными.
Для других языков: в частности Java-ы и .Net-а - есть довольно много качественных утилит с аналогичным назначением.

mirt1971

Есть подозрения, что подобную категорию продуктов можно считать бесценными. То есть есть чуваки, которые могут тебе что-то сделать - проанализить код, почистить его, оптимизнуть, проверить на соответствие спецификациям и ффсе такое. При этом у них есть куча глючных утилиток (точнее, утилитищ) при помощи которых они это делают. Причем утилитищи пишутся прям в процессе, подгоняясь под конкретную задачу. Если чуваки принадлежат к опенсорс комьюнити, то у тебя даже есть шанс поффтыкать на код этих утилитищ, только пользы в этом никакой, потому что пользоваться ими умеют только эти чуваки.
Всё вышеизложенное является целиком и полностью плодом моего воображения и здравого смысла, бтв.

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

Для таких вещей есть CVS. Или subversion. Или arch.
А еще учитывай вот что: ты ж прогу суппортить будешь наверное, да? Баги там исправлять, все такое... Ну так вот, когда через годик у чуваков появятся деньги и они захотят свои педали обратно, то прикручивать старые педали к Новой и Улучшенной проге будет весьма непросто.

Так он им и продаст первоначальный вариант

mysha

Основная проблема, похоже что мы задачу до конца не понимаем.
Если вырезаемая функциональность не выполнена в виде модуля, то
автоматические методы уже скорее всего не помогут. Например, если в проге
несколько нетривиальных тредов, то граф их асинхронного
взаимодействия слишком сложен для рассмотрения, а если прост,
то и графы не нужны.
Либо вырезать ручками + используя что-нить из рефакторинга.
Либо забить и отдать как есть - дешевле выйдет, если вещь не тиражируемая
то вполне приемлимый вариант.

Dasar

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

bleyman

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

mysha

В общем случае это невозможно!

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

Maurog

ну в этой проге нету форков и вообще тредов
все намного хуже
если на вход поступает фильм формата 1метр х 2 метра, то запускаются 8 екхешников этой проги, которые обрабатывают каждый свою часть фильма
при чем если фильм черно-белый, то в определенных случаях врубаются педали, которые следует отрубить
в общем, даже если я поставлю брекпойнты в каждую функцию (что само по себе нереально то я не смогу отловить все функции, которые вызываются без использования педалей, ибо существуют if-ы, которые выполняются в очень редких случаях (к примеру если в фильме есть субтитры с именем Джон Траволта, то сыграть траурную музыкуа для этого я на вход етой проги должен подать столько фильмов...что пипец
конечно, если бы можно было увидеть наглядное дерево вызовов, то это существенно облегчило бы перелопачивание всего кода
При этом, конечно, должны учитываться функции, которые вызываются неявно, например, конструкторы.

lev1961

Предлагается ультрарешение задачи: продать заказчику неизменную версию программы, с фильмами и педалями "с надеждой на дальнейшее сотрудничество" Он ведь тебе не платил за лишнюю работу по удалению педалей.

xronik111

Для gcc можно сделать так: сказать

gcc -fdump-ipa-cgraph -funit-at-a-time <FILE>

после чего будем иметь callgraph, но только в пределах одного файла, увы GСС должен быть 4.0.0.

sergey_m

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

sergey_m

нужно почистить огромный код....
По-моему рецепт один: садиться и хуярить. Волшебных утилит не существует.

durka82

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

Maurog

зачем мне волшебные?
есть конкретная задача
хочется ее облегчить и не делать в лоб
вроде вполне нормальный вопрос

bleyman

Блин, я не понимаю.
Находишь функцию, точно относящуюся исключительно к "педалям". Убиваешь ее. Компилятор тебе говорит в каких местах она вызывается. Проверяешь предположение о том, что она относится исключительно к педалям, убиваешь все вызовы.
Повторяешь Н раз.
Если Н велико, то никто и никогда не сможет восстановить тебе эти педали без больших затрат.
Более того, если код относящийся к педалям убирать не целиком, а выборочно, то это на самом деле затруднит работу того, кто попытается дописАть функциональность педалей =)
Чем тебе _существенно_ поможет граф вызовов - я не знаю.
Да, кстати. У МС СРР Компайлера (точнее даже у линкера) есть такая опция - generate map file. Так вот, в этом мап файле вроде как есть инфа о том, кто и откуда вызывает данную функцию. Инфа, конечно, в текстовом виде.

Maurog

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

mysha

Вот ты и сделай, и все тебе будут благодарны,
а то как чужим трудом для заработка пользоваться - все горазды
Оставить комментарий
Имя или ник:
Комментарий: