AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE IDE: Compiler Einstellung für nicht initialisierte Variablen
Thema durchsuchen
Ansicht
Themen-Optionen

IDE: Compiler Einstellung für nicht initialisierte Variablen

Ein Thema von Athris · begonnen am 10. Sep 2021 · letzter Beitrag vom 10. Sep 2021
Antwort Antwort
Athris

Registriert seit: 18. Nov 2014
28 Beiträge
 
Delphi XE2 Professional
 
#1

AW: IDE: Compiler Einstellung für nicht initialisierte Variablen

  Alt 10. Sep 2021, 10:04
Der Quellcode ist tatsächlich sehr alt (bestimmt über 15 Jahre). Das die Qualität des Codes eher mangelhaft ist, ist mir bewusst

Die Frage ist nur warum XE2 niemals eine Zugriffsverletzung anzeigt (ist halt nie aufgefallen) und Delphi 10.4 immer eine Zugriffsverletzung anzeigt.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.910 Beiträge
 
Delphi 12 Athens
 
#2

AW: IDE: Compiler Einstellung für nicht initialisierte Variablen

  Alt 10. Sep 2021, 10:09
Die Frage ist nur warum XE2 niemals eine Zugriffsverletzung anzeigt (ist halt nie aufgefallen) und Delphi 10.4 immer eine Zugriffsverletzung anzeigt.
Das ist eben Zufall. Da steht nun zufällig etwas im Speicher, was beim Zugriff eine nicht zugreifbare Adresse ist. Du hattest vorher schlicht Glück, dass in der Variablen ein Wert stand, von dem aus eine Adresse berechnet werden konnte, an der ein Zugriff möglich war. Und dass an der Stelle dann etwas war, das man in dem String nicht sehen konnte / nicht bemerkt wurde.

Wichtig ist vor allem, dass du keine Compilermeldungen (Variable nicht initialisiert, ...) ignorierst, wenn du die Anwendung erzeugst. Damit hast du schon viele mögliche Fehlerquellen vermieden.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#3

AW: IDE: Compiler Einstellung für nicht initialisierte Variablen

  Alt 10. Sep 2021, 10:11
Es kommt drauf an, was da im Speicher/Stack steht.

Wenn da irgendwas stand, was als Pointer interpregiert und mit einem kleinen Offset versehen (zu FHandle) auf reservierten Speicher zeigt, dann kann das als HWND für WM_GETTEXT genommen werden.
Selbst wenn dieses "HWND" ungültig ist, würde es keinen Fehler geben, da Delphi davon das Result/GetLastError nicht auswertet und somit nur einen Leertext liefert.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Athris

Registriert seit: 18. Nov 2014
28 Beiträge
 
Delphi XE2 Professional
 
#4

AW: IDE: Compiler Einstellung für nicht initialisierte Variablen

  Alt 10. Sep 2021, 10:24
Danke für eure Antworten, doch bleibe ich etwas skeptisch bei der Antwort "Es ist zufall".

Das kann kein Zufall sein. Der Programmabschnitt ist jahrelang bei über 150 Kunden im Einsatz gewesen. Auch bei uns selbst wurde der Abschnitt diverse mal aufgerufen und es kam NIE zu einer Zugriffsverletzung.

Beim neuen Delphi 10.4 kommt die Zugriffsverletzung jedes mal. Immer. Das kann doch kein Zufall sein.

Oder hat es etwas damit zu tun das wir bei XE2 immer nur in 32 bit kompiliert haben und nun beim 10.4 in 64bit kompilieren?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#5

AW: IDE: Compiler Einstellung für nicht initialisierte Variablen

  Alt 10. Sep 2021, 10:29
Für lokale Variablen und Result wird Speicher nicht initialisiert. (Ausnahme sind gemanagte Typen wie String oder Interface, wo Delphi von sich aus das Speichermanagement sicherstellen muß)

Sie haben also den Wert, welcher ein vorhergehender Funktionsaufruf dort auf dem Stack hinterlassen hatte.


Es "kann" immer der selbe Wert sein, wenn die Aufrufe in gleicher Reihenfolge sind, aber es muß nicht und somit ist der Wert "unbestimmt", also zufällig.
Und wenn ein neuer Compiler anderen Code erzeugt oder Variablen anders im Speicher ablegt, dann ist es nunmal plötzlich anders.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Sep 2021 um 10:36 Uhr)
  Mit Zitat antworten Zitat
Athris

Registriert seit: 18. Nov 2014
28 Beiträge
 
Delphi XE2 Professional
 
#6

AW: IDE: Compiler Einstellung für nicht initialisierte Variablen

  Alt 10. Sep 2021, 10:32
Mit der Antwort kann ich leben, vielen Dank!
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: IDE: Compiler Einstellung für nicht initialisierte Variablen

  Alt 10. Sep 2021, 10:48
Ich kann nichts mehr hinzufügen, genauso wie erklärt ist es.

Ich kann nur aus eigener Erfahrung berichten dass wir exakt den Fall auch hatten- Eine alte, nicht mehr gewartete Delphi-DLL mit so vielen Warnmeldungen über nicht initialisierte Variablen dass da auch keiner mehr geschaut hat. Lief viele Jahre lang.

Als sie eines Tages durch einen neueren Delphi-Compiler gejagt wurde gingen vereinzelte Dinge nicht mehr, keiner wusste weshalb. Lösung war exakt das gleiche: Eine nicht initialisierte Variable führte zu einer Zugriffsverletzung, und früher hat es bei einem älteren Compiler grade so gepasst dass nichts in sich zusammenbrach...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#8

AW: IDE: Compiler Einstellung für nicht initialisierte Variablen

  Alt 10. Sep 2021, 10:54
Jo, 64 Bit ist immer mit StackFrames und es gibt auch nur noch eine Calling-Convension (sieht witziger Weise fast wie die von Delphi aus ),

aber es macht die Sache mit dem Stack viel einfacher.


Und zusätzlich seit 'ner kurzen Weile auch direkt eine WinAPI, zum lesen des Stacks und der Debuginfos.
Nur blöd, dass Delphi seine eigenen Debuginfos hat und man nicht aktivieren kann, dass man auch die "normalen" mit im Programm einkompiliert haben möchte.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Sep 2021 um 10:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.910 Beiträge
 
Delphi 12 Athens
 
#9

AW: IDE: Compiler Einstellung für nicht initialisierte Variablen

  Alt 10. Sep 2021, 10:46
Oder hat es etwas damit zu tun das wir bei XE2 immer nur in 32 bit kompiliert haben und nun beim 10.4 in 64bit kompilieren?
Da gibt es diverse Unterschiede. Einer davon, der für die Exceptionbehandlung wichtig ist:
Bei 32-Bit Programmen ist der Stackframe nicht fest. Deshalb ist es nicht so einfach möglich, nach einem Fehler einen sauberen Stacktrace aufzubauen.
Bei 64-Bit Programmen gibt es dafür eindeutige Vorgaben, so dass man in der Regel auch zuverlässige Stacktraces bekommt.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 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