TLazBarcode - Absturz bei Datamatrix Code

Rund um die LCL und andere Komponenten
Antworten
MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

TLazBarcode - Absturz bei Datamatrix Code

Beitrag von MmVisual »

Hallo,

Ich nutze die Komponente TLazBarcode um Datamatrix 2D Codes zu erzeugen. Doch bei manchen Strings stürzt die Komponente mit einer Zugriffsverletzung ab.

Beim LazBarcodeDemo habe ich diesen Code einmal so geändert, um bei der Taste so ein String übergeben zu können:

Code: Alles auswählen

procedure TMainForm.btnSampleTextClick(Sender: TObject);
begin
  if FBarCode <> nil then
  begin
    FBarcode.SampleText;
    edText.Text := '[)>'#$1E'06'#$1D'PRonde'#$1D'1PRonde für Ampullengreifer Dostes'#$1D'I969'#$1D'1I826'#$1E#$04;
  end;
end;  
Wenn ich den Buchsteabe "ü" vom Wort "für" auf ein "ö" ersetze, oder das "ü" lösche, dann wird der 2D Code erzeugt. Wenn ich das "ü" durch ein "ä" ersetze, dann stürzt die Komponente ebenfalls ab. Die Sonderzeichen im unteren ASCII Bereich (0..31) machen keine Probleme, die nutze ich seit Jahren.

Ich habe da einige Stunden debuggt und geschaut woran das liegt. In der Datei "lbc_datamatrix.pas" bleibt er bei der Funktion "dm200encode()" hier hängen:

Code: Alles auswählen

Z678: if (source[sp] > 127) then
source ist nicht NIL und der übergebene Text ist ebenfalls deutlich größer als wie zugegriffen wird, dennoch gibt es hier eine Zugriffsverletzung.

Ich vermute jedoch dass diese Funtion "look_ahead_test()" bereits etwas falsches ausrechnet, in Zusammenhang dass sich das UTF8 Zeichen "ü" rein zufällig gerade an einer ungünstigen Stelle befindet. Denn nochmalerweise gehen UTF8 Zeichen problemlos, selbst sogar die ganzen anderen Sonderzeichen-Symbole funktionieren.

So viel ich gesehen habe ist LazBarcode eine Portierung aus Zint und Zint arbeitet in der Funktion look_ahead_test() byteweise und bei Lazarus 8-Byte weise und da vermute ich den Fehler.
Der Zint Code:
https://sourceforge.net/p/zint/code/ci/ ... /dmatrix.c
Code ab "static int dm_look_ahead_test("

Zint Sourceforge Seite:
https://sourceforge.net/projects/zint/

Nun ist mein Problem, wie kann ich das richten dass es richtig geht? Kann mich da jemand unterstützen?

Vielen Dank.
VG Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten