AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Automatische Problem-Erkennung

Ein Thema von Incocnito · begonnen am 26. Okt 2023 · letzter Beitrag vom 2. Nov 2023
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von jaenicke
jaenicke

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

AW: Automatische Problem-Erkennung

  Alt 26. Okt 2023, 10:58
Noch schöner:
Delphi-Quellcode:
begin
  FMyVal := '42';
  DoMore;
end;

procedure TWhatever.DoMore();
begin
  DoSomeThing(FMyVal);
end;

procedure TWhatever.DoSomething(const sVal : String);
begin
  FMyVal := '';
  FMyVal := '43';
  if (sVal = '43') then ShowMessage('Aua');
end;
Da der Speicherbereich erneut verwendet wird, ist in sVal der neue Wert direkt drin.

Das ist wirklich eine schöne Falle, die man nicht sofort sieht.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
745 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Automatische Problem-Erkennung

  Alt 26. Okt 2023, 12:53
Mir ist gerade ein bisschen Schwarz vor Augen geworden. Ein Glück dass ich kein Freund von Const-Parametern bin.
Ich werde trotzdem mal nach Const in Parametern suchen und mir alle Übergaben ansehen.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Automatische Problem-Erkennung

  Alt 26. Okt 2023, 13:38
ByReference-Parameter.

Ich lasse zu oft gern das CONST weg, weil es hässlich aussieht.
Ich hab solche Probleme also fast nie.

Ohne CONST gibt es im String ein RefCount+1, womit es in der Funktion zwei Variablen sind, beim := wird es ordentlich aufgelöst und somit wird nichts überschrieben.

Ein const Val: Integer hätte dieses Problem nicht, da es in den Speicher eines Registers passt und somit keine Referenz genutzt wird (obwohl man denkt das befohlen zu haben),
aber darum hat Emba vor 'nem Weilchen das const [Ref] Val: Integer erfunden, damit man auch dort dieses Fehlerchen bewundern darf.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Okt 2023 um 13:43 Uhr)
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
233 Beiträge
 
#4

AW: Automatische Problem-Erkennung

  Alt 26. Okt 2023, 13:47
... Ein const Val: Integer hätte dieses Problem nicht, da es in den Speicher eines Registers passt und somit keine Referenz genutzt wird (obwohl man denkt das befohlen zu haben),
aber darum hat Emba vor 'nem Weilchen das const [Ref] Val: Integer erfunden, damit man auch dort dieses Fehlerchen bewundern darf.
Wieder einer dieser Momente, wo nur Entwickler den Witz verstehen. 😉🤣
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.491 Beiträge
 
Delphi 12 Athens
 
#5

AW: Automatische Problem-Erkennung

  Alt 27. Okt 2023, 08:18
Eine ungünstige Klassenstruktur könnte solche Fehler begünstigen.
Wenn man sich des Problems bewusst ist, lässt sich das auch vermeiden:
Delphi-Quellcode:
procedure TWhatever.DoMore();
begin
  DoSomeThing(Copy(FMyVal));
end;
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
233 Beiträge
 
#6

AW: Automatische Problem-Erkennung

  Alt 26. Okt 2023, 13:30
...Da der Speicherbereich erneut verwendet wird, ist in sVal der neue Wert direkt drin.
Das ist wirklich eine schöne Falle, die man nicht sofort sieht.
Tatsächlich stand da nach dem Zuweisen des Leerstring zu der privaten Variable (also FMyVal in meinem Beispiel) auf einmal
"#10#13" random in der lokalen Variable (sVal) bei einem Testlauf. Also kann da bei solch einer Konstellation auch
Speichermüll drin stehen. Es muss nicht sein, dass er den aktuellen Wert der Hauptvariable übernimmt.
Das war bei dir vielleicht nur Zufall (oder es liegt daran, dass du eine andere Delphi-Version hast).

Liebe Grüße
Incocnito
  Mit Zitat antworten Zitat
skybibo

Registriert seit: 23. Jun 2008
Ort: NRW
28 Beiträge
 
Delphi 12 Athens
 
#7

AW: Automatische Problem-Erkennung

  Alt 28. Okt 2023, 19:08
Tatsächlich stand da nach dem Zuweisen des Leerstring zu der privaten Variable (also FMyVal in meinem Beispiel) auf einmal
"#10#13" random in der lokalen Variable (sVal) bei einem Testlauf. Also kann da bei solch einer Konstellation auch
Speichermüll drin stehen. Es muss nicht sein, dass er den aktuellen Wert der Hauptvariable übernimmt.
Das war bei dir vielleicht nur Zufall (oder es liegt daran, dass du eine andere Delphi-Version hast).

Liebe Grüße
Incocnito
Welche Delphi Version verwendest du?

Bei Delphi 7 kann ich das so produzieren, aber bei Delphi 11 kann ich hier kein Problem oder Absturz reproduzieren.
Bernd
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: Automatische Problem-Erkennung

  Alt 28. Okt 2023, 22:31
Nach Delphi 7 wurde der neue Speichermanager eingeführt. Ich hatte mit Delphi 11 getestet.

Abstürzen tut da nichts, aber der geänderte Speicherinhalt ist direkt zu sehen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
233 Beiträge
 
#9

AW: Automatische Problem-Erkennung

  Alt 30. Okt 2023, 07:22
...
Welche Delphi Version verwendest du?
Bei Delphi 7 kann ich das so produzieren, aber bei Delphi 11 kann ich hier kein Problem oder Absturz reproduzieren.
Ich nutze Delphi 10.4
  Mit Zitat antworten Zitat
skybibo

Registriert seit: 23. Jun 2008
Ort: NRW
28 Beiträge
 
Delphi 12 Athens
 
#10

AW: Automatische Problem-Erkennung

  Alt 30. Okt 2023, 19:34
Ich habe mal eine komplette Unit erstellt. In dieser Variante bekomme ich auch mit Delphi 11 einen EInvalidPointer Fehler. Was genau Delphi in der Procedure "DoSomething" macht ist für mich noch nicht so richtig nachvollziehbar. Ob diese Kombination in einem normalen Programm so vorkommen kann weiß ich nicht. Bei mir hatte ich dies noch nicht. Ich sehe hier auch bei Delphi selbst keinen Fehler. Wenn ich Unsinn programmiere, dann bekomme ich auch ein Unsinniges Ergebnis.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FMyVal: String;
  public
    procedure DoMore;
    procedure DoSomething(const sVal:String);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DoMore;
  var
    Val: String;
begin
  DoSomething(FMyVal);
end;

procedure TForm1.DoSomething(const sVal: String);
  var
    Val: String;
begin
  FMyVal := ''; //ohne diese Zeile gibt es keinen Fehler
  Val := sVal;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FMyVal := 'XXX'; //ohne diese Zeile gibt es keinen Fehler
  DoMore;
end;

end.
Bernd
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:06 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