PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fgetpwent() wird mit Speicherverletzung quittiert?



07-03-2001, 17:54
Ich hab ein Programmm geschrieben was der Compiler ohne warnung und fehler durchlaufen läßt. Nun gibt es aber bei der Ausführung des Programms einer Speicherverletzung:
"/tmp/xwpe_oN2TFm/we_sys_tmp: line 1: 3131 Speicherzugriffsfehler $*"
und das Programm wird nicht ordentlich beendet. ich hab breits alles im Programm über Bord geworfen und dabei festgestellt das der Fehler in der fgetpwent() Funktion steckt! Fliegt diese raus ist alle OK.
Nun hab ich mir angeschaut das in der C reference steht:
" struct passwd *fgetpwent(FILE *stream)

...
The file stream must have the same format as /etc/passwd"
Was heißt das und könnte der Fehler hier liegen?
Danke für die Hilfe!
Tschau Robi!

07-03-2001, 18:19
Vielleicht sollt ich noch den Quellcode des Programms posten:
"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <pwd.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
char buf[100];
FILE *pass;
struct passwd *pass_1;
pass=fopen(argv[1],"r");
while(!feof(pass))
{
pass_1 =fgetpwent(pass); printf("%s\n",pass_1->pw_name);
}
fclose(pass);
}"

Und es liegt auch nicht direkt an der fgetpwent Funktion, sondern dem Arbeiten mit der von ihr übergebenen Funktion!

08-03-2001, 07:43
#include <stdlib.h>
#include &lt;stdio.h&gt;
#include &lt;pwd.h&gt;
#include &lt;sys/types.h&gt;

int main(int argc, char *argv[])
{
char buf[100];
FILE *pass;
struct passwd *pass_1;
pass = fopen(argv[1], "r");
if (pass != NULL) {
for ( pass_1 = fgetpwent(pass) ;
pass_1 != NULL ;
pass_1 = fgetpwent(pass) ) {
printf("%s\n",pass_1-&gt;pw_name);
}
fclose(pass);
} else
perror(argv[0]);
}

Merke:
Du solltest _jeden_ Ruckgabewert einer Systemfunktion auf Fehler ueberpruefen.
Ausserdem solltest Du den Wert selber testen (pass_1) und nicht irgenwelche Vermutungen uber irgenwelche Zusammenhange (!feof(pass))

(!feof(pass)) Zeigt nach dem letzten user naemlich noch kein Dateiende an, da fgetwent ja nur bis einschliesslich des "\n" der jeweiligen Zeile liest und erst beim naechtsen Aufruf an das Dateiende stoesst und
NULL zurueckliefert.
Dereferenzierst Du nun den NULL-Pointer gibst halt nen Segfault.

man fgetpwent
beschreibt ja auch dieses Verhalten.

if (pass != NULL) sollte auch _nie_ fehlen nach dem Versuch pass mit fopen zu oeffnen.