Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung (https://www.delphipraxis.net/181938-warum-keine-compilerwarnung-bei-offensichtlicher-bereichsueberschreitung.html)

Der schöne Günther 19. Sep 2014 09:23

Delphi-Version: XE5

Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
 
Ich dachte ja, ich wäre nun lange genug bei Delphi dabei, aber hiermit bin ich wieder auf die Nase gefallen:
Delphi-Quellcode:
program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
   System.SysUtils;
var
   myWord: Word;
   myInteger: Integer;
begin
   myInteger := myWord.MaxValue + 1;
   myWord := myInteger;
   WriteLn(myWord);
   WriteLn(myInteger);
   ReadLn;
end.
Ich stecke einen riesigen Integer in ein nur halb so großes Word. Niemanden kümmert es. Der Compiler (Win32) ist zufrieden. Warum?

Ich weiß dass ich Bereichs- und Überlaufprüfung anschalten und hoffen kann, dass es zur Laufzeit im Debugger auffällt. Aber warum gibt der Compiler mir keine Warnung? Bei impliziten Downcasts von String auf AnsiString tut er es ja auch...

himitsu 19. Sep 2014 09:39

AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
 
Der Compiler weiß doch nicht, ob da nicht zufällig später (zur Laufzeit) mal ein Wert drin ist, der da reinpassen könnte. :zwinker:

Delphi-Quellcode:
{$OVERFLOWCHECKS ON}
oder in den Projektoptionen aktivieren.

Der Delphi-Compiler merkt sich nicht den Inhalt von Variablen (aus Konstanten) und kann dann später auch nicht wissen ob es passt.
Drum kann der Compiler auch nicht Bescheid geben, wenn man vergißt ein Result zu initialisieren, welches vom Typ String, dyn. Array, Variant oder Interface ist. :wall:



Zitat:

Zitat von Der schöne Günther (Beitrag 1273104)
Bei impliziten Downcasts von String auf AnsiString tut er es ja auch...

Wobei der auch meckert, wenn du einen AnsiString an einen UnicodeString übergibst, auch wenn das doch wohl eindeutig passen würde. :lol:

Der schöne Günther 19. Sep 2014 09:46

AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
 
Verstehe ich nicht: Ein Integer ist doppelt so groß. In 50% aller möglichen Wertebelegungen lässt sich kein Downcast durchführen.

Deshalb erwarte ich eigentlich wenigstens eine Warnung bei einem impliziten Downcast mit Werteverlust.

himitsu 19. Sep 2014 09:51

AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
 
Sehr viele deklarieren ihre Variablen einfach nur blind als Integer, tun aber dann aber nur kleine Werte da rein, welche auch in ein Byte/Bit passen würden.
Dann würde der Cast zu 100% fuktionieren. :stupid:

p80286 19. Sep 2014 09:56

AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1273114)
Verstehe ich nicht: Ein Integer ist doppelt so groß. In 50% aller möglichen Wertebelegungen lässt sich kein Downcast durchführen.

Deshalb erwarte ich eigentlich wenigstens eine Warnung bei einem impliziten Downcast mit Werteverlust.

Wenn Du mit einem 40tonner vorfährst um mir eine Kiste Bier in meinen Fiat500 zu stellen würde ich zwar an Deiner geistigen Gesundheit zweifeln aber gehen tut das:wink:

Nur weil die Kapazität des einen Typen größer ist, heißt das noch lange nicht, das der Wert nicht passt. Und es soll Programmierer geben, die genau mit diesen Effekten arbeiten.

Gruß
K-H

p.s.
wieso eigentlich Bereichsüberschreitung?
Ist doch kein Array,String oä.

MEissing 19. Sep 2014 10:01

AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
 
Einfache Antwort: Wenn Delphi (der Delphi-Compiler) alles testen würde, was eventuell schief gehen könnte, dann wären die Übersetzungszeiten länger.

Win32.API 19. Sep 2014 10:06

AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
 
Dieser Thread zeigt mir mal wieder auf, wieso ich nicht länger mit Delphi programmiere. Auch wenn ich die Sprache nach wie vor sehr mag.

Zitat:

Zitat von himitsu (Beitrag 1273116)
Sehr viele deklarieren ihre Variablen einfach nur blind als Integer, tun aber dann aber nur kleine Werte da rein, welche auch in ein Byte/Bit passen würden.
Dann würde der Cast zu 100% fuktionieren. :stupid:

Wenn eine Programmiersprache von Unwissenheit der Benutzer ausgeht, ist dies IMHO ein sehr schlechtes Zeichen.


Zitat:

Zitat von p80286 (Beitrag 1273118)
Nur weil die Kapazität des einen Typen größer ist, heißt das noch lange nicht, das der Wert nicht passt. Und es soll Programmierer geben, die genau mit diesen Effekten arbeiten.

Darum gibt es ja explizite Casts, wenn dies erforderlich ist. Wird der Cast implizit vom Compiler durchgeführt ist dies schlicht und einfach ein Grund für eine Warnung mit möglichem Datenverlust. Punkt.

Zitat:

Zitat von MEissing (Beitrag 1273120)
Einfache Antwort: Wenn Delphi (der Delphi-Compiler) alles testen würde, was eventuell schief gehen könnte, dann wären die Übersetzungszeiten länger.

LOL, das setzt dem Rest dieses Thread echt noch ein Sahnehäubchen auf.

Zoot 19. Sep 2014 10:17

AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
 
Zitat:

Zitat von Win32.API (Beitrag 1273121)
Dieser Thread zeigt mir mal wieder auf, wieso ich nicht länger mit Delphi programmiere.


:roll:

Mikkey 19. Sep 2014 10:22

AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1273114)
Verstehe ich nicht: Ein Integer ist doppelt so groß. In 50% aller möglichen Wertebelegungen lässt sich kein Downcast durchführen.

In 99,9969482421875% aller möglichen Wertebelegungen lässt sich kein Downcast durchführen (nämlich, wenn das High-Order-Word nicht Null ist).

Ich würde auch erwarten, dass zumindest ein Hinweis in der Art "possible data loss" kommt. Den habe ich auch in Delphi7 (und auch bei MS-Compilern) schon gesehen. Schließlich gehen hier nicht nur große Zahlen flöten, sondern auch ein evtl. vorhandenes Vorzeichen.

Der schöne Günther 19. Sep 2014 10:40

AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
 
Win32.API, meine Worte. :-/

Also ich hoffe bislang auch immer noch, dass ich nur einen dummen Schalter übersehe- In Java oder C# ist das mit Standardeinstellungen sogar ein beinharter Fehler der die Kompilierung abbricht!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr.
Seite 1 von 3  1 23      

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