snprintf Fehler. Argument für sizeof ist dasselbe wie destination

gcc 4.8 gib mir einen fehler wenn ich baue

#include <string.h>
#include <stdio.h>

static inline void toto(char str[3])
{
    snprintf(str, sizeof(str), "XX"); 
}

int main(){
    char str[3]; 
    toto(str);
    return 0;
}

Hier ist der GCC-Fehler

Fehler: Argument für "sizeof" im "snprintf" -Aufruf ist der gleiche Ausdruck wie das Ziel. Wollten Sie eine explizite Länge angeben?

Hinweis: Ich verwende -Wall -Werror-Flags, die Warnungen in Fehler konvertieren.

Hier gibt es etwas Ähnliches In einem Kommentar hat jemand darauf geantwortet

"Für Puffer mit fester Länge verwende ich normalerweise strncpy (dest, src, sizeof (dest)); dest [sizeof (dest) -1] = '\ 0'; Das garantiert die NULL-Terminierung und ist nur weniger mühsam als snprintf, ganz zu schweigen davon dass viele Leute snprintf (dest, sizeof (dest), src) verwenden, stattdessen und sind sehr überrascht, wenn ihre Programme willkürlich abstürzen. "

Aber das ist falsch: gcc 4.8 sagen

"Fehler: Argument zu" sizeof "in" strncpy "-Aufruf ist der gleiche Ausdruck wie das Ziel. Wollten Sie eine explizite Länge angeben? [-Werror = sizeof-pointer-memaccess]"

In der Dokumentation zu gcc 4.8 wird über dieses Problem gesprochen: man sagt:

Das Verhalten von -Wall hat sich geändert und enthält nun das neue Warnflag -Wsizeof-pointer-memaccess. Dies kann zu neuen Warnungen im Code führen, die sauber mit früheren Versionen von GCC kompiliert wurden.

Zum Beispiel,

include string.h

struct A { };

int main(void) 
{
    A obj;
    A* p1 = &obj;
    A p2[10];

    memset(p1, 0, sizeof(p1)); // error
    memset(p1, 0, sizeof(*p1)); // ok, dereferenced
    memset(p2, 0, sizeof(p2)); // ok, array
    return 0;
}

Gibt die folgende Diagnose aus: Warnung: Argument zu "sizeof" in "void" Der Aufruf von memset (void *, int, size_t) ist derselbe Ausdruck wie der des Ziels. Wollten Sie es dereferenzieren? Memset [- Sizeof-Pointer-Memaccess] (p1, 0, sizeof (p1)); // error ^ Obwohl diese Warnungen nicht zu Kompilierungsfehlern führen, wird -Wall häufig in Verbindung mit -Werror verwendet, sodass neue Warnungen in neue Fehler umgewandelt werden. Um dies zu beheben, schreiben Sie entweder neu, um memcpy zu verwenden, oder dereferenzieren Sie das letzte Argument im anstößigen Memset-Aufruf. *

Nun, in ihrem Beispiel ist es offensichtlich, dass der Code falsch war, aber in meinem Fall verstehe ich mit snprintf / strncpy nicht, warum, und ich denke, es ist ein falsch positiver Fehler von gcc. Recht ?

danke für Ihre Hilfe

Antworten auf die Frage(4)

Ihre Antwort auf die Frage