2009-01-24 18 views
22

me sale esta advertencia de GCC:¿Se produce un error en una advertencia de gcc?

warning: cannot pass objects of non-POD type 'class Something' through '...'; call will abort at runtime

es bastante mortal, sobre todo porque se llama un aborto. ¿Por qué no es esto un error? Me gustaría que sea un error, pero:

  1. ¿Cómo puedo hacer que un aviso específico sea un error?
  2. ¿Qué advertencia es? De acuerdo con http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html, -Wno-invalid-offsetof se parece a la bandera de ocultarlo, pero no es así
+3

Afortunadamente, las versiones modernas de GCC (al menos 4.6.3, pero probablemente antes) le permiten saber qué indicador de advertencia activó una advertencia en particular. Por ejemplo: 'main.cpp: 12: 15: error: división por cero [-Werror = div-by-zero]' –

+0

Y esa es una característica tan maravillosa. – hlovdal

Respuesta

22

No estoy seguro de lo que es la advertencia correcta, pero una vez que lo ha encontrado, puede cambiar su disposición con el siguiente (usando 'formato' como el ejemplo):

#pragma GCC diagnostic error "-Wformat" 

O como señala Strager a cabo:

gcc -Werror=format ... 

Editar: he acaba de comprobar la fuente de gcc para esto y esta advertencia específica no se puede desactivar a través de indicadores de línea de comando.

3

Puede usar el indicador del compilador -Werror para convertir todas las advertencias o algunas en errores.

6

Parece que hay un montón de otras advertencias que no quiere que se conviertan en errores (utilizando el indicador -Werror). En general, es una buena práctica corregir todas las advertencias. Usar -Werror fuerza esto.

+0

Amén, su código debe ser libre de advertencias con al menos -Wall (aunque algunas de las cosas que los informes de -Wextra son excusables, por ejemplo, variables/parámetros no utilizados). –

+1

Puede hacer -Wall -Wextra -Wno-unused-parameters -Wno-unused-functions ... Cualquier advertencia específica se puede deshabilitar con la sintaxis -Wno- $ foo, lo que hace que sea fácil excusar los detalles. Lamentablemente, no ayuda con ningún subconjunto de las advertencias -pedantes. – Tom

+0

Las advertencias no son errores para ser "corregidos". Y el código de advertencia es un concepto difícil de alcanzar, a menos que arregle la versión del compilador. Ver también [Tidbits: Por el amor de Dios, no use -Werror!] (Http://blog.schmorp.de/2016-02-27-tidbits-for-the-love-of-god-dont- use-werror.html). – Ruslan

10

-Werror=specific-warning convertirá el -Wspecific-warning especificado en un error en GCC 4.3.xo posterior. En 4.1.2, solo funciona -Werror-implicit-function-declaration. Tenga en cuenta el guión en lugar del signo igual: funciona solo para ese caso específico y no para otros. Esta es una de las advertencias comunes más serias y definitivamente es útil convertirla en un error.

Aparte de eso, las versiones anteriores de GCC solo parecen proporcionar el mazo -Werror de hacer que cada advertencia sea un error.

2

Puede usar -fdiagnostics-show-option para ver la opción -W que se aplica a una advertencia en particular.

Desafortunadamente, en este caso no hay una opción específica que cubra esa advertencia.

Parece que habrá un mejor soporte para esto en gcc-4.5.

Cuestiones relacionadas