Обнаружение мертвого кода в [закрытом] проекте C/C++ прежней версии

Если ничего из вышеперечисленного не имеет смысла:

tl; dr

Так же, как implicitly unwrapped optional, если вы можете гарантировать , что ссылка не будет равна нулю в точке ее использования, используйте неизвестную. Если нет, то вы должны использовать слабый.

Объяснение:

Ниже я нашел следующее: слабая ссылка без связи . Исходя из того, что я понял, непризнанное «я» не может быть равным нулю, но слабое «я» может быть, а непризнанное «я» может привести к висящим указателям ... что-то позорное в Objective-C. Надеюсь, это поможет

«НЕИЗВЕСТНЫЕ Слабые и неизвестные ссылки ведут себя одинаково, но НЕ одинаковы».

Неизвестные ссылки, как слабые ссылки, не увеличивают количество сохраняемых объектов, на которые ссылаются. Тем не менее, в Swift, неизвестная ссылка имеет дополнительное преимущество , поскольку она не является опциональной . Это делает их более легкими в управлении , чем использование необязательного связывания. Это мало чем отличается от неявно развернутых опций. Кроме того, неизвестные ссылки являются ненулевыми . Это означает, что когда объект освобождается, он не обнуляет указатель. Это означает, что использование неизвестных ссылок может, в некоторых случаях, приводить к висящим указателям . Для вас, ботаников, которые помнят дни Objective-C, как и я, неподтвержденные ссылки отображаются на unsafe_unretained.

1116 Вот где это немного сбивает с толку.

Слабые и неизвестные ссылки не увеличивают количество сохраняемых данных.

Они оба могут быть использованы для прерывания удержания циклов. Так когда же мы их используем ?!

Согласно документам Apple :

«Используйте слабую ссылку, когда она действительна , чтобы эта ссылка в какой-то момент стала нулевой в течение своей жизни. И наоборот, используйте неизвестную ссылку, если вы знаете, что ссылка никогда не будет равна нулю, если она была установлена ​​во время инициализации ».

68
задан Dror Helper 23 October 2008 в 09:20
поделиться

2 ответа

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

Мы ' Мы использовали наш DMS Software Reengineering Toolkit, чтобы реализовать именно это для кода Java, анализируя сразу все задействованные единицы компиляции, создавая таблицы символов для всего и просматривая все ссылки. Определение верхнего уровня без ссылок и утверждения о том, что оно является внешним элементом API, мертво. Этот инструмент также автоматически удаляет мертвый код, и в конце вы можете выбрать то, что хотите: отчет о мертвых объектах или код, лишенный этих объектов.

DMS также анализирует C ++ на различных диалектах (EDIT, февраль 2014 г .: , включая версии C ++ 14 для MS и GCC [EDIT, ноябрь 2017 г .: теперь C ++ 17] ) и создает все необходимое таблицы символов. Отследить мертвые ссылки с этого момента будет просто. DMS также можно использовать для их удаления. См. http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html

3
ответ дан 24 November 2019 в 14:22
поделиться

Только для кода C и при условии, что исходный код всего проекта доступен, запустите анализ с помощью инструмента с открытым исходным кодом Frama-C . Любой оператор программы, который отображается красным в графическом интерфейсе пользователя, является мертвый код.

Если у вас есть проблемы с мертвым кодом, вас также может заинтересовать удаление "запасного кода", кода, который выполняется, но не способствовать конечному результату. Для этого вам необходимо предоставить точное моделирование функций ввода / вывода (вы бы не хотели чтобы удалить вычисление, которое кажется "лишним", но который используется в качестве аргумента для printf ). Frama-C имеет возможность указать запасной код.

4
ответ дан 24 November 2019 в 14:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: