Seite 1 von 1

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

Verfasst: Di Dez 17, 2013 10:41 am
von gelbehexe
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

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

Verfasst: Di Dez 17, 2013 10:57 am
von Xin
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.

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

Verfasst: Di Dez 17, 2013 1:49 pm
von gelbehexe
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