[F] Bug in $left()


#1

Diese MTE Datei ausführen und man sieht es sofort:

$filename(Test_$left.txt)
'Test1: $left(abc,-2) = ' $left(abc,-2)   <== Fehler
'Test2: $left(abc,-1) = ' $left(abc,-1)   <== Fehler
'Test3: $left(abc,0)  = ' $left(abc,0)   <== Fehler
'Test4: $left(abc,1)  = ' $left(abc,1)
'Test5: $left(abc,2)  = ' $left(abc,2)
'Test6: $left(abc,3)  = ' $left(abc,3)
'Test7: $left(abc,4)  = ' $left(abc,4)
'Test8: $left(abc,5)  = ' $left(abc,5)

DD.20070219.0116


#2

'Test1: $left(abc,-2) = ' $left(abc,-2) <== Fehler
'Test2: $left(abc,-1) = ' $left(abc,-1) <== Fehler
dann nimm doch $right! (sorry, couldn't resist gg)

(hab vor ca 15 Jahren ganze C-String-Library geschrieben, um Strings, die auch den Code 00 enthalten, verarbeiten zu können, also eine Art Pascal-Strings für C, allerdings dynamisch alloziert mit beliebiger Stringlänge.
seither weiss ich: "check your function parameters! and then recheck them! and then add error catching code and check again!" :slight_smile:


#3

Hi aladoro, die negativen Werte in meinem Beispiel habe ich nur zur Verdeutlichung verwendet, ein Beispiel mit dem Wert 0 hätte das Problem auch schon beschrieben.
Das mit $right() kann nicht ernst gemeint sein :sunglasses:, denn das kann ich nicht verwenden, weil der zweite Parameter berechnet wird (nebenbei bemerkt, es gibt solche Funktionen mit 'wrap effect', ich habe gerade nur nicht parat in welchem Toolpaket ich das gesehen habe).

Um das schier Unfassbare :astonished: , weil so elementar, zu fassen zu bekommen, habe ich mir einen 'ganz schönen Wolf gesucht'.

Zurzeit benutze ich diesen Workaround (der zweite $puts() tut's):

$puts(my_FOLDERPATH_1,$left($get(my_FOLDERPATH_0),$strrchr($left($get(my_FOLDERPATH_0),$sub($strrchr($get(my_FOLDERPATH_0),\),1)),\)))
$puts(my_FOLDERPATH_1,$iflonger($get(my_FOLDERPATH_1),1,$get(my_FOLDERPATH_1),))

Aber das darf selbstverständlich kein Dauerzustand bleiben.

DD.20070226.1220


#4

Ebenfalls defekt:

$right(abc,0) ergibt 'c'
$right(abc,-1) ergibt 'c'

$right(abc,4) ergibt 'Ĉabc' (out of bounds)
$right(abc,5) ergibt 'ʼnĈabc' (out of bounds)

$mid(abc,0,1) ergibt 'a'
$mid(abc,-1,1) ergibt 'a'

DD.20070304.0014

Edit:
Und noch etwas ...

Aktion Ersetzen
Original: " "
Ersetzen mit : ""
funktioniert soweit ...

... aber wenn die MTA Datei mit einem externen Editor bearbeitet wird, der Leerzeichen am Ende der Zeile entfernt, dann sieht die Aktion danach so aus ...

Aktion Ersetzen
Original: ""
Ersetzen mit : ""

... und Mp3tag rennt mit 99% Prozessorlast in eine Endlosschleife ... ... ... ... ...

DD.20070304.0042


#5

$right(abc,50000000) führt sogar zu einem buffer overflow. :stuck_out_tongue:


#6

Der aktuelle Development Build sollte diese Probleme beheben.

Danke für die vielen Hinweise!

Viele Grüße,
Florian