2012-03-29 12 views
16

He buscado un poco para obtener información sobre esto, pero no encontré nada satisfactorio. ¿Hay algún comportamiento especial en la función llamada¿Por qué gcc -Wall da una advertencia sobre la cadena de formato de longitud cero?

sprintf(someString, ""); 

que explica por qué esto es una advertencia (en gcc con -Wall)? Solo logré encontrar que el estándar C permite cadenas de formato de longitud cero.

He probado el siguiente ejemplo

#include <stdio.h> 

int main() 
{ 
    char str[2] = {'a', 'a'}; 
    sprintf(str, ""); 
    printf("\'%c\'\'%c\'\n", str[0], str[1]); 
    return 0; 
} 

que imprime

'''a' 

que es exactamente lo que esperaba ver. Entonces, ¿por qué la advertencia?

+2

No entiendo dónde encontraste la implicación de que C++ no ... –

+1

Tienes razón, pensé que era el caso al principio porque estaba compilando el código con g ++, pero ahora veo que gcc da la misma advertencia – SirGuy

+0

Ah, y en caso de que alguien se pregunte, tropecé con este código accidentalmente, no lo escribí yo mismo – SirGuy

Respuesta

22

El hecho de que GCC emita una advertencia generalmente no tiene nada que ver con si el constructo es legal C, sino si los desarrolladores de GCC lo consideran una indicación probable de que usted quiso decir algo diferente de lo que escribe, o simplemente un mal estilo. He aquí algunos ejemplos:

  • if (x = 0) - que es casi seguro que significaba if (x == 0).
  • printf(str) - seguramente se refería a fputs(str, stdout) o printf("%s", str); como está escrito, el código es muy peligroso.
  • if (foo == bar & MASK) - seguramente se refería a if (foo == (bar & MASK)).

etc.

En su caso, creo que GCC está cuestionando por qué estás llamando sprintf(String, "") hacer el equivalente de String[0]=0; (este último es mucho más corto, más rápido y más claro).

+1

Estoy de acuerdo en que sería mejor, simplemente no sé si hay más razones que eso para considerarlo una advertencia. Ciertamente no soy una autoridad, pero no pensé que esta ofensa particular a una programación razonable se hubiera considerado de advertencia – SirGuy

+3

Estoy de acuerdo, pero GCC hace cosas mucho más molestas con las advertencias. Esta es definitivamente una ofensa menor.Una más grande está dando advertencias sobre los argumentos de las funciones no utilizadas, lo cual es * inevitable * siempre que utilice punteros de función que deben ajustarse a una firma en particular. –

+0

Huh, nunca antes había tenido esa advertencia, y he tenido esa situación en – SirGuy

4

Es simplemente una advertencia de GCC. Si desea suprimirlo durante una parte de su solicitud, puede hacer lo siguiente:

#pragma GCC diagnostic ignored "-Wformat-zero-length" 
int main() 
{ 
    // code that produces a warning 
} 
#pragma GCC diagnostic warning "-Wformat-zero-length" 
+1

Sé que puedo deshacerme de él, me preguntaba por qué estaba allí para comenzar con – SirGuy

+5

. Creo que es solo una advertencia sin sentido y dañina. Definitivamente podría morder el código donde la cadena de formato sea de longitud cero o no trivial dependiendo de la definición/valor de la macro del preprocesador, y dicho código parece perfectamente razonable. –

+3

No es dañino. Solo te hace saber que hay algo cuestionable sobre tu código, que podrías haber cometido un error. Aunque 'sprintf (str," ");' es legal, es una forma bastante redonda de hacer que _str_ sea una cadena de longitud cero, y podría indicar un error lógico en el código. No está prohibido; solo traído a su atención. –

6

que está recibiendo la advertencia porque gcc sabe que el segundo argumento de sprintf() debe ser una cadena no vacía, por lo general uno con varias especificaciones de formato: una llamada funcionalmente equivalente y "más legal" a la que está haciendo en su código sería sprintf(str, "%s", ""). Además, casi siempre hay de uno a N argumentos adicionales, suficientes para cumplir con las especificaciones de formato. Como lo está usando aquí, lo está usando como una clase de strcpy(), que, aunque es técnicamente válida, es una forma muy extraña de usar la biblioteca estándar.

Cuestiones relacionadas