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