2010-05-20 19 views
21

pelusa produce alguna advertencia como:g ++ Como llegar advertencia en ignorar el valor devuelto por una función

foo.c XXX Warning 534: Ignoring return value of function bar() 

Desde la pelusa manual

534 Ignorando valor de retorno de la función

'Símbolo' (comparar con la ubicación) Una función que devuelve un valor es llamado solo para los efectos secundarios como, por ejemplo , en un st por sí mismo o en el lado izquierdo de un operador de coma . Pruebe: función (vacía)(); a invoque una función e ignore su valor de retorno . Vea también los indicadores fvr, fvo y fdr en §5.5 "Opciones de bandera".

Quiero recibir esta advertencia, si existe, durante la compilación. ¿Hay alguna opción en gcc/g ++ para lograr esto? Había activado -Wall pero aparentemente no detectó esto.

Respuesta

22

Gracias a WhirlWind y paxdiablo por la respuesta y el comentario. Aquí está mi intento de juntar las piezas en una respuesta completa (?).

-Wunused-resultes la opción correspondiente de gcc. Y está activado de manera predeterminada. Citando de gcc warning options page:

-Wno-unused-result

No indican si una persona que llama de una función marcada con el atributo warn_unused_result (ver Variable Attributes) no utiliza su valor de retorno. El valor predeterminado es -Wunused-result

Por lo tanto, la solución es aplicar el atributo warn_unused_result en la función.

Aquí hay un ejemplo completo. El contenido del archivo unused_result.c

int foo() { return 3; } 

int bar() __attribute__((warn_unused_result)); 
int bar() { return 5; } 

int main() 
{ 
    foo(); 
    bar(); /* line 9 */ 
    return 0; 
} 

y correspondiente resultado de la compilación:

$gcc unused_result.c 
unused_result.c: In function ‘main’: 
unused_result.c:9: warning: ignoring return value of ‘bar’, declared with attribute warn_unused_result 

Nota vez más que no es necesario tener resultado -Wunused-ya que es por defecto. Uno puede tener la tentación de mencionarlo explícitamente para comunicar el intento. Aunque ese es un intento noble, pero después de analizar la situación, mi elección, sin embargo, sería en contra de eso.Porque tener -Wunused-result en las opciones de compilación puede generar una falsa sensación de seguridad/satisfacción que no es cierta a menos que todas las funciones en la base de código estén calificadas con warn_unused_result.

5

-Wunused-result debe hacer esto para usted. Esto no es una de las advertencias -Wall prende:

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

La función tiene que tener el atributo warn_unused_result que se le aplica (Gracias paxdiablo).

+8

+1, pero tenga en cuenta que la función debe tener el atributo warn_unused_result aplicado. – paxdiablo

4

Las respuestas sobre el uso de __attribute__((warn_unused_result)) son correctas. ¡Sin embargo, GCC no es tan bueno en esta funcionalidad! Tenga en cuenta: no avisará para tipos que no sean POD. Eso significa, por ejemplo, que si devuelve una clase con un destructor (o una clase con variables de instancia con destructores) nunca verá una advertencia sobre ignorar el resultado.

fallo relevante: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66177

Ejemplo en el que se produce un error:

struct Error { 
~Error(); 
}; 

__attribute__((warn_unused_result)) Error test(); 

int main() 
{ 
    test(); 
    return 0; 
} 

Por lo tanto, no dependen de esto para los tipos de retorno que no son bastante simples.

+0

algunas bugzillas relevantes adicionales: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=38172 y https://gcc.gnu.org/bugzilla/show_bug.cgi?id=46643 – pestophagous

0

me solucionó el problema como este:

#define ignore_result(x) if (x) {} 

entonces en vez de (void)foo() uso ignore_result(foo())

A continuación, el código se compila con -Wall bien.

Cuestiones relacionadas