Мёртвый код

Мёртвый код

В теории компиляторов, мёртвым кодом (так же бесполезным кодом, англ. dead code) называют код, который может быть исполнен, но результаты его вычислений в дальнейшем в программе не используются[1][2][3]. Другими словами это код, определяющий только мёртвые переменные[en] или вообще не определяющий никакие переменные. При рассмотрении исходного кода, часто используют другое понятие мёртвого кода — как совокупности бесполезного и недостижимого кодов[4][5]. Наличие мёртвого кода в программе увеличивает её размер и время исполнения, не неся при этом ни какой пользы. В оптимизирующих компиляторах для выявления и удаления мёртвого и недостижимого кодов на уровне промежуточного представления[en] используются оптимизации удаления мёртвого кода и удаления недостижимого кода. Для поиска мёртвого кода в исходном коде применяются всевозможные анализаторы и детекторы мёртвого кода[4][5]. Такие анализаторы часто бывают встроены в компилятор или IDE и выдают соответствующие предупреждения о наличии в программе мёртвого кода во время её компиляции[6][7][8].

Содержание

Примеры

Рассмотрим следующий пример на языке Си:

 int foo(int x, int y)
 {
   int z; /* Объявление мёртвой переменной */
   z = x/y; /* Мёртвый код */
   return x*y;
 }

Здесь, операция z = x/y является мёртвым (бесполезным) кодом, так как результат работы этой операции, переменная z, в дальнейшем в программе не используется. Сама переменная z является мёртвой в процедуре foo. Если переменная y равна нулю, то операция, выполняющая бесполезное вычисление, спровоцирует исключение, следовательно её удаление, возможно, способно изменить вывод программы. Оптимизация удаления мёртвого кода удалит операцию z = x/y, только если не будет сомнений в том, что из-за этого не изменится результат работы программы[9].

Применительно к исходному коду, недостижимый код часто называют мёртвым, хотя с точки зрения теории компиляторов это разные вещи. Рассмотрим следующий пример:

 int foo(void)
 {
   int x = 25;
   return x;
   x = 2*x; /* Недостижимый код */
   return 0; /* Недостижимый код */
 }

Здесь, операции x = 2*x и return 0 не могут быть исполнены ни при каких условиях, так как они происходят после безусловного возврата из процедуры и являются недостижимыми (операции, стоящие после возврата из процедуры могут и не являться недостижимым кодом, например, если на метку, стоящую после возврата ссылается оператор goto). Оптимизация удаления недостижимого кода может удалить эту операцию.

Анализ

Для выявления и удаления бесполезного кода, оптимизация удаления мёртвого кода использует результаты анализа потока данных[en] (например анализа активных переменных[en]) или осуществляет самостоятельный анализ SSA-представления программы. Оптимизация удаления недостижимого кода анализирует граф потока управления и устраняет недостижимые узлы.

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

В исходном коде больших приложений бывает сложно распознать мёртвый код (бесполезный и недостижимый). Для этого могут применяется детекторы мёртвого кода[4][5], выполняющие статический анализ кода. Многие компиляторы и IDE выдают предупреждения о объявленных, но неиспользуемых функциях, методах, классах, переменных[6][7][8].

Мёртвый код и информационная безопасность

Для сокрытия алгоритмов, используемых в программе, с целью защиты интеллектуальной собственности, мёртвый код может добавляется в программу намеренно, в качестве затеняющего преобразования. Такое преобразование призвано увеличить энтропию кода, чтобы затруднить восстановление алгоритма, реализованного в программе. Так же, в целях затенения, в программу может добавляться недостижимый некорректный код: во время работы программы такой участок кода ни когда не исполняется и не вызывает ошибок, но дизассемблер или декомпилятор во время работы с этим участком кода могут повести себя непредсказуемо[10][11].

Наличие в программе мёртвого и недостижимого кодов может являться уязвимостью, так как в такие участки кода могут внедряться программные закладки[12][13].

См. также

