<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Toter_Code</id>
	<title>Toter Code - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Toter_Code"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Toter_Code&amp;action=history"/>
	<updated>2026-05-21T22:30:29Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Toter_Code&amp;diff=2503692&amp;oldid=prev</id>
		<title>24.134.182.9: /* Gründe */ Kommafehler</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Toter_Code&amp;diff=2503692&amp;oldid=prev"/>
		<updated>2024-06-17T13:37:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Gründe: &lt;/span&gt; Kommafehler&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Toter Code&amp;#039;&amp;#039;&amp;#039; ({{EnS|dead code}}) ist in der [[Programmierung]] ein Begriff für Teile eines [[Computerprogramm]]s, „die an keiner Stelle im Programm verwendet werden“.&amp;lt;ref&amp;gt;Fernuni Hagen: [https://www.fernuni-hagen.de/imperia/md/content/ps/bachelorarbeit-pasenkova.pdf &amp;#039;&amp;#039;Ein Eclipse Plugin zum Aufspüren toter Codefragmente (…)&amp;#039;&amp;#039; ], PDF.&amp;lt;/ref&amp;gt; In erweitertem Sinn kann toter Code als Sonderform [[Redundanter Code|redundanten Codes]] (= „überflüssig“) betrachtet werden. Toter Code kann [[Anweisung (Programmierung)|Anweisungen/Befehle]] enthalten oder sich auf nicht verwendete [[Deklaration (Programmierung)|Datendeklarationen]] beziehen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Unerreichbarer Code&amp;#039;&amp;#039;&amp;#039; ist ein Programmteil, der durch keinen möglichen [[Kontrollfluss]] erreicht und deshalb erst gar nicht ausgeführt werden kann; auch hierbei wird mitunter von totem Code gesprochen.&lt;br /&gt;
