![]() |
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:
Ich stecke einen riesigen Integer in ein nur halb so großes Word. Niemanden kümmert es. Der Compiler (Win32) ist zufrieden. Warum?
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 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... |
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:
oder in den Projektoptionen aktivieren.
{$OVERFLOWCHECKS ON}
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:
|
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. |
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: |
AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
Zitat:
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ä. |
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.
|
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:
Zitat:
|
AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
Zitat:
:roll: |
AW: Warum keine Compilerwarnung bei offensichtlicher Bereichsüberschreitung
Zitat:
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. |
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 18:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz