Anzeige:
Ergebnis 1 bis 5 von 5

Thema: strndup() bekommt keinen Speicher mehr

  1. #1
    Registrierter Benutzer
    Registriert seit
    03.09.2006
    Beiträge
    120

    Angry strndup() bekommt keinen Speicher mehr

    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:

    Code:
        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.

  2. #2
    Registrierter Benutzer
    Registriert seit
    03.09.2006
    Beiträge
    120
    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.

  3. #3
    Registrierter Benutzer
    Registriert seit
    15.04.2019
    Beiträge
    2
    Zitat Zitat von Linus Beitrag anzeigen
    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.

  4. #4
    Registrierter Benutzer
    Registriert seit
    03.09.2006
    Beiträge
    120
    Zitat Zitat von dodona Beitrag anzeigen
    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.

  5. #5
    Registrierter Benutzer
    Registriert seit
    15.04.2019
    Beiträge
    2
    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.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •