Analyze: Argument to free() is the address of a global vari

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
gelbehexe
Beiträge: 2
Registriert: Di Dez 17, 2013 10:19 am

Analyze: Argument to free() is the address of a global vari

Beitrag von gelbehexe » Di Dez 17, 2013 10:41 am

Hallo,

ich arbeite mit xcode auf dem Mac un arbeite mich gerade in die Programmiersprache C ein. In diesem Zug habe ich ein kleines Testprogramm geschrieben. Wenn da den Analyzer drüber laufen lasse, dann meckert er an einer Stelle. Ich verstehe aber nicht, warum.

Hier die betreffenden Zeilen:

Code: Alles auswählen

char *strRepeater(char *c,unsigned int multi) {
    if (!multi) {
        return "";
    }
    
    size_t bufsize = strlen(c) * multi + 1;
    
    char *buffer = malloc(bufsize);
    bzero(buffer, bufsize);

    unsigned int ii;

    for (ii=0; ii<multi; ii++) {
        strcat(buffer, c);
    }
    
    //char *retval = strdup(buffer);
    
    //free(buffer);
    
    return buffer;
}

void printChar(char *c,unsigned int multi) {
    char *repeatedStr = strRepeater(c, multi);
    
    printf("%s",repeatedStr);
    
    free(repeatedStr); // Analyze: Argument to free() is the address of a global variable, which is not memory allocated by malloc()
}

Wäre toll, wenn mir jemand einen Hinweis geben könnte, was ich da falsch mache?

LG

Petra

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Analyze: Argument to free() is the address of a global

Beitrag von Xin » Di Dez 17, 2013 10:57 am

Moin.

Willkommen im Forum.
gelbehexe hat geschrieben: Hier die betreffenden Zeilen:

Code: Alles auswählen

char *strRepeater(char *c,unsigned int multi) {
    if (!multi) {
        return "";
    }
Vielliecht meckert er hier, wo Du ein "" (Datentyp char const *) zurückgibst, obwohl Dein Rückgabetyp ein (char *) ist. Der Aufrufer dürfte also den String "" verändern, der in der Regel im Programmbereich liegt, schließlich sollte der nächste Aufruf von strRepeater( "bla", 0 ); ja ebenfalls "" zurückgegeben und nicht die geänderte Variante.
gelbehexe hat geschrieben:

Code: Alles auswählen

void printChar(char *c,unsigned int multi) {
    char *repeatedStr = strRepeater(c, multi);
    
    printf("%s",repeatedStr);
    
    free(repeatedStr); // Analyze: Argument to free() is the address of a global variable, which is not memory allocated by malloc()
}
Wäre toll, wenn mir jemand einen Hinweis geben könnte, was ich da falsch mache?
Du rufst printChar() mit multi = 0 auf? => Dann siehe oben: Du gibst "" frei, obwohl "" nicht von Dir alloziiert wurde.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

gelbehexe
Beiträge: 2
Registriert: Di Dez 17, 2013 10:19 am

Re: Analyze: Argument to free() is the address of a global

Beitrag von gelbehexe » Di Dez 17, 2013 1:49 pm

Hallo Xin,
Du rufst printChar() mit multi = 0 auf? => Dann siehe oben: Du gibst "" frei, obwohl "" nicht von Dir alloziiert wurde.
Oh man, du hast ja so was von recht!

Danke :)

LG Petra

Antworten