Как удалить мертвый код или бесполезный код на основе файла конфигурации / файла makefile - PullRequest
0 голосов
/ 16 сентября 2018

Когда мы компилируем проект C / C ++, некоторые файлы и коды в исходном коде проекта не нужны для компиляции.Например, тестовая папка (некоторые тестовые скрипты), папка примеров и мертвый код.Как я могу распознать эти исходные файлы, которые не скомпилированы в двоичные файлы?Не стоит надеяться, что компиляция необходима.Потому что мне нужно обрабатывать многие проекты автоматически, и очень сложно скомпилировать все проекты без ручных операций.

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

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

1 Ответ

0 голосов
/ 16 сентября 2018

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

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

Ваша система автоматизации сборки система (например, cmake или Makefile и т. Д.) Может быть (и обычно есть) Turing-complete ; таким образом, даже удаление совершенно бесполезных исходных файлов C ++ - вообще невыполнимая задача. Даже оболочку POSIX (используемую в командах для создания вашей вещи) сложно проанализировать (см. Превосходную речь Parsing Posix [S] , написанную Янном Реджис-Джанасом на FOSDEM2018).

...