![]() |
Re: Handling von Fehlern, Warnungen und Hints
Globale Variablen werden schon immer mit 0 initialisiert.
Das ist ein dokumentiertes Verhalten und wird sicher nicht in Zukunft geändert. |
Re: Handling von Fehlern, Warnungen und Hints
"Result" ist aber keine globale Variable und um die geht es hier ;-)
|
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
in der Delphi Hilfe steht: Wenn Sie eine globale Variable nicht explizit initialisieren, wird sie vom Compiler zunächst auf 0 gesetzt. Lokale Variablen können bei der Deklaration nicht initialisiert werden. Sie sind nicht definiert, solange ihnen kein Wert zugewiesen wird. bei Funktionen gilt aber folgendes: in der Delphi Hilfe steht: Wenn die Ausführung einer Funktion beendet wird, bevor Result oder dem Funktionsnamen ein Wert zugewiesen wurde, ist der Rückgabewert der Funktion nicht definiert. Nach dieser Definition ist die Warnung OK. Das der Rückgabewert auch nur eine Variable ist, das steht auf einem anderen Blatt. ;-) |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Zitat:
Result steckt in dem AX Register, welches von der Funktion, angesprungen durch JMP, gesetzt wird. Somit ist der Rückgabewert definiert. Aber das kann Delphi natürlich nicht erkennen. Daher ist die Warnung semantisch falsch. |
Re: Handling von Fehlern, Warnungen und Hints
Hallo,
ich habe zwar in meinen normalen Programmen auch keine Warnungen, aber wenn jemand eine Idee hat wie man die Fehler abstellen kann die unter Struktur angezeigt werden. In einigen Programmen arbeite ich mit OLE-Automation späte Bindung. z.B. :
Delphi-Quellcode:
Dann werden unter Struktur 2 Fehler angezeigt:
OleInstanc.ActiveWorkbook.Close (saveChanges:=True, FileName:=strName);
Nicht deklarierter Bezeichner ‚saveChanges’ in Zeile 3040 Nicht deklarierter Bezeichner ‚FileName’ in Zeile 3040 Die kann weder mit HINT noch mit WARNINGS abstellen. Bis bald Chemiker |
Re: Handling von Fehlern, Warnungen und Hints
Ich glaube, wenn du ein neues Thema aufmachst mit deine Frage, dann können dir sicher mehr Leute helfen.
|
Re: Handling von Fehlern, Warnungen und Hints
Hallo Dezipaitor,
Zitat:
Bis bald Chemiker |
Re: Handling von Fehlern, Warnungen und Hints
Ah ok. Da hab ich die lange Tradition von Missverständnissen nur vortgeführt :mrgreen:
|
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Wenn der Compiler einen Fehler ausgibt, dann kann das Projekt nicht erstellt werden. Denn ErrorInsight einen Fehler ausgibt und der Compiler trotzdem kompilieren kann, dann liegt ErrorInsight falsch. :stupid: Das wäre dann einen Eintrag in dem BugTracking Tool von CodeGear wert. ( ![]() und hat mit den hier beschriebenen Problem eigentlich nichts zu tun. ps: Das soll übrigens nicht als Beschwerde, sondern als Erklärung verstanden werden. Ich freue mich über jeden konstruktiven Beitrag im Forum, und dazu zählt er auf jeden Fall. |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Sorry, aber wer zu faul ist, "Result :=" oder "Funktionsname :=" in seine Funktion zu schreiben, der hat nichts anderes als die entsprechende Warnung verdient. :evil: Ebenso gefährlich finde ich, das es überhaupt die Möglichkeit gibt, Warnungen für ein gesamtes Projekt zu deaktivieren. Nur weil die Warnungen im Moment unbegründet sind, darf man als verantwortungsvoller Entwickler nicht davon ausgehen, dass das auch zukünftig der Fall ist! Zitat:
Wer sagt Dir, das es nicht zukünftig einen (ge)wichtigen Grund für CodeGear gibt, das beschriebene Verhalten doch zu verändern? Mein Informatik-Lehrer hat uns förmlich eingeprügelt, anstellen von
Delphi-Quellcode:
nur
if a <= b then
Delphi-Quellcode:
zu schreiben, da man nie sicher sein kann, das sich das Verhalten des Compilers in diesem Punkt nicht doch irgendwann ändert.
if (a <= b) then
Sein Credo war damals: Im Leben ist nur eins sicher: Der Tod. |
Re: Handling von Fehlern, Warnungen und Hints
*schnipps* *meld*
Ah... Wieso nicht einfach bei Hack-Units die Warnungen ausschalten? Solche Units basieren eh auf dem Compiler und sind weder Plattform- noch Compilerunabhängig, weil auf bestimmte Registerkonventionen, Stackaufbau usw. gebaut wird. Man umgeht in so einem Hack sowieso (aus Performancegründen oder weil es anders einfach nicht geht) das Bestreben einer modernen Programmiersprache, schwere Fehler zu vermeiden und setzt sich bewusst der Gefahr aus, das System zu zerballern. |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
|
Re: Handling von Fehlern, Warnungen und Hints
Naja, es gibt einfach Situationen in denen man mit nem "dreckigen Hack" mehrere Stunden umständliche Programmierung sparen kann.
Man muss nur wirklich wissen, was man tut und sollte sich auf keinen Fall auf fremde Hacks verlassen (wenn man sie nicht versteht). |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
|
Re: Handling von Fehlern, Warnungen und Hints
Wenn ich da an
![]() |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Bei Hack-Units, die von privaten Projekten entwickelt und gepflegt werden, würde ich so eine Aussage jedoch nicht sofort und ohne weiteres Unterschreiben. |
Re: Handling von Fehlern, Warnungen und Hints
Es geht ja garnicht darum, dass du fremde Units verwendest, sondern ggf. auch darum, dass du evtl selbst solche Hacks verwendest.
|
Re: Handling von Fehlern, Warnungen und Hints
Hallo ich habe mal den Sachverhalt von Dezipaitor in einem kompilierbaren Beispiel verdeutlicht.
Vorgehensweise zum selbst Testen:
Dei Kommentare im Code sollten alles erklären. mfg MaBuSE
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; // Hier werden die kompletten Funktionen definiert // Im implementation Teil darf dann die Definition etwas abgekürzt werden // (Z.B. darf der Rückgabetyp weggelassen werden.) function TestIt1: Pointer; function TestIt2: Pointer; function TestIt3: Pointer; function TestIt4: Pointer; implementation {$R *.dfm} var _TestIt1: Pointer; _TestIt2: Pointer; function TestIt1; begin // Der Variable _TestIt1 wird das Ergebnis zugewiesen, das hat nix mit Result // zu tun -> Result ist undefiniert und war bei meinen Tests nicht immer nil! _TestIt1 := @Form1; end; function TestIt2; begin // Der Variable _TestIt2 wird die Adresse der Funktion TestIt3 zugewiesen, // das hat nix mit Result zu tun -> Result ist noch undefiniert. _TestIt2 := @TestIt4; // Hier wird direkt in die TestIt4 Funktion gesprungen // -> also zu dem Result := @Form1 , danach wird nur ein RET duchgeführt. // Damit ist in dem EAX-Register zur Rückgabe der Wert @Form1 enthalten // und das Result wurde damit implizit gesetzt. asm JMP _TestIt2 end; end; // Hier funktioniert es nicht, da der Compiler erkennt, das TestIt4 das // EAX-Register verändert. Deshalb baut er beim Begin ein Push EBX ein // Das Result würde nun in EBX gespeichert und beim end; wieder in EAX // kopiert und der ursprüngliche EBX Wert wieder hergestellt (pop ebx). // Damit ist das Result wieder undefiniert ;-) function TestIt3; begin // ASM: 53 - push ebx TestIt4; // ASM: E806000000 - call TestIt4 end; // ASM: 8BC3 - mov eax,ebx // ASM: 5B - pop ebx // ASM: C3 -ret function TestIt4; begin Result := @Form1; // ASM: B8C80C4600 - mov eax, @Form1 end; // ASM: C3 - ret procedure TForm1.Button1Click(Sender: TObject); var p: Pointer; begin // Anmerkung die p := nil; Zeilen werden vom Compiler alle wegoptimiert. // Sie dienen nur der Übersichtlichkeit ;-) p := nil; p := TestIt1; // p ist undefiniert (kann, muß aber nicht nil sein) Memo1.Lines.Add('p = $'+ IntToHex(Integer(p),8)); Memo1.Lines.Add('_TestIt1 = $'+ IntToHex(Integer(_TestIt1),8)); p := nil; p := TestIt2; // in p steht das richtige Ergebnis Memo1.Lines.Add('p = $'+ IntToHex(Integer(p),8)); Memo1.Lines.Add('_TestIt2 = $'+ IntToHex(Integer(_TestIt2),8)); p := nil; p := TestIt3; // p ist undefiniert (kann, muß aber nicht nil sein) Memo1.Lines.Add('p = $'+ IntToHex(Integer(p),8)); p := nil; p := TestIt4; // in p steht das richtige Ergebnis Memo1.Lines.Add('p = $'+ IntToHex(Integer(p),8)); end; end. |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Delphi-Quellcode:
{$WARN W1035 OFF} // Warnung "W1035 Rückgabewert der Funktion <name> könnte undefiniert sein" unterdrücken.
|
Re: Handling von Fehlern, Warnungen und Hints
Pack an das Ende der Unit ein WARNINGS ON, dann dürfte es wieder stimmen.
Zitat:
|
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Das würde damit rückgängig gemacht werden :-( |
Re: Handling von Fehlern, Warnungen und Hints
Hallo,
meine Devise: Wenn Programme rausgehen an den Kunden, haben sie keine Hinweise und Warnungen mehr (ausser Plattform, da gibt's halt nur Windows). Bei Programmen für den eigenen Bedarf bleiben Hinweise und Warnungen nur dann über, wenn ich geprüft habe und ruhigen Gewissens entscheiden kann, für diesen Job ist das okay, das sind dann aber in der Regel nur irgendwelche Tools und Helferlein für den persönlichen Bedarf oder Spielereien für zu Hause. @MaBuSE, was machst Du denn da in Deinem Beispiel? Okay, ich schreibe in der Regel nur kaufmännische Software, da brauch ich sowas nicht und habe keine entsprechenden Probleme :wink: Stephan |
Re: Handling von Fehlern, Warnungen und Hints
Ich schalte in den Hack-Units am Anfang und nach der Uses-Klausel die Warnungen AUS und am Ende wieder EIN. Das funktioniert.
Das hier gepostete Beispiel ist mir zu konstruiert. Wer solche Konstrukte verwendet, darf die Warnungen getrost ignorieren, ihm ist eh nicht mehr zu helfen. |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
|
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Vermeintlich fehlerfreie Software gibt es genug und damit ärgern wir uns alle rum. Da müssen wir es nicht auch so machen. Es ist zwar schön, wenn man 'nen Servicevertrag hat, aber noch schöner ist es, wenn der nicht in Anspruch genommen werden muss, weil keine Probleme auftreten. Stephan |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
|
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
![]() ![]() Dezipaitor hatte ein Stück Sourcecode geposted, über das hier diskutiert wird. Ich habe nur versucht den Quelltext zu erklären. Bzw. zu zeigen warum mit dem
Delphi-Quellcode:
das Result (EAX) gesetzt wird.
asm JMP [_AddSecurityPackageW] end;
|
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Vielleicht hätte ich noch mal mein eigenes Tutorial lesen sollen, :stupid: dann hätte ich Dezipaitor auch selbst drauf hinweisen können. [equote="Im Tutorial ( ![]() Warnung: Rückgabewert der Funktion '<Element>' könnte undefiniert sein Diese Warnung wird angezeigt, wenn dem Rückgabewert einer Funktion nicht in jedem Codepfad ein Wert zugewiesen wurde. Die Funktion könnte auch ausgeführt werden, ohne dass der Rückgabewert zugewiesen wird. Die Lösung besteht darin, sicherzustellen, dass der Rückgabewert in jedem möglichen Quelltextpfad zugewiesen wird. [/equote] Danke |
Re: Handling von Fehlern, Warnungen und Hints
So langsam wird das Thema unübersichtlich und ich blicke es auch nicht mehr. Jetzt habe ich extra das Tutorial genau angeschaut, aber diese Direktive glatt übersehen. :wall:
Also Freiwillige vor! :duck: Die JEDI API gibt es seit Delphi 5 (und früher?), als man die Warnungen noch nicht abschalten konnte. Daher steht es nicht drin. |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Diese wird doch in jede Unit eingebunden. Dort gibt es ja auch die Prüfung welche Delphi Version gerade compiliert. Du musst also nur eine Zeile Code ändern. (Ich gehe jetzt von JCL aus, Dein JEDI API kenne ich nicht. ;-) ) |
Re: Handling von Fehlern, Warnungen und Hints
1. Die jedi.inc ist eine gemeinsame genutzte Datei für alle JEDI Projekte.
2. Sowas in die JediAPILib.inc einzubauen, würde die Warnung auch für Funktionen ausschalten, bei der die Warnung gerecht würde (z.b. selbst gebaute, wie GetProcedureAddress). |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
aber immer noch besser in der JediAPILib.inc als das die Benutzer der Lib auf die Idee kommen alle Warnungen komplett auszuschalten. |
Re: Handling von Fehlern, Warnungen und Hints
Da hast du natürlich auch wieder recht. :wink:
|
Re: Handling von Fehlern, Warnungen und Hints
Wie wild sind die einschlägigen Routinen denn im Code verteilt? Wenn sie einigermaßen in Blöcken beieinander stehen, würde es ja reichen, selbige mit {$WARN NO_RETVAL OFF}/{$WARN NO_RETVAL ON} einzurahmen. Funktioniert bei unseren "bösen" Stellen gut.
|
Re: Handling von Fehlern, Warnungen und Hints
Es gibt knapp 6500 solcher Funktionen. Wenn nicht jemand ungeheuer viel Zeit hat, müsste man sowas automatisieren.
|
Re: Handling von Fehlern, Warnungen und Hints
Jaein...
Man müsste an den Ecken, wo man sowieso gerade mal rumprogrammiert diese "Fehler" gleich mit korrigieren. Ok, es ist ein bissi mehr Arbeit dann, aber man baut dann wenigstens so nach und nach Altlasten aus und verbessert den Code... |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Dann hab ich in der JwaSspi und der JwaWinNT jeweils den Block mit diesen ganzen GetProcedureAddress/asm-Konstrukten mit WARN NO_RETVAL OFF/ON geklammert - und voila: keine Warnungen. Wenn du das Gleiche jetzt in den ~60 pas-Dateien in der jwapi machst, hast du doch das, was du willst? Uli. BTW: Die Packages in ...\jwapi2.2a\Packages\bds10 lassen sich nicht out of the box kompilieren. Dem Compiler fehlt ein $DEFINE wegen irgendwas mit ShellApi. |
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Zitat:
|
Re: Handling von Fehlern, Warnungen und Hints
Zitat:
Ich hab's übrigens nochmal mit dem Package JediApi_DynamicRelease probiert und mit geschätzt 10-15 OFF/ON-Blöcken einige Hundert Warnungen beseitigt, bevor ich keine Lust mehr hatte. Zitat:
BTW im BTW: :mrgreen: Das wäre doch ein Fall für - ich zitiere Mabuse - {$Message Fatal 'Bang. Tot.'} // Fehler, die Compilierung wird abgebrochen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:56 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