Methodenrücksprung fehlerhaft bei hoher Optimierung

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Methodenrücksprung fehlerhaft bei hoher Optimierung

Beitrag von MitjaStachowiak »

Hallo,

ich habe eben ein komisches Problem in einem etwas größeren Projekt, das ich leider nicht isolieren konnte: Das Problem tritt in Unit1 in der Procedure TGeschwindigkeitsMessung.XMLToData auf. Diese ruft am Ende eine Methode FromStrings auf, welche auch fehlerlos durch läuft. Aber beim Rücksprung von FromStrings nach XMLToData kommt ein Exception. Der Debugger springt zu irgend einer Assember-Adresse 44.

Der Fehler tritt nur bei Optimierungsstufe 2 und 3 auf.

Ich verwende derzeit eine trunc-Version (3.0.1) von Freepascal, wegen Generics. Mit der aktuellen Version lässt sich die Unit PolynomUtil nicht kompilieren.

Ich habe das Projekt als zip angehängt. Wer zufällig auch irgend eine neuere Version von FreePascal hat und das Ganze kompilieren kann, öffne im laufenden Programm einfach die Datei Reinheim.xml (Ebenfalls im zip enthalten). Dann klicke er auf die "Route 426 Da". Dadurch werden die betroffenen Funktionen aufgerufen. Es sollte eine Message Box "FromStrings ist ferig!" erscheinen, danach eigentlich "XMLToData ist fertig!", aber stattdessen kommt ein AccessViolation.
Dateianhänge
LazarusBug.zip
Alle Quellcodes, sowie eine Beispieldatei zum öffnen.
(94.53 KiB) 99-mal heruntergeladen

BeniBela
Beiträge: 309
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Methodenrücksprung fehlerhaft bei hoher Optimierung

Beitrag von BeniBela »

Code: Alles auswählen

 
SelPos : Array [0..3] of integer;
...
if (k <= 5) then SelPos[k] := j;
 


MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Methodenrücksprung fehlerhaft bei hoher Optimierung

Beitrag von MitjaStachowiak »

Au, ja, das war's. In SelPos sollten Textmarkierungen gespeichert werden, damit bei einer ungültigen Eingabe die betreffende Zeile markiert werden kann. Aber so einer nebensächlichen Funktionalität habe ich nicht so viel Aufmerksamkeit gewidmet und als später weitere Spalten hinzu gekommen sind, habe ich das Array nicht erweitert :roll:

Ich hätte nicht gedacht, dass ein Überlauf eines statischen Arrays immer noch nicht festgestellt werden kann. Das ist ja wie in C++ :mrgreen:

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Methodenrücksprung fehlerhaft bei hoher Optimierung

Beitrag von theo »

MitjaStachowiak hat geschrieben:Ich hätte nicht gedacht, dass ein Überlauf eines statischen Arrays immer noch nicht festgestellt werden kann. Das ist ja wie in C++ :mrgreen:


Wenn man statt Sprüche klopfen die Bereichsprüfung einschaltet, klappt das vielleicht sogar. :mrgreen:

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Methodenrücksprung fehlerhaft bei hoher Optimierung

Beitrag von marcov »

MitjaStachowiak hat geschrieben:Ich hätte nicht gedacht, dass ein Überlauf eines statischen Arrays immer noch nicht festgestellt werden kann. Das ist ja wie in C++ :mrgreen:


Rangechecks sind eingeschaltet? Kompiliere oft mit -Criot

Im Falle Komplizierte OOP Kode (zb Parsetrees oder andere heterogene Bäume) auch R daran zufügen, also -CRriot

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Methodenrücksprung fehlerhaft bei hoher Optimierung

Beitrag von MitjaStachowiak »

Ah, dann wird es erkannt. Aber erst zur Laufzeit. Ok, alles andere wäre auch viel verlangt.

Muss mich mal mit den Erstellmodi beschäftigen, damit die Range Checks dann vor dem Veröffentlichen 'raus fliegen.

Antworten