Fehler bei Zuweisung von Ansistring. Gelöst

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Fehler bei Zuweisung von Ansistring. Gelöst

Beitrag von haderlump »

Hallo zusammen.
Ich habe folgendes Problem.
in folgendem Abschnitt

Code: Alles auswählen

test := 'test';   //Diese Zeile funktioniert noch
for b:=1 to 20 do
       begin
              bue_stapel[b].zeit:=0;  //diese Zeile funktioniert auch
              bue_stapel[b].bue_bezeichnung := 'x';  //hier kommt die Fehlermeldung
       end;                     
kommt eine Exceptionmeldung:
Projekt ... hat eine Exception-Klasse <<External:SIGSEGV<< ausgelöst
Bei Adresse 1000096CA

Im assembler Fenster steht oben: fcp_ansistr_decr_ref (10)

Hier noch die Definitionen des Arrays:

Code: Alles auswählen

Treinigung = record
    bue_bezeichnung:ansistring;
    zeit:integer;  
und Die Variablendefinition als globale Variable

Code: Alles auswählen

bue_stapel : array[0..20] of Treinigung;   
Was ist innerhalb des Arrays anders als bei der Testvariablen ?
Vielen Dank im Voraus
Zuletzt geändert von haderlump am Mo 29. Mär 2021, 12:44, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Fehler bei Zuweisung von Ansistring.

Beitrag von wp_xyz »

Der gezeigte Code für sich funktioniert einwandfrei. Schalte alle Prüfungen des Compilers an, um weitere Hinweise zu erhalten. Greifst du irgendwo auf falsche Arrayindices zu? Der Unterschied in der Deklaration des untersten Arrayindex (0) und dem Schleifenstart (1) zeigt, dass du hier vielleicht etwas sorglos bist. Hier ist zwar kein Problem, aber vielleicht ist es an anderen Stellen schlimmer...

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehler bei Zuweisung von Ansistring.

Beitrag von haderlump »

Ich habe den Schleifenstart nur zur Probe auf 1 gesetzt.
sonst geht es schon bei null los.
Mir fällt gerade ein, dass ich heute bei Arbeitsbegin eine andere Meldung bekam, "Die Datei auf dem Datenträger wurde geändert. soll neu geladen werden" oder so ähnlich. Ich habe dann auf Ja angeklickt. Beim nächsten compilieren wurden dann die ganze IDE neu kompiliert. Vielleicht habe ich da irgendwo etwas aus Versehen überschrieben..

Könnte es etwas bringen, wenn ich Lazarus neu installiere?

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Fehler bei Zuweisung von Ansistring.

Beitrag von Warf »

fcp_ansistr_decr_ref wird auf dem alten string aufgerufen bevor der String überschrieben wird, d.h. deine Variable ist kaputt bevor der neue Wert rein kommt.
Ein solches problem ist meist das der Pointer auf einen invaliden wert steht, das passiert z.b. wenn du via FillChar den Record füllst, explizit einen anderen/falschen wert zuweist, der Record nicht korrekt initialisiert wurde, du per hand versuchst hast an dem refcounting rumzuspielen, oder anderer code, z.b. über einen buffer overflow außversehen diese werte überschrieben hat

Schau dir an wo vorher überall diesen Record angefasst hast, und falls es nicht daran liegt, schalte Range Checks in den Projekteinstellungen ein um buffer overflows zu finden.

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehler bei Zuweisung von Ansistring.

Beitrag von haderlump »

Das ist die erste Routine, die auf das Array zugreift, Diese wird einfach mit dem Wert initialisiert. Eigentlich mit '' aber das ging auch nicht. Deshalb probeweise das 'x'.
Ich bin jetzt nicht an dem Rechner, aber morgen werde ich mir das mal genauer ansehen.
Bis dahin danke für die Ratschläge.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Fehler bei Zuweisung von Ansistring.

Beitrag von charlytango »

haderlump hat geschrieben:
So 28. Mär 2021, 13:24

Code: Alles auswählen

Treinigung = record
    bue_bezeichnung:ansistring;
    zeit:integer;  
Also ich bin jetzt kein Crack bei Datentypen, aber vielleicht sieht man den Wald vor lauter Bäumen nicht.

Hast du einen besonderen Grund warum blue_bezeichnung vom Typ ansistring ist? Passt da string nicht auch?

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehler bei Zuweisung von Ansistring.

Beitrag von haderlump »

Ich hatte zuerst string, Das ging nicht, dann habe ich es mit ansistring versucht. auch vergeblich.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Fehler bei Zuweisung von Ansistring.

Beitrag von PascalDragon »

haderlump hat geschrieben:
So 28. Mär 2021, 16:53
Mir fällt gerade ein, dass ich heute bei Arbeitsbegin eine andere Meldung bekam, "Die Datei auf dem Datenträger wurde geändert. soll neu geladen werden" oder so ähnlich. Ich habe dann auf Ja angeklickt. Beim nächsten compilieren wurden dann die ganze IDE neu kompiliert. Vielleicht habe ich da irgendwo etwas aus Versehen überschrieben..
Lass mich raten: du hattest deinen Rechner seit Samstag nur im Standby oder ähnliches. Dann war das einfach nur die Zeitumstellung. Habe das auch alle halbe Jahr auf meinem Tablet ;)
haderlump hat geschrieben:
Mo 29. Mär 2021, 04:50
Ich hatte zuerst string, Das ging nicht, dann habe ich es mit ansistring versucht. auch vergeblich.
Würdest du vielleicht ein vollständiges Beispiel zeigen, dass den Fehler zeigt und wir auch selbst kompilieren können? Mit Codeschnipseln zu arbeiten führt meist dazu, dass man den eigentlichen Fehler nicht sieht...
FPC Compiler Entwickler

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehler bei Zuweisung von Ansistring.

Beitrag von haderlump »

Ich habe jetze noch ein 2. Array mit der Bezeichnung bue_stapel2 angelegt, da funktioniert jetzt alle.
keine Ahnung warum, aber egal, die paar bytes liegen gut tot im Speicher.
Für mich ist das Problem gelöst.

Danke für eure Bemühungen

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Fehler bei Zuweisung von Ansistring. Gelöst

Beitrag von Warf »

Jetzt nicht böse gemeint, aber dein Problem ist nicht gelöst, denn die SIGSEGV war nicht dein Problem sondern nur die Manifestation. Das ist als würde dein Schuppen brennen und du ziehst den Rolladen runter, weil wenn du es nicht siehst ist das Problem gelöst.

Die tatsache das dein ursprünglicher string invalide ist bedeutet das irgendein voriger code kaputt ist. Da es mit dem zweiten Array funktioniert tippe ich auf einen Buffer overflow oder ähnliches das den ersten array überschrieben hat. Durch den neuen Array hast du den ersten Array so zu sagen zu einem puffer für diese überschreibung gemacht. Allerdings bedeutet das das du vorher irgendwelchen code hast der einen Buffer overflow erzeugt. Das ist dein Fehler, nicht die SIGSEGV. Du hast ganz klar code der nicht tut was er soll und du solltest den definitiv fixen, denn ein Fehler kommt selten allein, und der code erzeugt wahrscheinlich noch andere falsche ergebnisse als nur einen Buffer overflow

Antworten