AGB  ·  Datenschutz  ·  Impressum  







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

StringReplace verursacht AV

Ein Thema von EWeiss · begonnen am 7. Okt 2016 · letzter Beitrag vom 11. Okt 2016
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: StringReplace verursacht AV

  Alt 10. Okt 2016, 12:22
Kann es sein das StringReplace intern einen Fehler verursacht.
Also die Funktion selbst?

Folgendes Szenario.

CTRL_STATE = (Normal, Focus, Down, Disabled);
TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);

CTRL_STATE = 0..3
TReplaceFlags = 0..1

Ich erstelle mir jetzt einen ImageBuffer.

Delphi-Quellcode:
  SetLength(TmpHdc, 3);
  SetLength(hBmp, 3);
  SetLength(hBmpOld, 3);

  Wnd := GetDesktopWindow;
  DC := GetWindowDC(Wnd);

  for IntI := 0 to 3 do
  begin
0..3 ist das jeweilige Bitmap im ImageStrip. (Ich hoffe ihr wist was gemeint ist.)
0 wäre dann normal
1 Focus usw..

Eigentlich korrekt.

Aber wenn ich nun das Programm starte bekomme ich in der Zeile
  Caption := StringReplace(Caption, '&', '', [rfReplaceAll]);

einen AV das seltsame ist in einer ganz anderen Unit die eigentlich nichts mit dieser zu tun hat wo der ImageBuffer erstellt wird.
Die Procedure für den Buffer ist privat deklariert in einer eigenen Classe außerhalb da wo StringReplace den Fehler verursacht.

Ändere ich nun die länge also erhöhe sie mit 1
Delphi-Quellcode:
SetLength(TmpHdc, 4);
SetLength(hBmp, 4);
SetLength(hBmpOld, 4);
Ist das Problem verschwunden.. Warum?
Was hat StringReplace mit der Dimension meines Array zu tun das eigentlich korrekt sein sollte.
Ich habe ja keine 5 sondern nur 4 Bilder aneinanderhängend im ImageStrip.
also 0..3

Also! Was hat StringReplace mit der Dimension meines Array zu tun? Das auch noch Privat in einer ganz anderen Classe definiert ist.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: StringReplace verursacht AV

  Alt 10. Okt 2016, 12:33
for IntI := 0 to 3 do = 4

Klassischer Buffer-Overflow.

SetLength etc. erwartet die Größe des Array und nicht den höchsten Index. Also entweder SetLength(3) und die Schleife von 0..2 oder SetLength(4) und die Schleife von 0..3.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: StringReplace verursacht AV

  Alt 10. Okt 2016, 12:45
for IntI := 0 to 3 do = 4

Klassischer Buffer-Overflow.

SetLength etc. erwartet die Größe des Array und nicht den höchsten Index. Also entweder SetLength(3) und die Schleife von 0..2 oder SetLength(4) und die Schleife von 0..3.
Argg.. Ja du hast recht.
Erklärt aber nicht warum der Fehler in einer anderen Unit bei StringReplace auftritt was eigentlich mit dem Problem nichts zu tun hat.
Und das direkt zweimal einmal in der Form und einmal in einer anderen Unit also überall da wo StringReplace Verwendung findet.

Die Form ist kein Teil meiner DLL.. Sehr komisch oder?

gruss
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: StringReplace verursacht AV

  Alt 10. Okt 2016, 13:11
Die Form ist kein Teil meiner DLL.. Sehr komisch oder?
Weil die ganze Anwendung EINEN gemeinsamen (vituellen) Arbeitsspeicher besitzt und du demnach "irgendwas" in dem Speicher überschreiben kannst, auch was nicht zu deiner DLL gehört.

Damals, als noch ALLE Programme und Windows sich den gesamten Arbeitsspeicher teilten und es nicht getrennt war, da hättest du statt Deinem auch ein fremdes Programm oder gleich das Windows zerschrotten können.


PS: Bei solchen Fehlern kann man sich in den Projektoptionen auch mal die Überlauf- und Bereichsprüfungen aktivieren.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Okt 2016 um 13:13 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: StringReplace verursacht AV

  Alt 10. Okt 2016, 13:20
Die Form ist kein Teil meiner DLL.. Sehr komisch oder?
Weil die ganze Anwendung EINEN gemeinsamen (vituellen) Arbeitsspeicher besitzt und du demnach "irgendwas" in dem Speicher überschreiben kannst, auch was nicht zu deiner DLL gehört.

Damals, als noch ALLE Programme und Windows sich den gesamten Arbeitsspeicher teilten und es nicht getrennt war, da hättest du statt Deinem auch ein fremdes Programm oder gleich das Windows zerschrotten können.


PS: Bei solchen Fehlern kann man sich in den Projektoptionen auch mal die Überlauf- und Bereichsprüfungen aktivieren.
Jup hast recht
Bei StripHotkey trat das Problem aber nicht auf. Warum also bei StringReplace.. LOL

Wie gesagt schon seltsam.

gruss
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: StringReplace verursacht AV

  Alt 10. Okt 2016, 14:21
Code:
Wie gesagt schon seltsam.
Nein ist nicht seltsam. Du schreibst in Speicher herum der Dir nicht gehört.
Da kann alles passieren.
Fritz Westermann
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: StringReplace verursacht AV

  Alt 10. Okt 2016, 14:29
Code:
Wie gesagt schon seltsam.
Nein ist nicht seltsam. Du schreibst in Speicher herum der Dir nicht gehört.
Da kann alles passieren.
Erklärt aber immer noch nicht warum es ausgerechnet nur bei StringReplace passiert.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#8

AW: StringReplace verursacht AV

  Alt 10. Okt 2016, 17:46
Der Unterschied zwischen StringReplace und StripHotKey ist, daß StripHotKey ausschließlich mit Delete arbeitet und dabei den String im selben Speicherbereich hält, während StringReplace einen neuen String zurück gibt. Danach wird dann der alte String freigegeben - was auch problemlos funktioniert, wenn es denn ein richtiger String ist und nicht per string-Cast aus einem PWideChar entstanden ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: StringReplace verursacht AV

  Alt 10. Okt 2016, 17:53
Der Unterschied zwischen StringReplace und StripHotKey ist, daß StripHotKey ausschließlich mit Delete arbeitet und dabei den String im selben Speicherbereich hält, während StringReplace einen neuen String zurück gibt. Danach wird dann der alte String freigegeben - was auch problemlos funktioniert, wenn es denn ein richtiger String ist und nicht per string-Cast aus einem PWideChar entstanden ist.
Ist ein WideString.
Das hätte das Problem nicht ausgelöst.

Aber gut ich weis nun bescheid das es kein StringReplace Problem ist.
Danke.

gruss
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: StringReplace verursacht AV

  Alt 10. Okt 2016, 17:54
wenn es denn ein richtiger String ist und nicht per string-Cast aus einem PWideChar entstanden ist.
Das must Du jetzt aber erklären. Wann führt ein String(pchar) zu einem Problem?
Fritz Westermann
  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 23:25 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 by Thomas Breitkreuz