Seite 1 von 1

seg fault mit fclose()

Verfasst: Mi Nov 16, 2011 8:13 am
von Bruno
Hallo!

Ich habe ein hartnäckiges Problem mit fclose, was ständig zu einem Absturz führt.

Ich mache folgendes:

Code: Alles auswählen

FILE *Datei ;
Datei = fopen(includes[0], "r" );
  if (!Datei){
/* tue was */
}
if (Datei){fclose(Datei);}
/* 
tue wieder was
*/
Datei = fopen(FileName, "r+w" );
  if (!Datei){
/* tue was */
}
if (Datei){fclose(Datei);}
/* 
tue wieder was
*/
Datei = fopen("Analyse.txt", "r+w" );
/* 
tue wieder was
*/
// und bis hier kommt der Code bevor er abbricht...
if (Datei){fclose(Datei);}
Die ersten beiden fopen-fclose Abschnitte laufen problemfrei, der dritte verursacht
folgendes:
Program terminated with signal 11, Segmentation fault.
#0 0x0000003467a60d67 in fclose@@GLIBC_2.2.5 () from /lib64/libc.so.6
#0 0x0000003467a60d67 in fclose@@GLIBC_2.2.5 () from /lib64/libc.so.6

Ich weiß, daß man ein fclose nicht auf eine bereits geschlossene Datei machen soll, aber hier bin ich mir ziemlich sicher, daß ich das nicht mache wg. if(Datei)...

Kann mir da wer weiterhelfen??

Ciao

Bruno

Re: seg fault mit fclose()

Verfasst: Mi Nov 16, 2011 8:46 am
von Xin
Auf den ersten Blick fällt mir nur auf, dass die Open-Flags beim 2. und 3. falsch sind. Es gibt kein "r+w".
Siehe fopen.

Würde dieses Programm schon abstürzen, wenn man int main() davorsetzt?
Ich befürchte, dass hier eher etwas in "tut irgensdwas" schief läuft.

Re: seg fault mit fclose()

Verfasst: Mi Nov 16, 2011 12:25 pm
von Bruno
Hallo!

Danke für die Hilfe!

Das r+w scheints gewesen zu sein.
Nach einem fopen(...,"r+w"); führt ein fclose zum Absturz.
ich habe jetzt alles mit fopen(...,"w+"); kompiliert und bislang läufts fehlerfrei.

Merkwürdig nur, daß der Compiler nicht meckert...

Ciao

Bruno

Re: seg fault mit fclose()

Verfasst: Mi Nov 16, 2011 1:04 pm
von Xin
Bruno hat geschrieben:Merkwürdig nur, daß der Compiler nicht meckert...
Die Funktion erwartet ein (char const *) und Du übergibst ein (char const *).
Syntaktisch und semantisch ist der Code vollkommen korrekt: Kein Gemecker.

Dass die Funktion "r+w" nicht lesen will, ist hingegen schon merkwürdig, denn "r+w" hat vermutlich schon jeder geschrieben und an einen Absturz kann ich mich nicht erinnern. Ich programmiere unter Linux, Mac und früher unter AmigaOS.

Worunter programmierst Du?

Re: seg fault mit fclose()

Verfasst: Mi Nov 16, 2011 1:07 pm
von Bruno
Hallo!

Ich nehme gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51). Wobei ich ihn schon auf höchste "Meckerstufe" gestellt habe.
Arbeite aber unter Red Hat Enterprise Linux Client release 5.7 (Tikanga).

Ciao

Bruno

Re: seg fault mit fclose()

Verfasst: Mi Nov 16, 2011 1:16 pm
von Xin
Bruno hat geschrieben:Ich nehme gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51). Wobei ich ihn schon auf höchste "Meckerstufe" gestellt habe.
Wie gesagt, der Compiler hat keinen Grund zu meckern, da der Code absolut korrekt ist. Dass Du die Funktion mit den falschen Werten fütterst, kann er ja nicht wissen.

Das Problem ist die libstdc - also abgesehen davon, dass Du fopen() mit den falschen Werten fütterst.
Das sollte aber problemlos abgefangen werden können - eine unschöne Reaktion.
Bruno hat geschrieben:Arbeite aber unter Red Hat Enterprise Linux Client release 5.7 (Tikanga).
...wobei mich das allerdings auch wieder wundert.

Ich denke, den Fehler unter Linux nämlich auch schon begangen zu haben ;-)