&lt;br /&gt;
== Bedeutung ==&lt;br /&gt;
&lt;br /&gt;
Alle Formen toten Codes gelten aus verschiedenen Gründen als unerwünscht bzw. Mangel in der [[Softwarequalität]].&lt;br /&gt;
&lt;br /&gt;
Je nach Situation kann toter Code auch bewusst entstehen: Er soll beispielsweise einen vorläufigen oder ehemaligen Quelltextteil konservieren. Häufig liegt jedoch auch ein [[Programmfehler]] vor, dessen Entdeckung ein Ziel beim [[Softwaretest]] ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--Alter Text:--&amp;gt;Obwohl die Ergebnisse von totem Code nie verwendet werden, kann er [[Ausnahmebehandlung]]en auslösen oder globale Status beeinflussen. So kann eine Codeänderung die Programmausgabe verändern und unbeabsichtigte [[Programmfehler]] verursachen. In solchen Fällen ist es umstritten, ob weiterhin von totem Code gesprochen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
&amp;lt;syntaxhighlight line lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
int foo (int x) {&lt;br /&gt;
  int y = 100 / x;  // toter Code, da y nicht verwendet wird&lt;br /&gt;
  int z = x * x;    // redundanter Code zu 2 Zeilen weiter unten&lt;br /&gt;
  if (z &amp;gt;= 0) {     // unnoetiger Code, da die Abfrage immer wahr ist&lt;br /&gt;
    return x * x;   // redundanter Code zu 2 Zeilen weiter oben&lt;br /&gt;
  }&lt;br /&gt;
  return -1;        // unerreichbarer Code, da z immer &amp;gt;= 0 ist&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Toter Code – Im Beispiel wird in Zeile 2 die Zahl 100 durch &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; dividiert, das Ergebnis aber nie verwendet. Es handelt sich somit um toten Code. Ist allerdings x [[Null#Division|Null]], wird eine [[Ausnahmebehandlung|Ausnahme]] ausgelöst. Eine Entfernung dieses Codes führt somit zu einer Änderung der Funktionalität. Da Ausnahmen auszulösen aber niemals ein Teil der Funktionalität sein sollte, handelt es sich dabei um eine fehlerhafte Funktionalität, die zu entfernen ist.&lt;br /&gt;
* Redundanter Code – Im Beispiel wird &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; in Zeile 3 und 5 quadriert, ohne dass &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; dazwischen geändert wird. Das Ergebnis ist somit immer dasselbe, damit ist der Code redundant. &amp;lt;code&amp;gt;return z&amp;lt;/code&amp;gt; wäre somit in Zeile 5 angebracht.&lt;br /&gt;
* Unerreichbarer Code – Im Beispiel wird die Zeile 7 niemals erreicht, da die Abfrage &amp;lt;code style=&amp;quot;white-space: nowrap&amp;quot;&amp;gt;z &amp;gt;= 0&amp;lt;/code&amp;gt; in Zeile 4 immer wahr ist und in Zeile 5 die Methode verlassen wird. Somit handelt es sich bei Zeile 7 um unerreichbaren Code.&lt;br /&gt;
* Unnötiger Code – Nachdem die Abfrage &amp;lt;code&amp;gt;z &amp;gt;= 0&amp;lt;/code&amp;gt; in Zeile 4 immer wahr ist, ist sie sinnlos und kann ebenso entfernt werden. Unnötiger Code fällt zwar in keine der drei genannten Kategorien, wird aber landläufig oft auch als toter Code bezeichnet.&lt;br /&gt;
&lt;br /&gt;
== Gründe ==&lt;br /&gt;
Toter Code kann unter anderem entstehen durch&lt;br /&gt;
* Programmierfehler; bei (noch) unvollständigem Testen eines neuen oder veränderten Programms;&lt;br /&gt;
* einen neuen Fehler, der während der Korrektur eines Fehlers von einem Programmierer unbeabsichtigt hinzugefügt wurde und den unerreichbaren Code umgeht und während des Tests unentdeckt blieb;&lt;br /&gt;
* überflüssigen Code, den ein Programmierer nicht entfernen wollte, weil er mit funktionalem Code vermischt ist;&lt;br /&gt;
* überflüssigen Code, den ein Programmierer vergaß zu löschen;&lt;br /&gt;
* vorher sinnvollen Code, der nie mehr erreicht werden kann, weil die Eingabedaten sich verändert haben, so dass dieser Code nie wieder aufgerufen wird;&lt;br /&gt;
* komplexen überflüssigen Code, der absichtlich nicht entfernt, aber unerreichbar gemacht wurde, damit man ihn bei Bedarf „wiederbeleben“ kann;&lt;br /&gt;
* defektlokalisierende Konstrukte ([[Englische Sprache|Eng.]] &amp;#039;&amp;#039;debugging constructs&amp;#039;&amp;#039;) und Reste von Entwicklungscode, der noch aus dem Programm entfernt werden muss.&lt;br /&gt;
&lt;br /&gt;
In den letzten fünf Fällen ist der derzeit unerreichbare Code eine Altlast, d.&amp;amp;nbsp;h. Code, der früher sinnvoll war, aber nicht mehr benötigt wird.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Oft wird absichtlich toter Code erzeugt, um Ausgaben während der Programmentwicklung später zu deaktivieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
#define DEBUG  0&lt;br /&gt;
    int a = 3;&lt;br /&gt;
    // ...&lt;br /&gt;
    if (DEBUG)&lt;br /&gt;
        printf(&amp;quot;%d\n&amp;quot;, a);&lt;br /&gt;
    // ...&lt;br /&gt;
    return a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Während der Entwicklungsphase kann hier der Wert der Variablen &amp;#039;&amp;#039;a&amp;#039;&amp;#039; ausgegeben werden, falls das Makro &amp;#039;&amp;#039;DEBUG&amp;#039;&amp;#039; auf einen Wert ungleich Null (wahr) gesetzt wird. Wenn diese Kontrollausgabe nicht mehr benötigt wird, setzt man den Wert auf 0 und der Präprozessor erkennt und entfernt das nun tote Stück Code.&lt;br /&gt;
&lt;br /&gt;
== Analyse ==&lt;br /&gt;
Toten Code zu entdecken ist eine Form von [[Statische Code-Analyse|statischer Codeanalyse]] und benötigt eine genaue Analyse der [[Ablaufsteuerung]], um den Code unabhängig von den Variablen und anderen Laufzeitbedingungen zu finden. Mit Hilfe geeigneter Analysewerkzeuge kann ein Großteil toter und unerreichbarer Codeteile gefunden werden. In einigen Sprachen (wie z.&amp;amp;nbsp;B. [[Java (Programmiersprache)|Java]]) sind einige Formen von unerreichbarem Code ausdrücklich verboten und führen zu Kompilierungsfehlern.&lt;br /&gt;
&lt;br /&gt;
In großen Softwareprojekten ist es manchmal schwierig, toten Code zu erkennen und zu entfernen, insbesondere wenn ganze Module davon betroffen sind. Der Testgerüstbau kann solchen Code als noch „lebendig“ zeigen, und es kann sogar sein, dass aus vertraglichen Gründen der irrelevante Code geliefert werden muss.&amp;lt;ref&amp;gt;Douglas W. Jones: {{Webarchiv |url=http://catless.com/Risks/8.19.html#subj2 |text=&amp;#039;&amp;#039;Dead Code Maintenance&amp;#039;&amp;#039;. |wayback=20110708124114 |archiv-bot=}} Risks 8.19,  1. Februar 1989&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In einigen Fällen ist ein praktischer, nicht allzu aufwändiger Ansatz eine Kombination von einfachen Unerreichbarkeitskriterien und die Verwendung von einem [[Profiler (Programmierung)|Profiler]], um komplexe Fälle zu bearbeiten. Mit Profiling kann man nicht die Unerreichbarkeit von Code &amp;#039;&amp;#039;beweisen&amp;#039;&amp;#039;. Es ist aber eine gute [[Heuristik|heuristische]] Methode, um potenziell unerreichbaren Code zu entdecken. Wird einmal ein Codeteil als suspekt gesehen, können andere Methoden wie z.&amp;amp;nbsp;B. wirksamere Codeanalysewerkzeuge verwendet oder die Analyse von Hand durchgeführt werden. Dadurch kann man dann entscheiden, ob der gefundene Codeteil wirklich unerreichbar ist oder nicht.&lt;br /&gt;
&lt;br /&gt;
== {{Anker|Dead code elimination}}Optimierung ==&lt;br /&gt;
Seit Mitte der 1990er Jahre ist es Stand der Technik, dass Compiler und Linker unbenutzte Codeabschnitte erkennen und entfernen. Diese Optimierungstechnik bezeichnet man als {{lang|en|&amp;#039;&amp;#039;&amp;#039;dead code elimination&amp;#039;&amp;#039;&amp;#039;}}. Seit Mitte der 2010er Jahre haben äquivalente Techniken in IDEs (Anzeige von unbenutzten Code schon beim Editieren) und in Debugger (Code, der im aktuellen Durchlauf nicht mehr erreicht werden kann, wird beispielsweise abgedunkelt) Einzug gehalten.&lt;br /&gt;
&lt;br /&gt;
Die korrekte, redundanzfreie Umsetzung des oberen Beispiels würde folgendermaßen aussehen:&lt;br /&gt;
&amp;lt;syntaxhighlight line lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
int foo (int x) {&lt;br /&gt;
    return x*x;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Optimierung toten Codes funktioniert bei allen Arten toten Codes ähnlich, meist durch einfaches Entfernen der betreffenden Codestellen. Bei der Entfernung von totem Code ist besondere Vorsicht geboten, da toter Code Seiteneffekte haben kann, die aus dem Code selbst nicht erkennbar sind.&lt;br /&gt;
&lt;br /&gt;
[[Compiler]]optimierungen sind typischerweise konservative Ansätze, um toten oder unerreichbaren Code zu entfernen. Ist eine Mehrdeutigkeit bezüglich Programmverhalten vorhanden, wird der Code nicht entfernt. Die Optimierung während der Kompilierung wird &amp;#039;&amp;#039;Dead code elimination&amp;#039;&amp;#039; genannt. Sie kann für toten Code durch Variablenanalyse, für unerreichbaren Kode mit [[Datenflusskontrolle]] gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Der Code kann auch durch Transformationen, die der Compiler durchführt, &amp;#039;&amp;#039;unerreichbar&amp;#039;&amp;#039; werden, wie z.&amp;amp;nbsp;B. die sogenannte &amp;#039;&amp;#039;{{lang|en|[[common subexpression elimination]]}}&amp;#039;&amp;#039; (Entfernen gemeinsamer Teilausdrücke).&lt;br /&gt;
&lt;br /&gt;
In der Praxis hat die Ausgereiftheit der Analyse einen entscheidenden Einfluss auf den Anteil des gefundenen unerreichbaren Codes. Z.&amp;amp;nbsp;B. kann durch &amp;#039;&amp;#039;{{lang|en|constant folding}}&amp;#039;&amp;#039; und einfache Flussanalyse gezeigt werden, dass der Funktionsaufruf &amp;lt;code&amp;gt;foo()&amp;lt;/code&amp;gt; im folgenden Beispiel &amp;#039;&amp;#039;unerreichbar&amp;#039;&amp;#039; ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int i = 2 + 1;&lt;br /&gt;
&lt;br /&gt;
if (i == 4)&lt;br /&gt;
   foo();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einer vollständigen Analyse zur Kompilierungszeit sind jedoch theoretische Grenzen gesetzt, die eng mit der [[Entscheidbarkeit]]sproblematik der theoretischen Informatik verbunden sind.&lt;br /&gt;
&lt;br /&gt;
== Öffentliche Wahrnehmung ==&lt;br /&gt;
Im November 2010 veröffentlichte [[Microsoft]] eine neue Version des [[Internet Explorer]]s, der scheinbar alle anderen Browser in puncto [[JavaScript]]-Geschwindigkeit weit hinter sich ließ. Es stellte sich jedoch schon bald heraus, dass Microsoft eine spezielle Implementation der {{lang|en|&amp;#039;&amp;#039;dead code elimination&amp;#039;&amp;#039;}} nutzte, um sich an die Spitze eines bekannten JavaScript-[[Benchmark]]s zu katapultieren. In anderen Benchmarks waren die Resultate eher im Mittelfeld.&amp;lt;ref&amp;gt;Herbert Braun: [https://www.heise.de/newsticker/meldung/Browser-Debatte-Hat-Microsoft-geschummelt-1138758.html &amp;#039;&amp;#039;Browser-Debatte: Hat Microsoft geschummelt?&amp;#039;&amp;#039;] Heise Online, 18. November 2010.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* S. S. Muchnick: &amp;#039;&amp;#039;Advanced Compiler Design and Implementation&amp;#039;&amp;#039;. Morgan Kaufmann, 1997.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://java.net/projects/dcd/pages/Alternatives DCD Alternatives] Vergleich unterschiedlicher Werkzeuge zur statischen Code Analyse mit Funktionalitäten zum Auffinden toten Codes&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tools zum Auffinden toten/unerreichbaren Codes&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* [http://java.net/projects/dcd/pages/Home Dead Code Detector (DCD)]&lt;br /&gt;
* [[FindBugs]] [http://findbugs.sourceforge.net/ findbugs.sourceforge.net]&lt;br /&gt;
* [[Checkstyle]] [http://checkstyle.sourceforge.net/ checkstyle.sourceforge.net]&lt;br /&gt;
* [[PMD (Software)|PMD]] [https://pmd.github.io/ pmd.github.io]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;br /&gt;
[[Kategorie:Compileroptimierung]]&lt;/div&gt;</summary>
		<author><name>24.134.182.9</name></author>
	</entry>
</feed>