AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Delphi (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfung
Thema durchsuchen
Ansicht
Themen-Optionen

(Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfung

Ein Thema von QuickAndDirty · begonnen am 20. Jul 2020 · letzter Beitrag vom 24. Dez 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

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

AW: (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfu

  Alt 21. Jul 2020, 10:37
Zitat:
Delphi-Quellcode:
Result.FName := Trim(TEncoding.UTF8.GetString(LChars));
Result.FName := Utf8ToString(LChars);
OK, abgesehn vom TRIM sollte, UTF8.GetString und Utf8ToString doch eigentlich gleiche Ergebnisse liefern,
und wenn sie das nicht tun, dann sollte man besser auch gleich mit prüfen was dort schief läuft.


Ansonsten:

Warum gibt die Funktion einen Pointer zurück, anstatt des Records?
Gerade hier ist das eine Liebslingsstelle für Speicherlecks und dazumal es absolot sinnlos ist, weil immer was zurückgegeben wird im Delphi (XE) ist/war das auch noch ein Record.

Und an ein paar gewissen Stellen würde ich noch eine Bereichsprüfung einfügen.
Zitat:
ExpDayOfWeek := CReDoW[ADoW];
entweder die {$RANGECHECKS ON} aktiv,
oder mit Fehlermelduing if ADoW > 6 then raise ...
oder zumindestens wildlaufende Speicherzugriffe abfangen ExpDayOfWeek := CReDoW[ADoW mod 7]; , was hier möglich ist, also einfach den Überstand in die nachfolgenden Wochen verschieben.

Und sonst erstmal noch nicht weiter gesucht. (war so das "Schlimmste", was gleich auf den ersten Blick brutal ins Auge stach)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (21. Jul 2020 um 10:40 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.003 Beiträge
 
Delphi 12 Athens
 
#2

AW: (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfu

  Alt 21. Jul 2020, 14:15
@himitsu
Ich habe wirklich nur 3 Zeilen in dem Listing verändert. "Korrektur" steht neben dran. Der rest ist original code aus dateutils.pas.
Ich habe quasi in der Funktion aus der Dateutils.pas einfach 3 stellen gepatcht.
Ich wollte möglichst wenig EmbarcaderoCode anfassen um mein Problem zu lösen.

@Rollo62
Ich habe jetzt mal die Funktion angesehen die den Fehler macht.
Liegst in der "System.pas"
Leider bin ich nicht gut bewandert in "codierung". Ich bin darauf angewiesen das die Convertierungsmethoden funktionieren.
UTF8ToUnicode gibt es in etlichen überladenen methoden...


unit System.pas
Delphi-Quellcode:
function UTF8ToString(const S: array of Byte): string; overload;
var
  Dest: array[0..511] of Char;
begin
  SetString(Result, Dest, UTF8ToUnicode(Dest, Length(Dest), _PAnsiChr(@S[1]), S[0])-1);
end;

{$IFDEF USE_LIBICU}
{$IFDEF LINUX}
function Utf8ToUnicodeICU(Dest: PWideChar; MaxDestChars: Cardinal; Source: _PAnsiChr; SourceBytes: Cardinal): Cardinal;
{$ELSE !LINUX}
function Utf8ToUnicode(Dest: PWideChar; MaxDestChars: Cardinal; Source: _PAnsiChr; SourceBytes: Cardinal): Cardinal;
{$ENDIF LINUX}
var
  DestLen: Int32;
  ErrorConv: UErrorCode;
begin
  Result := 0;
  if Source = nil then Exit;
  ErrorConv := 0;
  DestLen := 0;
  u_strFromUTF8(PUChar(Dest), MaxDestChars, DestLen, MarshaledAString(Source), SourceBytes, ErrorConv);
  Result := DestLen;
  if Dest <> nil then
  begin
    if (Result > 0) and (Result <= MaxDestChars) then
    begin
      if Result = MaxDestChars then
      begin
        if (Result > 1) and (Word(Dest[Result - 1]) >= $DC00) and (Word(Dest[Result - 1]) <= $DFFF) then
          Dec(Result);
      end else
        Inc(Result);
      Dest[Result - 1] := #0;
    end;
  end;
end;

Edit:
!!!!!!!!!!!!!!HOLY COW!!!!!!!!!!
Delphi-Quellcode:
function UTF8ToString(const S: array of Byte): string; overload;
var
  Dest: array[0..511] of Char;
begin
  SetString(Result, Dest, UTF8ToUnicode(Dest, Length(Dest), _PAnsiChr(@S[1]), S[0])-1); // _PAnsiChr(@S[1]) ist "ET" _PAnsiChr(@S[0]) müsste dann "CET" sein???
end;
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (21. Jul 2020 um 14:48 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.003 Beiträge
 
Delphi 12 Athens
 
#3

AW: (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfu

  Alt 21. Jul 2020, 14:48
OK, Was nun???
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfu

  Alt 21. Jul 2020, 15:39
Nun: Bugmeldung im Quality-Portal

S[Low(string)] statt S[1]
oder gleich den Mist mit dem @ lassen, also PAnsiChr(S) statt PAnsiChr(@S[1]) .

Grund: $ZeroBasedStrings sind im NextGen (Android/iOS) aktiv.
http://docwiki.embarcadero.com/RADSt...rings_(Delphi)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.174 Beiträge
 
Delphi 12 Athens
 
#5

AW: (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfu

  Alt 21. Jul 2020, 15:56
Nur mal gerade in den Delphi-Sourcen gesucht, es gibt allein ca. 34-40 Units die das benutzen.
Das würde ja an allen möglichen Stellen abrauchen, kann ich gar nicht glauben
Ganz zu schweigen von externen Libraries und Code.
Macht Emba keine Unit-Tests ?

Was ist jetzt besser, nur bei DateUtils zu fixen oder direkt das Übel an der Wurzel ? Gute Frage.

Ich muss wohl mal bei mir checken ob und wo ich das nutze.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfu

  Alt 21. Jul 2020, 16:07
Besser ist es immer das grundlegende Problem, anstatt nur die Symptome zu beheben.
Rein funktionell geht es auch den "Fehler" an beiden Stellen zu beheben, wobei TEncoding da einen größeren Overhead hat.


Wenn du über den String-Helper gehst, dann ist es dort auch überall 0-basiered und in jeder Platform einheitlich.
S.Chars(0) = S[1] {im Windows} ... abgesehn von dem nutzlosen Funktionsaufruf bei .Chars .

Auch beim Copy-Befehl seh ich zu oft, dass es bei 0 beginnt (Copy(S, 0, ...) ), was "oft" funktioniert, da es nach unten abgefangen wird, aber mit höheren Indize wird dann natürlich auch falsch zugegriffen, wenn der Entwickler das immer falsch macht.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.003 Beiträge
 
Delphi 12 Athens
 
#7

AW: (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfu

  Alt 22. Jul 2020, 12:34
Nur mal gerade in den Delphi-Sourcen gesucht, es gibt allein ca. 34-40 Units die das benutzen.
Das würde ja an allen möglichen Stellen abrauchen, kann ich gar nicht glauben
Ganz zu schweigen von externen Libraries und Code.
Macht Emba keine Unit-Tests ?
Es gibt das in vielen (5?) überladenen versionen.
Sprich vielleicht kommt bei dir nie die Array of Bytes version zum Einsatz...
Überladene namen lassen sich leider nicht wirklich toll suchen!

Was ist jetzt besser, nur bei DateUtils zu fixen oder direkt das Übel an der Wurzel ?
Ja, eben. Was nun?

Deine Frage war übrigens auch nicht übel.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (22. Jul 2020 um 12:39 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.003 Beiträge
 
Delphi 12 Athens
 
#8

AW: (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfu

  Alt 22. Jul 2020, 12:46
Nun: Bugmeldung im Quality-Portal

S[Low(string)] statt S[1]
oder gleich den Mist mit dem @ lassen, also PAnsiChr(S) statt PAnsiChr(@S[1]) .

Grund: $ZeroBasedStrings sind im NextGen (Android/iOS) aktiv.
http://docwiki.embarcadero.com/RADSt...rings_(Delphi)
Meinst du so
Delphi-Quellcode:
function UTF8ToString(const S: array of Byte): string; overload;
var
  Dest: array[0..511] of Char;
begin
  // _PAnsiChr(@S[1]) ist "ET" _PAnsiChr(@S[0]) müsste dann "CET" sein???
  // SetString(Result, Dest, UTF8ToUnicode(Dest, Length(Dest), _PAnsiChr(@S[1]), S[0])-1);
  SetString(Result, Dest, UTF8ToUnicode(Dest, Length(Dest), PAnsiChr(S), length(S))-1);
  //
end;
und was bedeutet in
UTF8ToUnicode(a, b, c, d) -1 das "-1"
????
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#9

AW: (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfu

  Alt 21. Jul 2020, 17:07

Delphi-Quellcode:
function UTF8ToString(const S: array of Byte): string; overload;
var
  Dest: array[0..511] of Char;
begin
  SetString(Result, Dest, UTF8ToUnicode(Dest, Length(Dest), _PAnsiChr(@S[1]), S[0])-1); // _PAnsiChr(@S[1]) ist "ET" _PAnsiChr(@S[0]) müsste dann "CET" sein???
end;


Diese Funktion ist anscheinend von ShortString nach "array of bytes" adaptiert worden. Man beachte das S[0]. Das soll ja wohl die Länge sein..
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.003 Beiträge
 
Delphi 12 Athens
 
#10

AW: (Android) Fehler in DateUtils behoben // TTimezone.Local.ID // Ich bitte um Prüfu

  Alt 22. Jul 2020, 12:50

Delphi-Quellcode:
function UTF8ToString(const S: array of Byte): string; overload;
var
  Dest: array[0..511] of Char;
begin
  SetString(Result, Dest, UTF8ToUnicode(Dest, Length(Dest), _PAnsiChr(@S[1]), S[0])-1); // _PAnsiChr(@S[1]) ist "ET" _PAnsiChr(@S[0]) müsste dann "CET" sein???
end;


Diese Funktion ist anscheinend von ShortString nach "array of bytes" adaptiert worden. Man beachte das S[0]. Das soll ja wohl die Länge sein..
Das denke ich auch. Und die Funkionen ein paar Zeilen darüber muten auch alle wie ein Copy-Pasta aus einer Shortstring Funktion an....
Ich habe einfach nur Angst dass in System.pas zu beheben.... wegen der Abhängigkeiten... vielleicht erwartet Abhängigercode diesen Fehler und trägt dafür Sorge...
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (22. Jul 2020 um 13:08 Uhr)
  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 17:07 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