Примечания

  1. Engineering a Compiler — С. 544.
  2. Компиляторы — принципы, технологии, инструменты — С. 713, 714.
  3. Debray, S. K., Evans, W., Muth, R., and De Sutter, B. 2000. Compiler techniques for code compaction. ACM Trans. Program. Lang. Syst. 22, 2 (Mar. 2000), 378-415. (summary Архивировано)
  4. 1 2 3 Dead code detection and removal. Aivosto. Архивировано из первоисточника 6 августа 2012.
  5. 1 2 3 Compares some free alternatives to DCD (Dead Code Detector). Java.net. Архивировано из первоисточника 23 сентября 2012.
  6. 1 2 GCC online documentation. Options to Request or Suppress Warnings.. GNU Compiler Collection. Архивировано из первоисточника 26 июня 2012.
  7. 1 2 JDT Plug-in Developer Guide. Compiling Java code.. eclipse.org. Архивировано из первоисточника 26 июня 2012.
  8. 1 2 Discover dead code in your application using Code Analysis. Habib Heydarian, Microsoft Corp.. Архивировано из первоисточника 23 сентября 2012.
  9. 1 2 Appel, A. W. Modern Compiler Implementation in Java. — Cambridge University Press, 2004. — С. 360. — ISBN 0-511-04286-8.
  10. И. Ю. Иванов / Киевский национальный университет им. Тараса Шевченко / О проблемах защиты интеллектуальной собственности в программных системах // Проблеми прграмування. — 2006. — №2-3 Спеціальний випуск — С. 68-72. (текст Архивировано)
  11. Обфускация и её преодоление // Лаборатория взлома. — Май 2006. — С. 8-13. (текст Архивировано)
  12. Торшенко Ю.А. / СПб ГУ ИТМО / Модель и метод обнаружения уязвимостей на начальных этапах промышленного проектирования программного продукта. — 2008. (текст Архивировано)
  13. Сакулина М.С. / Выявление и устранение «мертвого кода» с использованием технологии программирования IBM Rational Application Developer. (текст Архивировано)

Литература

  • Cooper and Torczon Engineering a Compiler. — Morgan Kaufmann, 2011. — С. 544-550, 593. — ISBN 978-0-12-088478-0
  • Ахо, Альфред В.; Сети, Рави; Ульман, Джеффри Д. Компиляторы — принципы, технологии, инструменты. — Вильямс, 2003. — С. 713, 714, 733, 734. — ISBN 5-8459-0189-8
  • Muchnick, Steven S. Advanced Compiler Design and Implementation. — Morgan Kaufmann Publishers, 1997. — С. 592-597. — ISBN 1-55860-320-4

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужен реферат?

Полезное


Смотреть что такое "Мёртвый код" в других словарях:

  • Недостижимый код — В программировании и теории компиляторов, недостижимым кодом называют часть кода программы, которая ни при каких условиях не может быть исполнена, поскольку является недостижимой в графе потока управления[1][2]. Недостижимый код часто относят к… …   Википедия

  • Удаление мёртвого кода — В теории компиляторов удалением мёртвого кода (англ. dead code elimination, DCE) называется оптимизация, удаляющая мёртвый код. Мёртвым кодом (так же бесполезным кодом) называют код, исполнение которого не влияет на вывод программы, все… …   Википедия

  • Удаление мертвого кода — В теории компиляторов удалением мертвого кода называется оптимизация, удаляющая бесполезные операции, то есть операции, результат которых нигде не используется, и операции, которые в силу различных условий никогда не будут выполнены. Рассмотрим… …   Википедия

  • Удаление недостижимого кода — В теории компиляторов удалением недостижимого кода (англ. unreachable code elimination) называется оптимизация, удаляющая недостижимый код, то есть код, который содержится в программе, но по каким то причинам, никогда не исполняется[1]. В… …   Википедия

  • Список серий телесериала «Остаться в живых» — Список серий популярного телесериала «Остаться в живых», премьера которого состоялась на американском телевидении 22 сентября 2004 года. Содержание 1 Первый сезон: 2004 2005 2 Второй сезон: 2005 2006 …   Википедия

  • Большой Донской Чулек — У этого термина существуют и другие значения, см. Чулек. Большой Донской Чулек Характеристика Длина 26 км Площадь бассейна 186 км² Бассейн Азовское море Водоток …   Википедия

  • Список эпизодов телесериала «Чёрная метка» — Список серий американского телесериала «Чёрная метка» в жанре комедийной драмы, транслируемого на телеканале USA Network с 28 июня 2007 года. Содержание 1 Обзор 2 Список серий …   Википедия

  • Resident Evil Code: Veronica — Обложка североамериканского издания игры для Dreamcast Разработчики Capcom …   Википедия

  • Один из них — англ. One of Them Серия телесериала «Остаться в живых» Номер серии Сезон 2 Серия 14 Режиссёр Стивен Уильямс Автор сценария Деймон Линделоф Карлтон Кьюз Приглашённые актёры …   Википедия

  • Недвиговка (Мясниковский район) — Хутор Недвиговка Страна РоссияРоссия …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»