PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : strndup() bekommt keinen Speicher mehr



Linus
10-02-2019, 18:56
Bei dem Programm dupmerge, von https://sourceforge.net/projects/dupmerge/files/, habe ich seit kurzem das Problem, das strndup() nicht mehr genügend Speicher bekommt und Null-Pointer zurückgibt.

Das tritt auf an der Stelle, an der die Dateinamen in Datenfelder eingelesen werden:



if ((NULL == (names[i] = strndup (buf, BUFSIZ))) or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))
{
(void) fprintf (stderr, "%s: Out of memory, ((NULL == (names[i] = strndup (buf, BUFSIZ))) or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))\n", argv[0]);
(void) fprintf (stderr, " i=%d, j=%d, names[i]=%p, a_names[i]=%p\n", i, j, names[i], a_names[i]);
exit (1);
}


Das zeigt:

dupmerge: Out of memory, ((NULL == (names[i] = strndup (buf, BUFSIZ))) or (NULL == (a_names[i] = strndup (buf, BUFSIZ))))
i=29909, j=35, names[i]=(nil), a_names[i]=(nil)

Also bei circa 1 MB ist plötzlich Schluß.
Woran liegt das und wie bekomme ich das Limit wieder weg?
ulimits zeigt mir "unlimited", also keine expliziten Limits.

Linus
09-03-2019, 22:04
Es zeigte sich, das der Fehler von einer ganz anderen Stelle kommt, eine Inline-Funktion zum Initialisieren.
Wird das inline entfernt, ist der Fehler weg.
Der GCC reagiert in letzter Zeit allergisch auf Inline-Funktionen, meist mit dem Symptom das der Linker sie nicht findet, bei ganz anderen Programmen.

dodona
15-04-2019, 21:49
Es zeigte sich, das der Fehler von einer ganz anderen Stelle kommt, eine Inline-Funktion zum Initialisieren.
Wird das inline entfernt, ist der Fehler weg.
Der GCC reagiert in letzter Zeit allergisch auf Inline-Funktionen, meist mit dem Symptom das der Linker sie nicht findet, bei ganz anderen Programmen.

Inline-Funktionen werden expandiert. Da kann der Linker gar nichts finden.

Linus
15-04-2019, 23:06
Inline-Funktionen werden expandiert. Da kann der Linker gar nichts finden.

Ja, aber nachdem das 10 Jahre lang funktionierte, weil der Compiler einfügte und der Linker nicht mit der Inline-Funktion aufgerufen wurde, kam mit einer neueren GCC-Version nun dieser Fehler, weil der Linker nun damit aufgerufen wird: https://www.geeksforgeeks.org/inline-function-in-c/

Jedenfalls habe ich das inline rausgenommen und damit funktioniert es.

dodona
20-05-2021, 23:29
unvollständige Listings sind unbrauchbar, denn da kann man für sich nichts nachvollziehen, bspw. ob buf groß genug für die strndups() dimensioniert wird.