Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Delphi "Sydney" (10.4) - mehr Compilerwarnungen und Hinweise (https://www.delphipraxis.net/204472-delphi-sydney-10-4-mehr-compilerwarnungen-und-hinweise.html)

Bernhard Geyer 30. Mai 2020 17:11

Delphi "Sydney" (10.4) - mehr Compilerwarnungen und Hinweise
 
Unser Anwendungen compilieren mittlerweile mit 10.4
Im Rahmen der Umstellung auch gemerkt das der Compiler auch einiges mehr an Warnungen und Hinweisen liefert.


Neu erkannt werden:
- Warnmeldung wenn eine FreeAndNil nit mit einem TObject ausgerufen wird (Speicheranforderung mit GetMem und Freigabe war mit FreeAndNil)
- Unnötig Variablenzuweisungen nach einem raise werden gemeldet. Diese Zeilen waren früher nötig da alte Compiler sonst fehlende Zuweisung als Warnung gemeldet haben
- Erkennung von "toden Code" nach einer exit-Anweisung. Auch in eigenen Code entdeckt :shock:. Wohl aus "braucht man den Code überhaupt noch. Mach ich mal ein exit rein ...
- Rückwärtige Erkennung von unnötigen Variablenzuweisungen.
So wurde an einer Stelle in Zeile x hingewiesen das Zuweisung nicht verwendet wurde.
Und dann auch noch das diese in Zeile x-1 das gleiche Problem vorliegt.

:thumb:

Bernhard Geyer 30. Mai 2020 18:03

AW: Delphi "Sydney" (10.4) - mehr Compilerwarnungen und Hinweise
 
Da wird doch wohl an einer Stelle zu viel Gewarnnt (bzw. Hinweis generiert).

Die Funktion IsWild aus der JVCL wird angemeckert.

Die repeat-Schleife mit den vielen continue und exit-Aufrufen verwirren wohl die neue dcc32-Exe.
Die letzte exit wird dann falsch interpretiert ...

Da mache ich wohl mal eine Jira-Eintrag auf: RSP-29274

himitsu 30. Mai 2020 18:41

AW: Delphi "Sydney" (10.4) - mehr Compilerwarnungen und Hinweise
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1465938)
- Erkennung von "toden Code" nach einer exit-Anweisung.

Hatte der Compiler den unnötigen Code vorher nicht auch schon weggelassen, so dass man es an den fehlenden blauen Punken sah? (weglassen ohne Meldung)

Bernhard Geyer 31. Mai 2020 10:48

AW: Delphi "Sydney" (10.4) - mehr Compilerwarnungen und Hinweise
 
Hier eine Vereinfachte Variante der IsWild-Funktion bei der klarer wird wieso hier der Compiler mit der Warnung irrt
Der Continue-Bereich ist hier das Problem, welche dafür sorgt das die zwei Zeilen
Delphi-Quellcode:
    Result := False;
    Exit;
auch übersprungen werden können.
Delphi-Quellcode:
function IsTest: Boolean;
var
  v1, v2: Integer;
begin
  v1 := 0;
  v2 := 5;
  repeat
    if v1 < v2 then
    begin
      Result := true;
      inc(v1);
      continue;
    end;

    Result := False;
    Exit;
  until v1 >= v2;

  if v1 > v2 then
    result := False;

  if v1 < v2 then
    result := False;
end;

Uwe Raabe 31. Mai 2020 11:16

AW: Delphi "Sydney" (10.4) - mehr Compilerwarnungen und Hinweise
 
So ganz kann ich da noch nicht folgen. Wenn ich das (ohne Test) richtig interpretiere, wird das
Delphi-Quellcode:
continue
für v1 = 0..4 aufgerufen, aber bei v1 = 5 schlägt das
Delphi-Quellcode:
Exit
mit einem
Delphi-Quellcode:
Result := False
zu.

