błąd snprintf. argument do sizeof jest taki sam jak cel

gcc 4.8 daje mi błąd podczas kompilacji

#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;
}

Oto błąd gcc

error: argument do „sizeof” w wywołaniu „snprintf” jest tym samym wyrażeniem co miejsce docelowe; czy chciałeś podać wyraźną długość?

Uwaga: Używam flag -Wall -Werror, które konwertują ostrzeżenie na błąd.

Jest tu coś podobnego W komentarzu ktoś na to odpowiedział

„Dla buforów o stałej długości zwykle używam strncpy (dest, src, sizeof (dest)); dest [sizeof (dest) -1] = '0', co gwarantuje NULL zakończenie i jest po prostu mniej kłopotu niż snprintf nie wspominając że wiele osób używa snprintf (dest, sizeof (dest), src), i jest bardzo zdziwiony, gdy ich programy ulegną awarii dowolnie ”.

Ale to jest złe: gcc 4.8 powiedzieć

„error: argument do„ sizeof ”w wywołaniu„ strncpy ”jest tym samym wyrażeniem co miejsce docelowe; czy chodziło o podanie wyraźnej długości? [-Werror = sizeof-pointer-memaccess]”

w dokumentacji gcc 4.8 mówią o tym problemie: Mówią:

Zachowanie -Wall zmieniło się i teraz zawiera nową flagę ostrzegawczą -Wsizeof-pointer-memaccess. Może to spowodować pojawienie się nowych ostrzeżeń w kodzie, które zostały skompilowane z poprzednimi wersjami GCC.

Na przykład,

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;
}

Podaje następujący komunikat diagnostyczny: warning: argument „sizeof” w „void wywołanie memset (void *, int, size_t) jest tym samym wyrażeniem co miejsce docelowe; czy chciałeś to wyrejestrować? [-Wsizeof-pointer-memaccess] memset (p1, 0, sizeof (p1)); // błąd ^ Chociaż te ostrzeżenia nie spowodują niepowodzenia kompilacji, często -Wall jest używany w połączeniu z -Werror, w wyniku czego nowe ostrzeżenia stają się nowymi błędami. Aby naprawić, albo przepisz ponownie, aby użyć memcpy lub wyreferencjonować ostatni argument w naruszającym wywołaniu memset. *

W ich przykładzie jest oczywiste, że kod był błędny, ale w moim przypadku, z snprintf / strncpy, nie rozumiem dlaczego, i myślę, że jest to fałszywy błąd dodatni gcc. Dobrze ?

dzięki za pomoc

questionAnswers(4)

yourAnswerToTheQuestion