gcc 4.8 mi danno un errore quando ho costruireerrore snprintf. argomento per sizeof è la stessa come meta
#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;
}
Qui è l'errore gcc
errore: argomento 'sizeof' a chiamata 'snprintf' è il stessa espressione della destinazione; intendevi fornire una lunghezza esplicita?
Nota: utilizzo i flag -Wall -Werror che convertono l'avviso in errore.
There is something similar here In un commento, qualcuno ha risposto questo
"per i buffer di lunghezza fissa, io di solito uso strncpy (dest, src, sizeof (dest)); dest [sizeof (dest) -1] = ' \ 0 '; Ciò garantisce la terminazione NULL ed è meno problematico di snprintf, senza contare che molte persone usano snprintf (dest, sizeof (dest), src) e invece sono molto sorpresi quando i loro programmi si bloccano in modo arbitrario. "
Ma questo è sbagliato: gcc 4.8 dicono
"errore:? Argomento 'sizeof' a chiamata 'strncpy' è la stessa espressione come destinazione; Cercavi per fornire una lunghezza esplicita [ -Werror = sizeof-pointer-MemAccess]"
in gcc 4.8 documentation, they are talking about this issue: dicono:
il comportamento di -Wall è cambiato e ora include la nuova bandiera di avvertimento -Wsizeof-p ointer-MemAccess. Ciò potrebbe comportare nuovi avvertimenti nel codice compilati in modo pulito con le versioni precedenti di GCC.
Per esempio,
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;
}
ha pronunciato la seguente diagnosi: avvertimento: argomento 'sizeof' in 'vuoto memset (void *, int, size_t)' chiamata è la stessa espressione come il destinazione; intendevi dereferenziarlo? [-Wsizeof-pointer-memaccess] memset (p1, 0, sizeof (p1)); // error ^ Sebbene questi avvisi non causino errori di compilazione, spesso viene utilizzato WALL in combinazione con -Werror e, di conseguenza, i nuovi avvisi vengono trasformati in nuovi errori. Per correggere, o riscrivere per utilizzare memcpy o dereferenziare l'ultimo argomento nella chiamata memset offendente. *
Bene, nel loro esempio, è ovvio che il codice era sbagliato, ma nel mio caso, con snprintf/strncpy, Non vedo perché, e penso che sia un errore falso positivo di gcc. Destra ?
grazie per il vostro aiuto
Stranamente, la documentazione per '-Wsizeof-pointer-memaccess' mi fa pensare che ti avvertirebbe se avessi scritto' char * str' nel tuo primo esempio, ma che non dovrebbe avvisare per 'char str [3 ] '. – hobbs
con g ++, non ho ricevuto alcun errore. – PersianGulf
Con gcc 4.8.1, non è stato possibile riprodurre l'avviso. Sicuramente stai usando 'char str [3]' e non 'char * str'? –