Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Speichermüll bei Base64Encode auf einem PC (https://www.delphipraxis.net/209850-speichermuell-bei-base64encode-auf-einem-pc.html)

stalkingwolf 31. Jan 2022 08:48

Speichermüll bei Base64Encode auf einem PC
 
Moin,

wir haben das Problem das auf einem unserer Rechner beim übersetzen in Delphi XE4 bei Base64Encode Speichermüll entsteht.

Wir setzen die Base64Codec unit von Daniel Wischnewski ein.
Die Unit hat zwar schon paar Jahre auf dem Buckel, aber hat immer funktioniert.

Nun sind wir darüber gestolpert das bei einem Delphi XE4 wenn die Programm darin übersetzt werden die Funktion Base64Encode Speichermüll zurückgibt. D.h es kommt wirklich irgendwas aus dem Speicher zurück. Teilweise stehen dort Teile von SQL Code drin.
Die Funktion selber ist in Assembler programmiert. Wir sind auch soweit alle Compilereinstellungen durch und die sind identisch.

Bin gerade etwas überfragt und evtl hat einer eine Idee.

Gruß
Sven

Union 31. Jan 2022 08:56

AW: Speichermüll bei Base64Encode auf einem PC
 
Hast Du ein Demoprojekt mit Daten?

stalkingwolf 31. Jan 2022 09:25

AW: Speichermüll bei Base64Encode auf einem PC
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei ein ganz simples Beispiel.
Dazu 2 exe Dateien von 2 verschiedenen Delphi XE4 Versionen.

Union 31. Jan 2022 09:36

AW: Speichermüll bei Base64Encode auf einem PC
 
Compilers.inc fehlt in dem zip file. Ich habe die mal entfernt und stattdessen
Delphi-Quellcode:
{$define COMPILER_6_UP}
eingefügt. Das Codieren funktioniert ohne "Speichermüll", Allerdings mit 10.3. Wenn der Fehler nur beim Compilieren auf einem Rechner auftritt, könnte dort evtl. ein anderer Memory Manager verwendet worden sein? Vergleich doch mal die MAP-Files.

Uwe Raabe 31. Jan 2022 09:52

AW: Speichermüll bei Base64Encode auf einem PC
 
Nur eine erste Sichtkontrolle, aber StrAlloc gibt einen PChar zurück - unter XE4 also einen PWideChar. Keine Ahnung, ob das damit zu tun hat.
Delphi-Quellcode:
  // reserve memory
  OutText := PAnsiChar(StrAlloc(Succ(OutSize)));
  OutText[OutSize] := #0;

Union 31. Jan 2022 09:54

AW: Speichermüll bei Base64Encode auf einem PC
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1501460)
Nur eine erste Sichtkontrolle, ...

Laut Aussage des TE und der beigefügten Compilate tritt der Fehler nur auf, wenn auf einem bestimmten Rechner compiliert wird.

stalkingwolf 31. Jan 2022 10:17

AW: Speichermüll bei Base64Encode auf einem PC
 
das wirkt doch wie ein unicode Problem oder?
ich dachte es würde an NEXTGEN liegen aber das ist identisch.

die .MAP Dateien sehen für mich gleich aus. ein Diff bringt nichts, weil jede Zeile durch die Speicherangaben unterschiedlich ist.

Achim Kalwa 31. Jan 2022 10:33

AW: Speichermüll bei Base64Encode auf einem PC
 
Zitat:

Zitat von stalkingwolf (Beitrag 1501457)
Anbei ein ganz simples Beispiel.
Dazu 2 exe Dateien von 2 verschiedenen Delphi XE4 Versionen.

Die Ausgabe von "testBase64Encode_fehler.exe" sieht wie ein Unicode-Problem aus ;-)

Compiliert mit Delphi 11.0 scheint das Demo-Projekt erst einmal zu funktionieren, zumindest solange man sich bei der Eingabe auf den ASCII-Zeichensatz beschränkt. Sobald deutsche Umlaute oder Sonderzeichen ins Spiel kommen, funktioniert der Code in BASE64Codec.pas nicht mehr wie erwartet, denn base64encode() verwendet einen AnsiString. Ich bekomme an dieser Stelle auch eine Compiler-Warnung:
"W1058 Implicit string cast with potential data loss from 'TCaption' to 'AnsiString'".

Base64 dient ja in erster Linie dazu, 8-Bit-Binärdateien (Bytes) in eine Zeichenfolge zu verwandeln, die nur aus lesbaren, Codepage-unabhängigen ASCII-Zeichen besteht. Um einen String (also Text) in Base64 zu codieren, muss also zunächst der Text in Bytes umgewandelt werden; und genau dieser Schritt fehlt in der verwendeten Unit BASE64Codec.pas. Die Historie in BASE64Codec.pas legt nahe, dass die letzten Änderungen/Anpassungen 2004 erfolgt sind; seit Delphi 2009 ist String aber WideString und der Code müsst angepasst werden. Evtl. liest Daniel hier ja mit und kann evtl. eine modernisierte Version zur Verfügung stellen.

Andererseits gibt es seit Delphi 10 die RTL-Unit System.NetEncoding.pas; dort gibt es die Klasse TBase64Encoding, die per class function verwendet werden kann und korrekte Ergebnisse liefert:

Edit2.Text := TNetEncoding.Base64.Encode(Edit1.Text);

HTH
Achim

stalkingwolf 31. Jan 2022 10:52

AW: Speichermüll bei Base64Encode auf einem PC
 
Wir haben das Problem gefunden.
Mein Kollege hatte eine Kopie unseres Units Ordners und diese auch noch im Suchpfad und zwar über unserem Ordner.
Bitte keine weiteren Fragen :-)

Das ist nun aufgefallen weil ich für das Projekt hier die Base64Codec.pas in das gleich Verzeichnis gepackt habe. Er hatte dann das Projekt über GIT gezogen und danach trat der Fehler nicht mehr auf.

himitsu 31. Jan 2022 12:06

AW: Speichermüll bei Base64Encode auf einem PC
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1501460)
Nur eine erste Sichtkontrolle, aber StrAlloc gibt einen PChar zurück - unter XE4 also einen PWideChar. Keine Ahnung, ob das damit zu tun hat.
Delphi-Quellcode:
  // reserve memory
  OutText := PAnsiChar(StrAlloc(Succ(OutSize)));
  OutText[OutSize] := #0;

Sollte da nicht der Compiler eine Meldung werfen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz