AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Speichermüll bei Base64Encode auf einem PC
Thema durchsuchen
Ansicht
Themen-Optionen

Speichermüll bei Base64Encode auf einem PC

Ein Thema von stalkingwolf · begonnen am 31. Jan 2022 · letzter Beitrag vom 31. Jan 2022
Antwort Antwort
Seite 1 von 2  1 2      
stalkingwolf

Registriert seit: 6. Mai 2011
518 Beiträge
 
#1

Speichermüll bei Base64Encode auf einem PC

  Alt 31. Jan 2022, 08:48
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Speichermüll bei Base64Encode auf einem PC

  Alt 31. Jan 2022, 08:56
Hast Du ein Demoprojekt mit Daten?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
518 Beiträge
 
#3

AW: Speichermüll bei Base64Encode auf einem PC

  Alt 31. Jan 2022, 09:25
Anbei ein ganz simples Beispiel.
Dazu 2 exe Dateien von 2 verschiedenen Delphi XE4 Versionen.
Angehängte Dateien
Dateityp: zip testbase64encode.zip (1,73 MB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Speichermüll bei Base64Encode auf einem PC

  Alt 31. Jan 2022, 09:36
Compilers.inc fehlt in dem zip file. Ich habe die mal entfernt und stattdessen {$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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all

Geändert von Union (31. Jan 2022 um 09:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Speichermüll bei Base64Encode auf einem PC

  Alt 31. Jan 2022, 09:52
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Speichermüll bei Base64Encode auf einem PC

  Alt 31. Jan 2022, 09:54
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
518 Beiträge
 
#7

AW: Speichermüll bei Base64Encode auf einem PC

  Alt 31. Jan 2022, 10:17
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.
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
103 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Speichermüll bei Base64Encode auf einem PC

  Alt 31. Jan 2022, 10:33
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
Achim
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
518 Beiträge
 
#9

AW: Speichermüll bei Base64Encode auf einem PC

  Alt 31. Jan 2022, 10:52
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Speichermüll bei Base64Encode auf einem PC

  Alt 31. Jan 2022, 12:06
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 05:07 Uhr.
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