Kompiliere Zeitfehler und nicht erreichbaren Code

8

Ok, beachte den folgenden Code:

%Vor%

Überraschenderweise verursacht dieser Code keine " Verwendung der nicht zugewiesenen lokalen Variablen" Hallo "" Kompilierzeitfehler. Es gibt einfach eine Warnung " Nicht erreichbarer Code erkannt ".

Auch wenn der Code nicht erreichbar ist, ist es immer noch ein Fehler bei der Kompilierung, ich denke, es ist richtig, einen Kompilierzeitfehler zu werfen. Wenn ich folgendes tun sollte:

%Vor%

Natürlich bekomme ich eine " 'Zeichenfolge" enthält keine Definition für' LMFAO 'und keine Erweiterungsmethode' LMFAO ', die ein erstes Argument vom Typ' string 'akzeptiert, könnte gefunden werden (fehlt eine Verwendung Direktive oder eine Assemblyreferenz?) "Kompilierzeitfehler.

Warum ist das bei der Verwendung einer nicht zugewiesenen Variablen nicht dasselbe?

BEARBEITEN Die Variable const wurde so geändert, dass sie weniger störend wirkt. Ich denke, vielen fehlt der Punkt der Frage, der davon abhängt, in welchem ​​Fall Kompilierzeitfehler Vorrang vor unerreichbarem Code haben.

    
InBetween 23.02.2012, 16:05
quelle

3 Antworten

12

James Michael Hares Antwort gibt die de jure Erklärung: die lokale Variable ist definitiv zugewiesen, weil der Code nicht erreichbar ist und alle lokalen Variablen definitiv in nicht erreichbaren Code zugewiesen sind. Anders ausgedrückt: Das Programm ist nur ein Fehler, wenn es möglich ist, den Zustand der nicht initialisierten lokalen Variablen zu beobachten . In Ihrem Programm gibt es keine Möglichkeit, das lokale zu beobachten, und deshalb ist es kein Fehler.

Nun bemerke ich, dass der Compiler nicht unendlich clever sein muss. Zum Beispiel:

%Vor%

Sie wissen, und ich weiß, dass die letzte Zeile der Methode nicht erreichbar ist, aber der Compiler weiß das nicht, weil der Erreichbarkeitsanalysator nicht weiß, dass Null die additive Identität von ganzen Zahlen ist. Der Compiler denkt, dass die letzte Zeile erreichbar sein könnte, und gibt so einen Fehler.

Weitere Informationen zu Aspekten der Gestaltung von Erreichbarkeits- und Definit-Assignment-Analysatoren in Programmiersprachen finden Sie in meinen Artikeln zum Thema:

Ссылка

Ссылка

Ich stelle jedoch fest, dass niemand die tiefere Frage beantwortet hat: warum sollte der Fehler in unerreichbarem Code unterdrückt werden? Wie Sie bemerken, geben wir andere semantische Analysefehler in unerreichbarem Code.

Um die Vor- und Nachteile dieser Entscheidung zu berücksichtigen, müssen Sie darüber nachdenken, warum jemand überhaupt nicht erreichbaren Code hat. Entweder ist es absichtlich unerreichbar oder unabsichtlich unerreichbar.

Wenn es unbeabsichtigt unerreichbar ist, dann enthält das Programm einen Fehler. Die Warnung weist bereits auf das Hauptproblem hin: Der Code ist nicht erreichbar. Es gibt etwas , das mit dem Kontrollfluss der Methode nicht stimmt, wenn Code nicht erreichbar ist. Die Chancen stehen gut, dass der Entwickler den Kontrollfluss der Methode ernsthaft ändern muss. Jede lokale Variablenanalyse, die wir für den nicht erreichbaren Code durchführen, ist wahrscheinlich ein irreführendes Geräusch. Lassen Sie den Entwickler den Code so korrigieren, dass alles erreichbar ist, und dann machen wir eine Analyse des nun erreichbaren Codes für Fehler im Zusammenhang mit dem Kontrollfluss.

Wenn der unerreichbare Code unerreichbar ist, weil der Entwickler beabsichtigt , dass er unerreichbar ist, dann sind die Chancen gut, dass sie so etwas tun:

%Vor%

Sollte Frob(y) ein Fehler in diesem Programm sein?

    
Eric Lippert 23.02.2012, 18:08
quelle
1

Wenn der Compiler erkennt, dass Code nicht erreichbar ist, erzeugt er keinen Code dafür - und daher gibt es kein Problem.

Wenn Sie diese return -Zeile herausnehmen, wird die letzte Zeile wieder erreichbar, der Compiler erzeugt Code dafür und wird Ihnen sagen, dass ein Problem damit besteht.

    
Roy Dictus 23.02.2012 16:16
quelle

Tags und Links