Ich bekomme jetzt drei Warnungen, daß die drei anderen Zuweisungen an Result niemals benutzt werden. Aber das stimmt doch auch, oder?

Das
Delphi-Quellcode:
continue
springt zurück zum
Delphi-Quellcode:
repeat
ohne das
Delphi-Quellcode:
until
auszuwerten, dann landet man entweder wieder beim
Delphi-Quellcode:
continue
oder beim
Delphi-Quellcode:
Exit
.

Entweder landet man in einer endlosen
Delphi-Quellcode:
continue
-Schleife oder kommt zwingend zum
Delphi-Quellcode:
Exit
. In jedem Fall ist das
Delphi-Quellcode:
Result := true
vor dem
Delphi-Quellcode:
continue
obsolet.

Die beiden anderen Zuweisungen nach dem
Delphi-Quellcode:
until
sind ebenso überflüssig, da die Schleife nur durch das
Delphi-Quellcode:
Exit
verlassen werden kann.

Übersehe ich da was?

Bernhard Geyer 31. Mai 2020 11:43

AW: Delphi "Sydney" (10.4) - mehr Compilerwarnungen und Hinweise
 
Nein, Bei Continue wird die nächste Schleifendurchgang ausgeführt, nachdem die until-Condition geprüft wird.
ich glaube das ist ein allgemeines Mißverständnis wie das continue wirkt.
Einfach mal mit dem Debugger durchlaufen lassen. Er springt kurz an die until-Zeile bevor er beim repeat weiter macht.

Uwe Raabe 31. Mai 2020 12:29

AW: Delphi "Sydney" (10.4) - mehr Compilerwarnungen und Hinweise
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1465983)
Nein, Bei Continue wird die nächste Schleifendurchgang ausgeführt, nachdem die until-Condition geprüft wird.
ich glaube das ist ein allgemeines Mißverständnis wie das continue wirkt.
Einfach mal mit dem Debugger durchlaufen lassen. Er springt kurz an die until-Zeile bevor er beim repeat weiter macht.

Ja, die Dokumentation ist da wohl nicht so ganz eindeutig:
Zitat:

Continue fährt mit der nächsten Iteration fort.
Auch nicht in Englisch:
Zitat:

while Continue begins executing the next iteration of the sequence.
Das ist ganz besonders missverständlich, da etwas später steht:
Zitat:

The repeat statement executes its sequence of constituent statements continually, testing expression after each iteration.
Wenn
Delphi-Quellcode:
continue
wirklich die nächste Iteration starten würde, kann man das so interpretieren, daß die Überprüfung damit übersprungen wird. Dem ist aber offenbar nicht so.

Ich denke, das Verhalten sollte dort genauer beschrieben werden.

Bernhard Geyer 31. Mai 2020 16:55

AW: Delphi "Sydney" (10.4) - mehr Compilerwarnungen und Hinweise
 
Ich denke auch das die Doku hier das besser beschreiben sollte.

Wollte auch erst im Code den ich aus der RXLib übernommen hatte die letzten beiden Zeilen aufgrund der Meldung löschen.
Der Unit-Test hat mich eines besseren belehrt und danach hat ich erstmal den Debugger Zeilenweise durchlaufen lassen.
Dann war es mehr als eindeutig was genau abläuft.

Würde continue ohne Prüfung der Abbruchbedingung durchlaufen würde es in einigen Implementierung sporatische Deadlocks geben ...

Uwe Raabe 31. Mai 2020 17:15

AW: Delphi "Sydney" (10.4) - mehr Compilerwarnungen und Hinweise
 
Ich plädiere für eine Adaption der C++ Hilfe. Die ist da wesentlich präziser:
Zitat:

Die Anweisung continue wird innerhalb von Schleifen benutzt, um die Steuerung an das Ende der innersten Schleife zu übergeben, die zu dem Schleifenkonstrukt (z.B. for oder while) gehört. An diesem Punkt wird dann die Fortsetzungsbedingung der Schleife erneut geprüft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz