Einzelnen Beitrag anzeigen

Incocnito

Registriert seit: 28. Nov 2016
217 Beiträge
 
#1

TStringHelper 0-indiziert

  Alt 15. Mai 2024, 09:31
Moin Zusammen,

ich brauche mal etwas seelischen Beistand ...
Ich habe eine (nicht nachstellbare) Zugriffsverletzung in einer Funktion gehabt, welche bei TStringHelper.Trim ausschlägt.
Jetzt schaue ich mir die Funktion an und stelle bei Delphi 10.4 fest, dass dort hard-coded mit
0-Indizierten Strings gearbeitet wird.
Wenn ich die Funktion kopiere und so an anderer Stelle aufrufe knallt es logischer Weise.

Beispiel:
Ich nehme den String sValue mit Wert "S" sage dann "Trim(S)" und er fliegt gleich mit Bereichsprüfungs-Fehlern raus,
da er versucht auf sValue[0] zuzugreifen.

Hier der Auszug aus System.SysUtils (in der Hoffnung, dass ich damit kein Copyright verletze!):
Delphi-Quellcode:
function TStringHelper.Trim: string;
var
  I, L: Integer;
begin
  L := Self.Length - 1;
  I := 0;
  if (L = -1) or (Self[I] > ' ') and (Self[L] > ' ') then Exit(Self);
  while (I <= L) and (Self[I] <= ' ') do Inc(I);
  if I > L then Exit('');
  while Self[L] <= ' do Dec(L);
  Result := Self.SubString(I, L - I + 1);
end;
Das gleiche passiert auch an anderen Stellen beim TStringHelper.

Wie kann das funktionieren? Weiß das jemand? Sieht die echte "TStringHelper.Trim"-Funktion anders aus?
Ich hätte erwartet, dass er entweder eine Unterscheidung für die Zielplattformen hat,
oder eine Korrektur fährt (ich nutze für String-Funktionen, welche für beides genutzt wird
zum Beispiel die Funktion "Low(sValue)", um jeweils den Startindex anzupassen, wenn ich das
nicht mit StringHelper-Funktionen umgehen kann und beispielsweise den String manuell durchlaufe.
Sorgen irgendwelche Compiler-Direktiven dafür, dass er das hintenrum irgendwie grade biegt,
oder hat da einfach nur jemand die Bereichsprüfung deaktiviert und das knallt nur aus Glück bei niemandem?

Liebe Grüße
Incocnito
  Mit Zitat antworten Zitat