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()
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ó.
Desde C ++ 17 puede usar el atributo [[nodiscard]]
.
Ejemplo:
[[nodiscard]] int bar() {
return 42;
}
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.
-Wunused-result
debe hacer esto por ti. Esta no es una de las advertencias.
http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
La función debe tener el atributo warn_unused_result aplicado (Gracias paxdiablo).