Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TJson.Format(..) fehlerhaft? (https://www.delphipraxis.net/192970-tjson-format-fehlerhaft.html)

Der schöne Günther 7. Jun 2017 10:41

Delphi-Version: 10 Seattle

TJson.Format(..) fehlerhaft?
 
Im Bugtracker habe ich nichts gefunden, aber
Delphi-Quellcode:
TJson.Format(..)
ist zumindest in 10 Seattle kaputt. Kann das jemand mit Berlin/Tokyo immer noch bestätigen?

Button1 und Memo1 aufs Formular, dann
Delphi-Quellcode:
uses
  Rest.Json, System.Json;

{$R *.dfm}

procedure TForm17.Button1Click(Sender: TObject);
var
   objects: TArray<TObject>;
   arrayIndex: Integer;

   objectAsJson: TJsonValue;
   objectAsString: String;
begin
   objects := TArray<TObject>.Create(
      TObject.Create(),
      TObject.Create(),
      TObject.Create()
   );

   for arrayIndex := Low(objects) to High(objects) do
      begin
         objectAsJson := TJson.ObjectToJsonObject(objects[arrayIndex]);
         try
            objectAsString := TJson.Format(objectAsJson);
            Memo1.Lines.Append(objectAsString);
         finally
            objectAsJson.Destroy();
         end;
      end;
end;
TJson.Format liefert beim ersten mal
Delphi-Quellcode:
{}
, beim zweiten mal allerdings
Delphi-Quellcode:
{}, {}
und beim dritten mal
Delphi-Quellcode:
{}, {}, {}
.

Erwartet wäre drei mal
Delphi-Quellcode:
{}
Das liegt anscheinend daran dass in TJson.Format(..) (Rest.Json.pas) munter gesagt wird
Delphi-Quellcode:
Result := Result + ...
obwohl Result noch nie zugewiesen wurde. Wenn die Methode das zweite mal betreten wird ist Result noch mit dem Ergebnis des ersten Durchlaufs belegt.


Kann jemand prüfen ob das ab 10.1 Berlin und aufwärts immer noch auftritt?

TiGü 7. Jun 2017 11:05

AW: TJson.Format(..) fehlerhaft?
 
Code:
{
  }

{
  }
{
  }

{
  }
{
  }
{
  }
So siehts in Toyko aus.

himitsu 7. Jun 2017 14:17

AW: TJson.Format(..) fehlerhaft?
 
Solche Fehler gibt es leider oftmals, wenn Funktionen in einer Schleife aufgerufen werden und das Result nicht ordnungsgemäß initialisiert wird, also zu Beginn ein
Delphi-Quellcode:
Result := '';
.

Delphi gibt leider keine Warnung bei sowas aus, da gemanagte Typen automatisch initialisiert werden,
allerdingt macht der Compiler aus
Delphi-Quellcode:
function Test(...): string;
ein
Delphi-Quellcode:
procedure Test(...; var Result: string);
.
Die implizite "lokale" Variable beim Aufrufer, für das Funktions-Result, wurde ja mit '' initialisiert, allerdings trifft das nur für den ersten Schleifendurchlauf zu, aber initialisiert ist initialisiert womit es keine Warnung gibt.

Ich und auch Andere hatten schon mehrmals im QC darum gebeten, dass die "Variable wurde initialisiert"-Kennung für das Result von Funktionen zu Beginn der Funktion gelöscht wird, damit dieser Fehler endlich vom Compiler gemeldet werden kann ... tja, aber auf uns hört ja Niemand.

Der schöne Günther 7. Jun 2017 14:45

AW: TJson.Format(..) fehlerhaft?
 
Das ist nicht die einzige völlig Offensichtliche vor dem der Compiler warnen sollte. Aber was uns Delphi-Entwickler nicht umbringt macht uns nur härter...

Da das RAD Studio so billig ist kann man sich grade für so etwas getrost FixInsight dazu kaufen. Das ist wirklich gut und warnt bspw. auch vor genau so etwas.

Der schöne Günther 7. Jun 2017 16:23

AW: TJson.Format(..) fehlerhaft?
 
Falls jemand die Welt zu einem besseren Ort machen möchte wäre ein Vote im Bugtracker heute genau das richtige!

https://quality.embarcadero.com/browse/RSP-18300

TiGü 8. Jun 2017 08:28

AW: TJson.Format(..) fehlerhaft?
 
Gevotet! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 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