tutorial smart remix programador online español curso c++ gcc g++ return-value compiler-warnings

c++ - smart - g++ Cómo obtener una advertencia al ignorar el valor de retorno de la función



smart contracts ethereum (5)

la pelusa produce una advertencia como:

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

Del manual pelusas manual

534 Ignorando el valor de retorno de la función

''Símbolo'' (comparar con la ubicación) Una función que devuelve un valor se llama solo para efectos secundarios como, por ejemplo, en una declaración por sí misma o en el lado izquierdo de un operador de coma. Prueba: (void) function (); para llamar a una función e ignorar su valor de retorno. Consulte también los indicadores fvr, fvo y fdr en §5.5 "Opciones de indicador".

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



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

-Wunused-result es la opción gcc relevante. Y está activado de forma predeterminada . Cotizando desde la página de opciones de advertencia de gcc :

-Wno-unused-result

No avise si un llamador de una función marcada con el atributo warn_unused_result (consulte Atributos de variable ) no utiliza su valor de retorno. El valor predeterminado es -Wunused-result

Entonces, 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 el 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

Tenga en cuenta de nuevo que no es necesario tener el resultado -Wunused- ya que es predeterminado. Uno puede estar tentado a mencionarlo explícitamente para comunicar la intención. Aunque es una noble intención, pero después de analizar la situación, mi elección, sin embargo, estaría en contra de eso. Debido a que tener -Wunused-result en las opciones de compilación puede generar un falso sentido de seguridad / satisfacción que no es cierto a menos que todas las funciones en la base del código estén calificadas con warn_unused_result .


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 advertirá para los tipos que no son POD. Eso significa que, por ejemplo, si devuelve una clase con un destructor (o una clase con variables de instancia con destructores) nunca verá una advertencia sobre ignorar el resultado.

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

Ejemplo donde falla:

struct Error { ~Error(); }; __attribute__((warn_unused_result)) Error test(); int main() { test(); return 0; }

Por lo tanto, no confíe en esto para los tipos de devolución que no son muy simples.


Resolví el problema así:

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

entonces en lugar de (void)foo() use ignore_result(foo())

Luego el código se compila con -Wall bien.