Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Bug in QuickLib (https://www.delphipraxis.net/206469-bug-quicklib.html)

PeterPanino 24. Dez 2020 17:53


Bug in QuickLib
 
Liste der Anhänge anzeigen (Anzahl: 2)
QuickLib ist eine umfangreiche MultiPurpose-Library, die in der aktuellen Version 2.1 mit GetIt heruntergeladen werden kann.

Leider hat die Unit Quick.Commons einen Bug:

Code:
//checks if need include signs
if pfIncludeNumbers in Complexity then
// QuickLib 2.1
Das bedeutet, dass beim Aufruf von
Code:
RandomPassword(10, [pfIncludeSigns]);
keine Sonderzeichen eingefügt werden!

Sowie beim Aufruf von
Code:
RandomPassword(10, [pfIncludeNumbers]);
SOWOHL Sonderzeichen als auch Ziffern eingefügt werden!

Hat jemand noch andere Bugs in QuickLib bemerkt?

Hier ist ein kleines Projekt, mit dem der Bug reproduziert werden kann:

Anhang 53472

Und hier ist der Bug-Fix:

Anhang 53473

PeterPanino 24. Dez 2020 20:53

AW: Bug in QuickLib
 
Weiterer Bug gefunden:

Code:
Quick.Process.GetProcessList
erzeugt ein Memory-Leak. Es scheint keine Möglichkeit zu geben, das Gedächtnis-Loch zu vermeiden:

Code:
procedure TForm1.tsProcessListsShow(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.Sorted := True;
    sl.Duplicates := dupIgnore;
    sl.AddStrings(Quick.Process.GetProcessList); // bug: Creates memory-leak
    //CodeSite.Send('TForm1.tsProcessListsShow: sl', sl);
    lstProcesses.Items.Assign(sl);
  finally
    sl.Free;
  end;
end;
Dies scheint ein konzeptioneller Fehler zu sein: Quick.Process.GetProcessList gibt ein Ergebnis vom Typ TStringList zurück. Aber wie soll man den Speicher dieser StringList wieder freigeben? Besser wäre es, der Funktion Quick.Process.GetProcessList eine existierende StringList als var-Parameter zu übergeben, die man dann nachher selbst freigeben kann, z.B.:

Code:
Quick.Process.GetProcessList(sl);

Andreas13 25. Dez 2020 10:06

AW: Bug in QuickLib
 
Lieder läßt sich die Bibliothek QuickLib mit Delphi XE5 nicht kompilieren, weil sie neuere Sprachelemente wie Inline-Deklarationen etc. verwendet.
Euch allen schöne Weihnachten & gute Gesundheit!
Gruß, Andreas

himitsu 25. Dez 2020 11:47

AW: Bug in QuickLib
 
Zitat:

Zitat von PeterPanino (Beitrag 1479849)
Aber wie soll man den Speicher dieser StringList wieder freigeben?

Indem man Free benutzt? :roll:

Delphi-Quellcode:
procedure TForm1.tsProcessListsShow(Sender: TObject);
var
  sl: TStringList;
begin
  sl := Quick.Process.GetProcessList;
  try
    sl.Sort;
    //CodeSite.Send('TForm1.tsProcessListsShow: sl', sl);
    lstProcesses.Items.Assign(sl);
  finally
    sl.Free;
  end;
end;
Zitat:

Zitat von PeterPanino (Beitrag 1479849)
Dies scheint ein konzeptioneller Fehler zu sein

Aber wenn eine Funktion etwas "erstellt" und der Aufrufer es wieder freigeben muß, dann würde ich soeine Funktion eher "Create" nennen, anstatt "Get",
oder mir einen anderen Typen als Result raussuchen, bzw. wie beim Assign/AddStrings die StringList nicht erstellen, sondern nur befüllen.

PeterPanino 25. Dez 2020 18:22

AW: Bug in QuickLib
 
Zitat:

Zitat von Andreas13 (Beitrag 1479855)
Euch allen schöne Weihnachten & gute Gesundheit!
Gruß, Andreas

Alles Gute!

PeterPanino 25. Dez 2020 18:46

AW: Bug in QuickLib
 
Zitat:

Zitat von himitsu (Beitrag 1479856)
Indem man Free benutzt?

Delphi-Quellcode:
procedure TForm1.tsProcessListsShow(Sender: TObject);
var
  sl: TStringList;
begin
  sl := Quick.Process.GetProcessList;
  try
    sl.Sort;
    //CodeSite.Send('TForm1.tsProcessListsShow: sl', sl);
    lstProcesses.Items.Assign(sl);
  finally
    sl.Free;
  end;
end;

Leider kann man bei dieser Konstruktion nicht die Duplikate entfernen, so wie ich es in meinem Code gemacht habe. Dazu müsste man wahrscheinlich erst wieder mehrere StringList-Objekte erstellen.

Wie gesagt, besser wäre es zu diesem Zweck, wenn man der Funktion GetProcessList eine existierende StringList als var-Parameter übergeben könnte.

himitsu 25. Dez 2020 21:13

AW: Bug in QuickLib
 
Das ist doch eine firsche Liste?

Dann sollte doch eh jeder Prozess nur einmal drin sein. :stupid:

PeterPanino 25. Dez 2020 21:28

AW: Bug in QuickLib
 
Zitat:

Zitat von himitsu (Beitrag 1479865)
Das ist doch eine firsche Liste?

Dann sollte doch eh jeder Prozess nur einmal drin sein. :stupid:

Ist es aber nicht. Probier's mal aus. :stupid:

himitsu 26. Dez 2020 00:07

AW: Bug in QuickLib
 
Der nächste Bug in dieser Komponente?

Delphi-Quellcode:
  sl := Quick.Process.GetProcessList;
  try
    sl.Sort;
    for var i := SL.Count - 2 downto 0
      if sl[i] = sl[i+1] then
        sl.Delete(i);
    //CodeSite.Send('TForm1.tsProcessListsShow: sl', sl);
    lstProcesses.Items.Assign(sl);
  finally
    sl.Free;
  end;
Ich weiß jetzt nicht wie diese Komponente intern arbeitet, aber eine StringListe lässt sich auch so sortieren und aufräumen.
Delphi-Quellcode:
sl.Sorted := True;
sl.Duplicates := dupIgnore;
sl.Text := sl.Text;

PeterPanino 26. Dez 2020 11:35

AW: Bug in QuickLib
 
Zitat:

Zitat von himitsu (Beitrag 1479867)
Ich weiß jetzt nicht wie diese Komponente intern arbeitet

Du kannst die QuickLib zum Ausprobieren bequem und gefahrlos in GetIt installieren und dann ggf. wieder deinstallieren. 8-)

Zitat:

Zitat von himitsu (Beitrag 1479867)
Delphi-Quellcode:
sl.Sorted := True;
sl.Duplicates := dupIgnore;
sl.Text := sl.Text;

GEIL finde ich diese Zuweisung:
Delphi-Quellcode:
sl.Text := sl.Text;
Aber es funktioniert!


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